티스토리 뷰
- 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설정 및 옵션 설정합니다.
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 튜닝 관련한 블로그들에서 정말 상세히 설명이 있기때문에 생략하겠습니다
<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에도 잘 찍히는걸 확인할 수 있습니다.
참고
'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 |