본문 바로가기
Project/StyleLab

StyleLab의 네 번째 노트: APM Pinpoint

by 규난 2023. 12. 21.
728x90

개발자는 애플리케이션 성능을 모니터링하고 분석하여 사용자에게 더 나은 서비스를 제공해야 하며, 문제가 발생했을 때 빠르게 대응할 수 있어야 합니다. 이러한 작업을 도와주는 도구를 Application Performance Management라고 합니다. 이번 글에서는 Pinpoint를 적용한 경험을 공유해 보도록 하겠습니다.

 

목차

  1. Pinpoint란?
  2. Pinpoint architecture
  3. HBase 설치
  4. Pinpoint collector, Pinpoint Web UI 설치
  5. Pinpoint Agent 설치
  6. reference

 

1. Pinpoint란?

java/php로 작성된 대규모 분산 시스템의 트랜잭션을 추적하여 시스템의 전체 구조와 서로 어떻게 연결되어 있는지 실시간으로 분석하는 데 도움이 되는 APM(Application Performance Management) 도구입니다.

pinpoint는 리소스의 증가량이 3% 밖에 되지 않기 때문에 애플리케이션 성능에 거의 영향을 미치지 않으며, pinpoint를 사용 시 얻을 수 있는 이점은 다음과 같습니다.

 

ServerMap

분산 시스템의 구성 요소가 서로 어떻게 연결되어 있는지 시각화되어 있으며 노드를 클릭하면 현재 상태, 트랜잭션 수 등 해당 구성 요소에 대한 세부 정보를 볼 수 있습니다.

 

Realtime Active Thread Chart

애플리케이션 내부의 활성 스레드를 실시간으로 모니터링할 수 있습니다.

 

Request/Response Scatter Chart

시간 경과에 따른 요청 수와 응답 패턴을 시각화하여 잠재적인 문제를 파악할 수 있으며 차트 위로 드래그하여 트랜잭션을 선택하면 추가 세부 정보를 확인할 수 있습니다.

 

CallStack

분산 환경의 모든 트랜잭션에 대한 코드 수준의 가시성을 확보하여 병목 현상과 장애 지점을 파악할 수 있습니다.

 

Inspector

CPU 사용량, 메모리/가비지 컬렉션, TPS, JVM arguments 등 애플리케이션에 대한 추가 세부 정보를 볼 수 있습니다.

 

2. Pinpoint architecture

pinpoint architecture

 

pinpoint의 architecture를 보시면 크게 Pinpoint Agent, Pinpoint Collector, Pinpoit Web UI, HBase Storage로 구성되어 있는 것을 보실 수 있습니다. 각 역할은 다음과 같습니다.

 

Pinpoint Agent

애플리케이션 코드에 삽입되는 모듈로, 애플리케이션의 실행 시간 동안 발생하는 다양한 데이터를 수집하여 Pinpoint Collector로 전송되어 중앙 집중식으로 저장되고 분석됩니다.

 

Pinpoint Collector

Pinpoint Collector는 Pinpoint Agent로부터 수집된 데이터를 수신하여 HBase와 같은 저장소에 저장하는 역할을 합니다.

 

Pinpoint Web UI

Pinpoint Web UI는 사용자가 Pinpoint에서 수집한 데이터를 시각화하고 분석할 수 있는 웹 인터페이스를 제공합니다. 이를 통해 사용자는 애플리케이션의 성능에 대한 인사이트를 얻고 문제를 식별할 수 있습니다.

 

HBase Storage

Pinpoint은 분산형 NoSQL 데이터베이스인 HBase를 사용하여 수집된 데이터를 저장하고 필요한 경우에는 검색 및 분석할 수 있도록 합니다.

 

HBase Pinpoint Agent, Pinpoint Collector, Pinpoit Web UI를 설치하는 서버의 환경은 Oracle-Linux-8.8 환경에서 진행하였습니다.

 

pinpoint를 설치하기 위해 자바를 필수로 설치해야 하므로 공식 문서를 참고해서 사용하려는 pinpoint의 버전에 맞는 자바를 꼭 설치해 주시기 바랍니다.

 

3. HBase 설치

가장 먼저 수집된 데이터를 저장하고 검색하는 데 사용되는 HBase를 설치해 보도록 하겠습니다.

2.x.x 버전으로 releases된 pinpoint의 기본 HBase 버전은 1.x 버전이므로 1.2.7 버전을 설치하도록 하겠습니다. (HBase download 경로, HBase 버전 별 호환 가능한 자바 버전)

# HBase 1.2.7 tar download
$ wget https://archive.apache.org/dist/hbase/1.2.7/hbase-1.2.7-bin.tar.gz -P /home/opc
$ tar xvfz hbase-1.2.7-bin.tar.gz

