티스토리 뷰

  • pinpoint

pinpoint는 application의 프로파일링 정보를 추출하는 Agent와 데이터를 수집하는 Collector, 수집된 데이터를 시각화하는 Web UI, 데이터를 저장하는 HBase로 구성되어있습니다.

 

Agent: 프로파일링이 필요한 애플리케이션 JVM에 java agent 형태로 추가되어 Collector에 프로파일링 정보를 전송

Collector: Agent가 보낸 프로파일링 정보를 수집하고 HBase에 저장

Web UI: 수집된 데이터를 다양한 형태의 정보로 사용자에게 Web을 통해 제공

HBase: 수집된 데이터를 저장하고 조회하는 빅데이터용 데이터베이스

 

  • install

Pinpoint 공식 Github에 보면 Installation guide 와 Quick Installation이 있습니다. 실제 Github에서 clone 받아서 mvnw를 사용하여 build하는방법이 있지만 해당 포스팅에서는 collector와 web은 jar를 가지고와서 실행시키는것으로 테스트를 진행해 보았습니다. 실제 mvnw를 사용하여 war를 빌드해봤는데 아래에서 짧게 공유드리겠습니다.

 

  • JDK 8 install
sudo yum install java-1.8.0-openjdk
sudo yum install java-1.8.0-openjdk-devel
  • home 확인
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.amzn2.0.1.x86_64
  • profile에 적용
[hskim@ip-500-500-500-500 ~]# vi /etc/profile
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.amzn2.0.1.x86_64
pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}

[hskim@ip-500-500-500-500 ~]$ echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.amzn2.0.1.x86_64
  • hbase install

hbase 1.2.7이 collector, web의 2.0.x 버전과 호환되어 해당 버전으로 진행했습니다.

# 핀포인트 2.0.x 버전에 맞는 hbase 버전은 1.2.x
[hskim@ip-500-500-500-500 pinpoint]$ wget http://archive.apache.org/dist/hbase/1.2.7/hbase-1.2.7-bin.tar.gz
--2021-12-07 02:25:41--  http://archive.apache.org/dist/hbase/1.2.7/hbase-1.2.7-bin.tar.gz
Resolving archive.apache.org (archive.apache.org)... 138.201.131.134, 2a01:4f8:172:2ec5::2
Connecting to archive.apache.org (archive.apache.org)|138.201.131.134|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 75830184 (72M) [application/x-gzip]
Saving to: ‘hbase-1.2.7-bin.tar.gz’

100%[====================================================================================================================================================================================>] 75,830,184  10.2MB/s   in 10s

2021-12-07 02:25:52 (6.93 MB/s) - ‘hbase-1.2.7-bin.tar.gz’ saved [75830184/75830184]

#tar 풀기
[hskim@ip-500-500-500-500 pinpoint]$ tar -zxvf hbase-1.2.7-bin.tar.gz
hbase-1.2.7/CHANGES.txt
hbase-1.2.7/README.txt
hbase-1.2.7/conf/

#심볼릭 링크
[hskim@ip-500-500-500-500 pinpoint]$ ln -Tfs /home/hskim/app/pinpoint/hbase-1.2.7/ /home/hskim/app/pinpoint/hbase
  • hbase 설정파일 수정

GC설정 및 옵션 설정합니다.

vi /home/hskim/app/pinpoint/hbase-1.2.7/conf/hbase-env.sh
export HBASE_OPTS="-XX:+UseConcMarkSweepGC"

#너무 작은값을 하면 밀림현상 및 끊김현상이 발생합니다.
export HBASE_HEAPSIZE=61440

#해당 옵션은 java8에서 사용되지 않는옵션이라 주석처리합니다.
#export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
#export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
  • hbase-site.xml 데이터 저장 위치 및 hbase 설정값 적용

