Spring Boot(JDK 17) + Pinpoint 적용

전재준·2023년 9월 15일
4

Pinpoint

목록 보기
1/1
post-thumbnail

Pinpoint란

Pinpoint는 대규모 분산 시스템의 성능을 분석하고 문제를 진단, 처리하는 플랫폼이다.또한 내부적으로 서버맵, 실시간 활성 스레드 차트, 요청 / 응답 차트, API 호출 상세 기록, 서버의 상태를 실시간으로 시각화하여 볼 수 있는 기능을 제공한다

코드를 직접 수정 하지 않고 손쉽게 적용할 수 있는 장점이 있다.

Pinpoint 구성

크게 Pinpoint는 AgentManager 로 나누어진다.

Agent

Pinpoint Agent Spring, PHP, Node 같은 서버에서 모니터링 정보를 수집하여. Manager 서버인 Pinpoint Collector에 정보를 전달한다.

Pinpoint Aget를 실행할 때 javaagent 명령어를 사용하기 때문에 JVM의 실행 중에 애플리케이션의 클래스 로딩 및 실행을 모니터하고 조작할 수 있으며 따로 코드의 수정이 불필요하다.

Manager

Manager 부분은 Pinpoint Collector, HBASE, Pinpoint Web으로 나눠진다.

Pinpoint Collecotr는 Pinpoint Aget에서 전달 받은 정보를 HBASE 데이터베이스로 정보를 전달하는 역활을 한다.

Poipoint Web은 DashBoard라고 생각하면 된다 HBASE에 저장된 데이터를 조회해 시각화 시켜주는 역활을 한다.

Spring Boot + Pinpoint 적용하기

Agent 서버와 Manager 서버가 필요하기 때문에 Manager 서버는 가상머신에 CentOS를 설치해서 사용하고 Agent 는 Mac Local 환경을 이용해 Pinpoint를 적용해 보겠다.

Manager 는 UTM + Rocky Linux 9를 이용해 서버로 사용하고
Pinpint Agent 와 사용할 서버는 Spring Boot Java 17로 사용한다.

HBASE

HBASE 버전은 1.2.X 버전에 가정 최적화 되어있어 1.2.7를 사용한다.가장 최근 버전인 2.6.X 이하 버전을 사용한다면 크게 문제가 없다 자세한건 Pinpoint GitHub를 참고하자.

#wegt 명령어를 이용해 압축파일 다운로드
wget https://archive.apache.org/dist/hbase/1.2.7/hbase-1.2.7-bin.tar.gz

#압축해제
tar xzvf hbase-1.2.7-bin.tar.gz

#hbase 설정파일 확인
vi .../hbase-1.2.7/conf/hbase-env.sh

빨간색 부분 주석처리를 해주지 않으면 HBASE 기동시에 warning 이 발생하므로 주석처리
노란색 부분 HBASE는 JAVA가 설치되어야 하므로 설치 되어있지 않으면 설치 후 자바 경로를 셋팅

정상적으로 설치 후 HBASE를 실행.

cd .../hbase-1.2.7/bin

#Hbase 실행
./start-hbase.sh

#HBase 중지
./stop-hbase.sh

Pinpoint Agent로 받은 데이터들을 담을 테이블을 생성해야 하는데 이미 스크립트가 존재하므로 다운로드 후 실행시켜주자.

# 스크립트 다운
wget https://raw.githubusercontent.com/pinpoint-apm/pinpoint/master/hbase/scripts/hbase-create.hbase

# 스크립트 실행
hbase/bin/hbase shell ../hbase-create.hbase

주의사항

처음 HBASE 를 설치할때 2.X.X 버전 JDK 17를 사용해서 설치했는데 GC 에러가 발생.
CMS garbage collector가 JDK 15에서 제거되었으므로 UseConcMarkSweepGC도 제거되어서 발생한 에러라고 한다. JDK8, 11 로 버전을 내리거나 따로 설정이 필요한 듯 하다. 참고

Unrecognized VM option 'UseConcMarkSweepGC'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Unrecognized VM option 'UseConcMarkSweepGC'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
running master, logging to /hbase-2.2.0/bin/../logs/hbase-root-master-localhost.out
Unrecognized VM option 'UseConcMarkSweepGC'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
: running regionserver, logging to /hbase-2.2.0/bin/../logs/hbase-root-regionserver-localhost.out
: Unrecognized VM option 'UseConcMarkSweepGC'
: Error: Could not create the Java Virtual Machine.
: Error: A fatal exception has occurred. Program will exit.