# 설치한 hbase 디렉터리로 이동
$ cd /hbase-1.2.7

# hbase table scrpit 다운로드
$ wget https://github.com/pinpoint-apm/pinpoint/archive/refs/tags/v2.5.3.tar.gz
$ tar xvfz v2.5.3.tar.gz

# habse create table script 실행
$ ./bin/hbase-1.2.7 shell ./pinpoint-2.5.3/hbase/scripts/hbase-create.hbase

# hbase 실행
$ ./bin/start-hbase.sh

 

스크립트와 HBase를 실행 후 http://[IP 주소]:16010으로 접속하면 HBase Web UI에 접속하실 수 있습니다.

HBase Web UI에서는 Table, log, Heap 등 많은 정보를 쉽게 조회가 가능합니다.

HBase Web UI

 

 

4. Pinpoint collector, Pinpoint Web UI 설치

Pinpoint Agent로부터 수집된 데이터를 수신하여 HBase에 저장하는 Pinpoint Collector와 수집한 데이터를 시각화하고 분석할 수 있는 웹 인터페이스인 Pinpoint Web UI를 설치해 보도록 하겠습니다.

$ wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.5.3/pinpoint-collector-boot-2.5.3.jar
$ wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.5.3/pinpoint-web-boot-2.5.3.jar

 

 

Pinpoint Collector와 Web UI를 daemon으로 실행시키기 위해 systemd service를 만들어서 사용했습니다.

[Unit]
Description=Pinpoint Web UI Application

[Service]
User=ec2-user
ExecStart=/bin/bash -c "java -Dpinpoint.zookeeper.address=localhost -jar pinpoint-web-boot-2.5.3.jar"
WorkingDirectory=/home/ec2-user

[Install]
WantedBy=multi-user.target

 

[Unit]
Description=Pinpoint Collector Application

[Service]
User=ec2-user
ExecStart=/bin/bash -c "java -Dpinpoint.zookeeper.address=localhost -jar pinpoint-collecto-boot-2.5.3.jar"
WorkingDirectory=/home/ec2-user

[Install]
WantedBy=multi-user.target

 

$ sudo systemctl start pinpoint-web.service
$ sudo systemctl start pinpoint-collector.service

 

5. Pinpoint Agent 설치

애플리케이션의 실행 시간 동안 발생하는 다양한 데이터를 수집하여 Pinpoint Collector로 전송하는 Pinpoint Agent를 설치해 보도록 하겠습니다.

$ wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.5.3/pinpoint-agent-2.5.3.tar.gz
$ tar xvfz pinpoint-agent-2.5.3.tar.gz

$ cd pinpoint-agent-2.5.3

$ vim pinpoint-root.config
profiler.transport.grpc.collector.ip를 pinpoint collector가 설치된 서버 ip로 변경

 

Pinpoint Agent는 애플리케이션 코드에 삽입되는 모듈로 java agent로 실행시켜 Spring boot와 연결시켜줘야 합니다.

Stylelab application도 daemon으로 실행시키기 위해 systemd service를 만들어서 사용했습니다.

[Unit]
Description=StyleLab Application

[Service]
User=root
ExecStart=/bin/bash -c "java \
-Dspring.profiles.active=dev \
-javaagent:/pinpoint-agent-2.5.3/pinpoint-bootstrap-2.5.3.jar \
-Dpinpoint.config=/pinpoint-agent-2.3.3/pinpoint-root.config \
-Dpinpoint.agentId=stylelab-app-01 \
-Dpinpoint.applicationName=stylelab-app \
-jar /stylelab_app/stylelab.jar"
WorkingDirectory=/stylelab_app

[Install]
WantedBy=multi-user.target

 

이제 모든 준비가 끝났으니 application을 실행시켜 잘 동작하는지 확인해 보도록 하겠습니다.

$ sudo systemctl start stylelab.service

 

application을 실행 후 http://[Pinpoint Web UI가 설치된 IP 주소]:8080으로 접속하면 Pinpoint Web UI로 접속하실 수 있습니다.

server map, request/response scatter chart(좌) inspector(우)

 

Server Map에서 Request/Respone Scatter chart의 scatter를 마우스로 드래그하시면 transaction list를 볼 수 있는 페이지로 이동하게 되는데 이 페이지에서 상세한 Call Stack을 보실 수 있습니다. 부하 테스트 시 이 Call Stack을 보고 어느 부분에서 병목 현상이 나타나는지 쉽게 확인할 수 있다는 장점이 있습니다.

transaction list와 call stack

 

 

6. reference

https://github.com/pinpoint-apm/pinpoint

https://pinpoint-apm.gitbook.io/pinpoint/

https://guide-fin.ncloud-docs.com/docs/pinpoint-pinpoint-1-2

728x90