티스토리 뷰

DevOps

[DevOps] Spring에 Pinpoint 적용하기

roopreDev 2023. 1. 7. 20:52

1. Pinpoint란?


Pinpoint는 네이버에서 만든 대규모 분산 시스템의 성능을 분석하고 문제를 진단, 처리하는 플랫폼 즉 APM (Application Performance Monitoring) 도구 입니다. 또한 내부적으로 서버맵, 실시간 활성 스레드 차트, 요청 / 응답 차트, API 호출 상세 기록, 서버의 상태를 실시간으로 시각화하여 볼 수 있는 기능을 제공합니다. 특히나 요즘 같이 분산환경에서 애플리케이션 모니터링에 최적화된 기능들이 많아 백엔드를 구성하는데 있어 큰 도움을 받을 수 있습니다.

 

2. 구성요소


Pinpoint 구성 요소

Pinpoint는 위와 같이 3가지 모듈인 Pinpoint Agent, Pinpoint Collector, Pinpoint Web으로 이루어집니다.

  • Pinpoint Agent
    • 스프링부트와 같은 애플리케이션의 모니터링 정보(API 상세 호출 내역, 서버 CPU, 활성 스레드 개수 등)을 Collector에 전달합니다.
  • Pinpoint Collector
    • Pinpoint Agent로부터 받은 데이터를 HBase에 적재합니다.
  • Pinpoint Web
    • Hbase에 적재된 데이터를 Web으로 보여줍니다.
Pinpoint는 API 통신 내역을 코드 수준으로 즉, 어떤 메서드를 거쳤는지와 메서드 수행 시간 등을 세세하게 추적하기 때문에 트래픽이 많으면 많을수록 데이터의 양이 폭발적으로 증가합니다. 그래서 Pinpoint는 이러한 정보들을 Hbase에 담아서 활용합니다. 원래는 각 모듈을 별도의 서버에 구축해야하지만 간단하게 프로젝트에 적용하기위해 아래와 같이 구성했습니다.

하나의 Monitoring 전용 인스턴스에 Pinpoint Collector와 Pinpoint Web을 도커를 이용해 띄우고 다른 2개의 어플리케이션에서 도커로 Pinpoint Agent와 함께 띄우는 방식입니다.

 

3. Monitoring 인스턴스 구성하기 (Pinpoint 설치)

ec2는 Amazon Linux로 생성해서 진행했습니다. Agent가 collector로 로그 전송할때 9991~ 9993포트를 이용하기때문에 필수로 열어둬야합니다. 또한 hbase 상태확인하기 위해 16010과 web을위해 8080포트도 열어줍니다.

Hbase 설치하기 

Pinpoint는 Hbase 1.2.X 버전에 최적화되어있어 1.2.7을 설치해줍니다.

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

vi /home/ec2-user/hbase-1.2.7/conf/hbase-env.sh

# 이 옵션을 주석처리 하지 않으면 hbase 실행시 warning 이 뜹니다.
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"

# 매번 hbase-1.2.7 를 입력하기 번거로우니 해당 디렉토리에 link를 걸어서 hbase로 사용하겠습니다.
ln -s hbase-1.2.7 hbase

# hbase 시작
hbase/bin/start-hbase.sh

Pinpoint 정보를 담을 테이블 생성하기

Pinpoint Agent로부터 받은 추적 데이터들을 담을 테이블을 생성해야하는데 이는 스크립트를 다운받아서 적용하면 됩니다.

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

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

 

Pinpoint Collector 설치

같은 Monitoring 인스턴스에 Pinpoint Collector도 설치해줍니다.

# jar 파일 다운로드
wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/pinpoint-collector-boot-2.2.2.jar

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

# 실행
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.2.2.jar >/dev/null 2>&1 &
  • nohup 명령어는 ssh 연결을 종료해도 계속 실행시키도록 즉, 백그라운드에서 실행시킵니다.
    • 단순히 nohup 명령어를 사용하면 nohup.out에 모든 로그가 저장되지만 필요없기 때문에 /dev/null 2>&1 &으로 nohup.out 파일 생성 없이 로그를 저장하지않게 해줍니다.

Pinpoint Web 설치

# jar 파일 다운
wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/pinpoint-web-boot-2.2.2.jar

# 실행 권한 부여
chmod +x pinpoint-web-boot-2.2.2.jar

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

 

4. Pinpoint Agent EC2 구성하기

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

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

# 이동
cd pinpoint-agent-2.2.2

# config 파일 수정
sudo vi pinpoint-root.config

# 앞에서 구성한 monitoring EC2의 ip로 수정해줍니다.
profiler.transport.grpc.collector.ip=pinpoint ip로 변경

 

5. Spring boot와 Pinpoint Agent를 함께 띄우기

아래와 같이 스프링부트의 도커파일을 작성하여 스프링부트 어플리케이션을 도커로 띄우면서 Pinpoint Agent도 함께 띄울 수 있도록 해줍니다.

FROM openjdk:11-jdk
ARG JAR_FILE="build/libs/adventCalendar-0.0.1-SNAPSHOT.jar"
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar","-javaagent:./pinpoint/pinpoint-bootstrap-2.2.2.jar", "-Dpinpoint.agentId=adventcalendarDev","-Dpinpoint.applicationName=adventcalendar","-Dpinpoint.config=./pinpoint/pinpoint-root.config","-Dspring.profiles.active=${SERVER_MODE}","-Duser.timezone=Asia/Seoul", "/app.jar"]
  • applicationName
    • Pinpoint에 연결된 여러 프로젝트 중에 구분짓기위한 ID입니다.
    • 위와 같이 여러 인스턴스로 로드밸런싱하는 경우 모두 같은 값으로 저장해야합니다.
  • agentId
    • 같은 applicationName 내에서 구분짓기 위한 Id입니다. 위와 같은 경우 두 서버 모두 다른 id를 지정해줘야합니다.
  • config
    • 설정 파일을 지정해줍니다.

Dockerfile 실행시키기

docker -t santaz .

docker run -d -p 8080:8080 -e TZ=Asia/Seoul -v /home/ec2-user/pinpoint-agent-2.2.2:/pinpoint --name santaz

6. 적용 결과

monitoring 인스턴스 IP의 8080 포트로 접속을 하면 아래와 같은 화면을 확인할 수 있습니다.

또한 아래와 같이 서버에 요청한 모든 API를 확인할 수 있고 특정 API 요청에 대해 어떤 메서드를 호출했는지 또는 메서드 수행 시간을 확인해 어디서 병목현상이 발생하는지 성능 개선을 할 수 있습니다.

 

참고

https://jojoldu.tistory.com/573

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함