Pinpoint Collector / Web

Collector와 Web 버전은 Spring boot + JDK 17를 사용할거기 때문에 2.5.1 버전을 사용할 것이다.

#Web
wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.5.1/pinpoint-web-boot-2.5.1.jar

#Collector
wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.5.1/pinpoint-collector-boot-2.5.1.jar

# 실행권한 부여하기
chmod +x pinpoint-collector-boot-2.5.1.jar
chmod +x pinpoint-web-boot-2.5.1.jar

2.4.X 버전 이후로는 자바 버전이 11을 사용해야 하기 때문에 서버 절대경로 자바는 11로 셋팅을 해줬고 HBASE는 자바 8이 깔린 절대경로를 설정해줬다.

#Web 실행
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-web-boot-2.5.1.jar >/dev/null 2>&1 &

#Collector 실행
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.5.1.jar >/dev/null 2>&1 &

nohup 명령어를 사용해서 백그라운드에서 실행되도록 설정해주자. 서버가 에러 없이 잘 실행됐다면 :8080 포트로 Pinpoint Web이 잘 실행된것을 확인 할 수 있다.

Pinpoint Agent

Web, Collector와 마찬가지로 2.5.1로 설치를 진행했다.

# agent 설치
wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.5.1/pinpoint-agent-2.5.1.tar.gz

# 압축 해제
tar xvzf pinpoint-agent-2.5.1.tar.gz

# agnet 설정 파일 수정
vi.../pinpoint-agent-2.5.1/pinpoint-root.config

profiler.transport.grpc.collector.ip 설정에 Manager 서버의 IP를 입력.

Spring Boot + Pinpoint Aent 기동

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/api/test")
    public String Hello() {
        return "String";
    }
}

spring-framework 6 & spring-boot 3.1.3 + JDK17 프로젝트를 만들고 , 테스트 API를 하나 작성 후 로컬 환경에서 기동시킬거기 때문에 Gradle BootJar 명령어를 통해 .jar 파일을 생성하자.

java -javaagent:/Users/jayjeon/Documents/pinpoint-agent-2.5.1/pinpoint-bootstrap-2.5.1.jar \
     -Dpinpoint.agentId=demo \
     -Dpinpoint.applicationName=Test-Server \
     -Dpinpoint.config=/Users/jayjeon/Documents/pinpoint-agent-2.5.1/pinpoint-root.config \
     -jar /Users/jayjeon/IdeaProjects/demo/build/libs/demo-0.0.1-SNAPSHOT.jar

서버를 기동시킬때 Agent 서버와 같이 기동시킬거기 때문에 javaagent 명령어를 통해 .jar파일을 터미널에 입력 후 기동하자.

그러면 Pinpoint가 먼저 뜨고 그 후 Spring이 뜨는 것을 확인 할 수 있다.

주의사항

  • spring-framework 6 & spring-boot 3 를 사용하는데 2.5.0 버전을 사용하면 해당 에러가 발생한다. 해당 에러는 2.5.1버전에러 수정됐다. 참고
"com.navercorp.pinpoint.bootstrap.instrument.InstrumentMethod.addInterceptor(java.lang.Class, java.lang.Object[])" because "doGet" is null...
  • Agent -> Web 으로 모니터링 정보를 요청할 때는 9991, 9992, 9993 포트를 통해 데이터를 전달하기 때문에 Manager 서버에 해당 Port로 방화벽설정이 되어있는지 체크하자.

API 요청

PostMan을 통해 API를 요청하고 Pinpoint Web에 정상적으로 모니터링이 되는지 확인해보자.

Agent를 기동시킬때 applicationName을 Test-Server로 주고 agentId를 demo를 줬는데 정삭적으로 화면에 보이는 것을 확인 할 수 있다.

오른쪽 위에 그래프를 드래그 해보면 Call Stack 정보를 확인할 수 있고, 그 외 CPU 사용량, 메모리 사용량, 스레드 개수 등 정보를 실시간으로 확인 할 수 있다.

참고
https://roopredev.tistory.com/9
https://github.com/pinpoint-apm/pinpoint\
https://tech.trenbe.com/2022/02/22/pinpoint.html
https://stackoverflow.com/

2개의 댓글

comment-user-thumbnail
2024년 2월 29일

덕분에 좋은 정보 잘 보고 갑니다.
감사합니다.

답글 달기
comment-user-thumbnail
2024년 8월 27일

좋은글 감사합니다

답글 달기