원래는 zookeeper, rootdir 위치만 정해놓으면 되는데 해당 옵션을 적용해보니 hbase 성능이슈때문인지 끊김 현상이 조금 발생하여 hbase 튜닝 유명한 포스팅 VCNC 참고(https://engineering.vcnc.co.kr/2013/04/hbase-configuration/)하여 몇가지 넣어서 진행했습니다. 해당 옵션 적용해보니 끊김현상은 없어진거 같은데, 처음 접속할때는 아직 딜레이가 발생하는 현상을 보았습니다.. 더 세심하게 공부해서 튜닝을 진행해야할 것 같습니다ㅠㅠ 참고로 스펙은 r5.large 인스턴스에서 테스트해보았습니다. 각 옵션들의 설명은 위의 포스팅 및 hbase 튜닝 관련한 블로그들에서 정말 상세히 설명이 있기때문에 생략하겠습니다

 

vi /home/hskim/app/pinpoint/hbase-1.2.7/conf/hbase-site.xml
<configuration>
      <property>
          <name>hbase.rootdir</name>
          <value>file:///home/hskim/app/pinpoint/zookeeper</value>
      </property>
      <property>
          <name>hbase.zookeeper.property.dataDir</name>
          <value>/home/hskim/app/pinpoint/hbase/data</value>
      </property>
      <property>
          <name>hbase.regionserver.handler.count</name>
          <value>60</value>
      </property>
      <property>
          <name>hbase.hregion.majorcompaction</name>
          <value>0</value>
      </property>
      <property>
          <name>hbase.hregion.memstore.block.multiplier</name>
          <value>4</value>
      </property>
</configuration>
  • hbase 실행
#hbase 실행
[hskim@ip-500-500-500-500 hbase-1.2.7]$ pwd
/home/hskim/app/pinpoint/hbase-1.2.7
[hskim@ip-500-500-500-500 hbase-1.2.7]$ ./bin/start-hbase.sh
starting master, logging to /home/hskim/app/pinpoint/hbase-1.2.7/bin/../logs/hbase-hskim-master-ip-500-500-500-500.ap-northeast-2.compute.internal.out
  • hbase 스키마 생성 및 실행

pinpoint hbase script인 hbase-create.hbase를 다운받아 hbase-create.hbase 파일을 만듭니다.

#아래 github에서 복사
https://github.com/pinpoint-apm/pinpoint/blob/master/hbase/scripts/hbase-create.hbase

cd /home/hskim/app/pinpoint/hbase-1.2.7/bin

#data 저장 일 변경
vi hbase-create.hbase

:%s/31536000/604800
:%s/5184000/604800

[hskim@ip-500-500-500-500 bin]$ ./hbase shell ./hbase-create.hbase
  • pinpoint collector, web install

위에서 말씀드린대로 jar파일을 가지고와서 실행하겠습니다. 최근 logj4 취약점발견때문에 pinpoint에서도 개선한 버전인 2.3.2로 테스트 진행해보았습니다.

#collector 다운로드
[hskim@ip-500-500-500-500 pinpoint]$ wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.3.2/pinpoint-collector-boot-2.3.2.jar

#collertor 실행
[hskim@ip-500-500-500-500 pinpoint]$ nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.3.2.jar & > /dev/null &

#web 다운로드
[hskim@ip-500-500-500-500 pinpoint]$ wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.3.2/pinpoint-web-boot-2.3.2.jar

#web 실행
[hskim@ip-500-500-500-500 pinpoint]$ nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-web-boot-2.3.2.jar 1> /dev/null 2>&1 &
  • mvnw 사용하여 build

위에처럼 jar파일을 그냥 실행해도 되지만 

 

 

여기까지하면 아래처럼 정상적으로 pinpoint UI를 확인할 수 있습니다.

이제 pinpoint server 구성은 끝났고 agent쪽 셋팅 및 실제 pod를 띄워서 pinpoint server에 잘 나오는지까지 테스트해보겠습니다.

 

  • Kubernetes worknode에 agent 파일 구성

공유볼륨을 쓰지않고 있어 hostpath로 볼륨을 잡아 테스트를 진행했습니다. 일단 worknode에 agent파일을 넣어놓았습니다.

#다운로드
[hskim@ip-500-500-500-500 pinpoint]$ wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.3.2/pinpoint-agent-2.3.2.tar.gz

#tar 풀기
[hskim@ip-500-500-500-500pinpoint]$ tar -zxvf pinpoint-agent-2.3.2.tar.gz
  • pinpoint.config 설정 변경

pinpoint server를 바라볼수있도록 config 설정을 변경합니다.

 

vi /home/hskim/pinpoint/pinpoint-agent-2.3.2/pinpoint-root.config

profiler.transport.grpc.collector.ip=600.600.600.600

위의 root.config에는 아래 옵션이 정상적으로 100% 되어있지만 profiles에 있는 release에는 아래 옵션이 20%나 50%가 default로 되어있습니다. 요 옵션이 20%나 50%으로 되어있으면 request값이 다 안찍힌다고 합니다.(개발자한테 공유받음) 해당 옵션 확인해서 설정하시면 될것 같습니다~

profiler.sampling.rate=1
profiler.sampling.percent.sampling-rate=100
  • deployment manifest 설정

처음에는 spring boot 기반 프로젝트에서 build시에 jvmflag값에 설정을 하고 manifest에도 설정을 해야하는줄 알았는데, manifest에 JAVA_TOOL_OPTIONS로 value값을 지정해주면 해당값으로 옵션이 설정됩니다. volume에는 agent관련 설정이 있는 path와 pinpoint.config가 수정될수있으니 configmap으로 만들었는데 configmap 경로도 volume으로 잡았습니다.

 

아래는 간단하게 만든 manifest 예시 입니다~

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: b-test-api
  namespace: hskim-ns
  labels:
    app: hskim
spec:
  replicas: 1
  selector:
    matchLabels:
      app: b-test-api
  template:
    metadata:
      labels:
        app: b-test-api
    spec:
      containers:
      - name: b-test-api
        image: hskim:831
        resources:
          requests:
            cpu: 500m
            memory: 1000Mi
          limits:
            cpu: 500m
            memory: 1000Mi
        env:
          - name: JAVA_TOOL_OPTIONS
            value: >-
              -javaagent:/mnt/pinpoint-bootstrap-1.8.4.jar
              -Dpinpoint.config=/mnt/config/pinpoint.config
              -Dpinpoint.applicationName=b-test-api
              -Dpinpoint.agentName=b-test-api
              -Dpinpoint.container
        volumeMounts:
          - name: pinpoint-agent
            mountPath: /mnt
          - name: pinpoint-config
            mountPath: /mnt/config
        ports:
        - containerPort: 8080
      volumes:
        - name: pinpoint-agent
          hostPath:
            path: /home/hskim/pinpoint/pinpoint-agent-2.3.2
        - name: pinpoint-config
          configMap:
            name: pinpoint-2.3.2-config

그리고 꼭 위에처럼 configmap 사용하지 않고 아래처럼 env에다 옵션을 줘서 pinpoint.config의 설정값을 수정할 수 있다고 합니다

        env:
          - name: JAVA_TOOL_OPTIONS
            value: >-
              -Dpinpoint.profiler.profiles.active: dev
              -Dprofiler.sampling.percent.sampling-rate=20
  • 배포 및 확인

정상적으로 배포가 되었다면 pod 로그를 봤을때 pinpoint 관련된 설정들이 쭉 나옵니다.

.
.
.
12-17 18:07:54.252 INFO  ProfilePropertyLoader               : load default config:/mnt/pinpoint-root.config
12-17 18:07:54.257 INFO  ProfilePropertyLoader               : active profile:dev
12-17 18:07:54.257 INFO  ProfilePropertyLoader               : load profile:/mnt/profiles/dev/pinpoint.config
12-17 18:07:54.336 INFO  ProfilePropertyLoader               : agent root path:/mnt
12-17 18:07:54.339 INFO  ProfilePropertyLoader               : logConfig path:/mnt/profiles/dev/
12-17 18:07:54.438 INFO  PinpointStarter                     : logPath:/mnt/logs
12-17 18:07:54.438 INFO  PinpointStarter                     : pinpoint version:2.3.2
12-17 18:07:54.438 INFO  PinpointStarter                     : Log directory maxbackupsize=5
12-17 18:07:54.440 INFO  PinpointStarter                     : agent JarPath:/mnt/pinpoint-bootstrap-2.3.2.jar
.
.
12-17 18:07:54.531 INFO  PinpointStarter                     : agent Lib:file:/mnt/lib/
12-17 18:07:54.532 INFO  PinpointStarter                     : agent config:/mnt/pinpoint-root.config
12-17 18:07:54.537 INFO  PinpointStarter                     : defineAgentModule
[com.navercorp.pinpoint.bootstrap.java9.module.ModuleBuilder] bootstrap unnamedModule:unnamed module @5f375618
[com.navercorp.pinpoint.bootstrap.java9.module.ModuleBuilder] platform unnamedModule:unnamed module @27a5f880
[com.navercorp.pinpoint.bootstrap.java9.module.ModuleBuilder] system unnamedModule:unnamed module @1d29cf23
[com.navercorp.pinpoint.bootstrap.java9.module.ModuleBuilder] defineModule classLoader: Java9ClassLoader{name=pinpoint.agent} com.navercorp.pinpoint.bootstrap.java9.classloader.Java9ClassLoader@1f7030a6
[com.navercorp.pinpoint.bootstrap.java9.module.ModuleBuilder] defineModule classLoader-unnamedModule: unnamed module @458c1321
.
.
.
.
.

실제 테스트해보려고 spring boot 프로젝트에 간다한 api 만들어놓고 api 호출해봤을때 pinpoint에도 잘 찍히는걸 확인할 수 있습니다.

 

참고

https://bkjeon1614.tistory.com/662

https://tangoblog.tistory.com/18

'DevOps' 카테고리의 다른 글

고가용성(High Avaliability)  (0) 2022.10.25
AWS EC2 디스크 용량 증설  (0) 2022.05.27
Gitlab root password 변경  (0) 2021.07.07
Mairadb / postgresql SSL  (0) 2021.07.07
Cloud Native Infra / MSA / Kubernetes  (0) 2021.03.25
댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31