핀포인트 설치 - docker
오랜만에 확인해보니 버전이 3.x로 업그레이드 되며 hbase 1.x대의 지원을 종료하고 2.x대를 모듈 없이도 사용가능하게 바꼈다.
도커를 통해서 간편하게 설치하고 설정 파일만 만져서 pinpoint를 운영할 수 있다는 생각이 드니 우선 도커를 통해 핀포인트를 설치해보자
공식문서 를 보면 알겠지만 정말 간단하다..
git clone <https://github.com/pinpoint-apm/pinpoint-docker.git>
cd pinpoint-docker
docker-compose pull && docker-compose up -d
그저 git 소스를 받아서 pull 하고 도커를 올리면 끝이다 ..!
근데, 문제가 생겼다.
failed to register layer: write /opt/flink/opt/flink-oss-fs-hadoop-1.18.1.jar: no space left on device
즉 디스크 여유 공간이 부족하다고 한다..
df -u
디스크 용량을 위 명령어로 확인해보니 이미 70% 넘게 사용하고 있었다..
그래도 설치가 불가능하진 않을 것 같아 여기를 참고해서 로그 용량을 줄인 후
계속해서 pull을 땡겨보니
어찌저찌 설치가 됐다.
이제 컨테이너를 띄워보면
아주 힘겹게 올라간 모습을 확인할 수 있다.
그런데.. 기본으로 pinpoint web이 8080으로 올라간다고 해서 curl을 찍어보니
curl localhost:8080
curl: (56) Recv failure: Connection reset by peer
응답이 없다.
그리고 다 띄워진 이후부터 터미널이 많이 버벅이기 시작했다;
메모리가 터지기 직전이고
디스크도 많이 아파하고 있다.
어차피 변경이 잦은 친구도 아니고 gcp에 카프카도 돌려야 하니 그냥 직접 필요 기능만 설치해서 실행시키는 방식으로 변경해보자
이곳을 참고해서 도커를 싹 지우고 디스크를 확인해보면
이제 좀 쾌적해졌다..! 이제 필요 기능만 직접 설치해보자
Pinpoint 설치 - 직접 실행
공식 가이드 따라서 쭉 진행해보자
우선 hbase를 다운받아주자
wget <https://dlcdn.apache.org/hbase/2.6.0/hbase-2.6.0-bin.tar.gz>
tar xzvf hbase..
압축을 풀고
cd hbase ~
./bin/start-hbase.sh
hbase를 켜준 후
스키마 생성 스크립트를 실행해준다.
./bin/hbase shell ./hbase-create.hbase
vm에서 돌리니 영겁의 세월이 걸렸다 (맥에서 돌리니 1초도 안걸렸다)
- 결국 직접 shell 에서 create문을 나누어서 입력해주니 생각보다 빠르게(1~2초) 테이블들이 쭉쭉 생성되었다;
번외
- pricing tab에서 조회해보니 data transfer 용으로 비용이 잡히길래 이게 원인인가했는데 알고보니 1기가 까진 무료라서 청구 안되고 나는 Balance PD (디스크 유연함)을 사용하고 있어서 청구되고 있었다고 한다.You do not have to worry about the Network Inter Region Data Transfer Out from Americas to Los Angeles since our Always Free Tier usage limit comes with 1 GB of outbound data transfer from North America to all region destinations (excluding China and Australia) per monthOh I got it9:49 PMThen, Balance PD was the only reason why I got chaged and my new compute engine is using Standard PD so I will not charged anymore. right ??9:50 PM
- That is correct
- Google Cloud Support, Glenn
- And base on your account usage, your account has not exceeded the 1GB of outbound data transfer
- Google Cloud Support, Glenn
- 9:48 PM
- 그래서 인스턴스를 고정 30기가로 바꾸고 돌렸고 이것도 확실하게 물어보니 그렇다고 한다 !
- gcp 인스턴스가 너무 느려서 일단 지우고 안그래도 왜 짜잘하게 계속 금액이 청구되는 지 궁금했던 터라 지원팀에 문의를 해봤다
그런데.. 결국 kafka와 pinpoint 까지 띄우기엔 swap영역 메모리를 2기가 잡아줘도 인스턴스가 버텨내질 못했다
결국.. 다른 구글 계정으로 3개월 크레딧을 받아 n2d-standard-4 인스턴스를 만들고 우선 pinpoint는 여기에 설치해서 운영하기로 했다..!
여튼.. 이제 핀포인트를 띄워보자
java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-~~
java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-web~~
컬렉터와 웹을 띄웠다면 이제 포트를 열고 웹을 들어가보자
여기서 collector가 agent에게 데이터를 받아오는 포트가 default로는 9991~9993 이고 web은 8080이 default이기에 모두 다 열어주자
그리고 web을 들어가보면
아직 agent를 연동하지 않았으니 서버는 뜨지 않지만 정상적으로 접근이 되는 것을 알 수 있다.
BE서버에 Pinpoint agent 붙이기
be서버들은 docker로 띄워져 있으니 docker에 agent를 붙여넣어야 한다
wget <https://repo1.maven.org/maven2/com/navercorp/pinpoint/pinpoint-agent/3.0.0/pinpoint-agent-3.0.0.tar.gz>
먼저 agent 받고 압축풀어주고
vi ./profiles/release/pinpoint.config
설정 파일을 열어서
profiler.transport.grpc.collector.ip=mointoring server ip
profiler.sampling.counting.sampling-rate=1
컬렉터를 연결해주고 요청 전체를 로깅하기 위해 sampling-rate를 1로 설정해준다.
이제 이 폴더를 도커 컨테이너에 마운트 시켜주고
volumes:
- ./pinpoint-agent-3.0.0:/pinpoint-agent
추가로 환경변수를 하나 넣어주자
environment:
PINPOINT_AGENT_ID: ${PINPOINT_AGENT_ID}
여기서, 해당 환경변수를 넣는 방식은 여러가지지만 나는 docker-compose.yml과 동일 경로에 .env 파일을 만들어 환경변수를 넣어줬다.
.env
PINPOINT_AGENT_ID=be-1 #be2인스턴스에선 be-2
Additionally, Pinpoint Agent requires 2 command-line arguments in order to identify itself in the distributed system:
- Dpinpoint.agentId - uniquely identifies the application instance in which the agent is running on
- Dpinpoint.applicationName - groups a number of identical application instances as a single service
공식문서를 보면 알 수 있듯이 각 서버가 주는 정보를 구별해야 web에서 구분이 되니
agentID라는 하나의 에이전트마다 유니크한 값을 가져야 하며
applicationName으로 여러 동일한 어플리케이션을 하나처럼 그룹지어줄 수 있게 된다.
현재 2개의 인스턴스에서 백엔드 서버가 돌아가니 각 인스턴스에 환경변수로 agentID를 잡아주고 applicationName을 동일하게 가져가 하나의 어플리케이션 (메인 백엔드서버) 역할임을 나타내 주자.
여기서, 서버 실행시점에 넘겨주는 agentID와 applicationName은 Dockerfile에서 작성하여 넘겨줘야하지만
CMD ["java", "-jar", "-javaagent:/pinpoint-agent/pinpoint-bootstrap-3.0.0.jar", "-Dpinpoint.agentId=${PINPOINT_AGENTID}","-Dpinpoint.applicationName=Main-Backend","app.jar"]
즉 위와같이 전달을 해줘야 하지만 이 방식에는 큰 문제가 있다.
이렇게 되면 도커파일을 빌드하는 시점에 환경 변수가 대입되고 결정되게 되는데 현재 작성되어 있는 워크플로우 파일에선 하나의 도커 빌드 파일로 be1,be2 각각에서 pull 하여 컨테이너를 실행하는 구조다.
따라서, 이를 위해선 빌드 시점에 옵션으로 환경변수 값을 넣어서 줘야 하는데 그렇게 되면 서버별로 빌드를 해줘야 한다..
보다 좋은 방법이 있을 것 같아 실행시점에 환경변수를 넘기고 이를 사용하는 방법을 찾다보니
빌드 시점에 해당 값을 넣을 필요 없이 실행파일을 만들고 해당 실행파일에 환경 변수를 포함한 실행 스크립트를 짜면 빌드 시점이 아닌 실행 시점에 환경 변수가 주입될테니 원하던 조건에 부합할것이라 생각됐다.
그럼 이제 실제로 되는 지 만들어보자
#!/bin/sh
java -jar -javaagent:/pinpoint-agent/pinpoint-bootstrap-3.0.0.jar \\
-Dpinpoint.agentId=${PINPOINT_AGENT_ID:-NoAgentId} \\
-Dpinpoint.applicationName=Main-Backend \\
app.jar
Dockerfile
...
COPY entrypoint.sh /be/entrypoint.sh
RUN chmod +x /be/entrypoint.sh
ENTRYPOINT ["/be/entrypoint.sh"]
이렇게 entrypoint.sh 를 실행하는 방식으로 도커파일을 바꿔주면 끝이다.
이제 배포하고 pinpoint-web을 확인해보면
설정했던 ApplicationName에 등록했던 agentID 대로 잘 잡혀오는 것을 확인할 수 있다.
정리하자면
Pinpoint는 크게 agent, collector, web, hbase.. 정도로 구성되고 (물론, Pinot도 있다)
hbase를 collector와 web의 백엔드 저장소로 활용하여 동작하고
각 agent에서 뽑아오는 데이터를 collector가 수집하고 이를 정제하여 web에서 우리가 쉽게 볼 수 있게 해준다.
그리고 나는 이를 위해 모니터링 인스턴스에 hbase, collector, web을 설치하였고 이를 백엔드 서버와 연결하기 위해 백엔드 서버에 agent를 달아주었다.
여러 인스턴스의 서버에 agent를 달아 web에 표출하기 위해 docker의 환경변수를 이용했고 이를 통해서 하나의 어플리케이션 안에 여러 서버를 등록할 수 있게 되었다.
참고
https://github.com/pinpoint-apm/pinpoint?tab=readme-ov-file
https://pinpoint-apm.gitbook.io/pinpoint/getting-started/installation#id-6.-pinpoint-agent
https://velog.io/@as9587/Pinpoint-설치하기4
https://github.com/heowc/programming-study/issues/90
https://seongjin.me/environment-variables-in-docker-compose/
'Gyunpang' 카테고리의 다른 글
10. pinpoint inspector를 전부 달아보자 (1) | 2024.11.09 |
---|---|
프로젝트 구조 중간점검 (0) | 2024.07.27 |
8. Gateway 로깅 및 인증 기능 구현하기(2) (0) | 2024.07.23 |
7. Gateway 로깅 및 인증 기능 구현하기(1) (1) | 2024.07.23 |
(번외) docker container scale 조정 시 github action에서만 recreate된다.. (0) | 2024.04.13 |