연관글
1. 네이버 핀포인트란?
2. 핀포인트 설치하기
글 작성을 위한 환경 구성은 아래와 같이 하겠습니다.
- EC2에 Hbase, Collector, Web을 모두 설치
- 로컬 PC에 Agent를 설치해서 Spring boot 프로젝트 구성해서 실행
EC2
- t2.medium
- java 11, java 8
- ubuntu 20.04
위와 같이 구성한 이유는 프리티어를 사용해서 구성하려 했으나 Hbase설치 -> 실행, Collector를 설치하고 실행, Web을 설치하고 기동 하면 ec2에 접속이 안 되는 문제가 있었습니다.
원인을 찾지는 못했으나 CPU 지표가 90%가 넘게 치솟고 아마 램도 부족해서 ec2에 접속이 안되는 현상이 일어나지 않나 싶습니다.
그래서 CPU도 2개에 램도 4GB인 t2.medium 으로 선택하여 진행하였습니다.
이동욱 님 블로그를 보고 작성하는 글이기 때문에 제가 핀포인트를 설치 및 도입하며 만난 이슈들에 대해 정리하겠습니다.
1. 자바 8, 11 설치
기본적으로 자바가 1.8 이상 설치되어있어야 합니다.
근데 Hbase를 자바 11로 실행하려하면 다음과 같은 에러가 나거나 JAVA_HOME을 Hbase를 11로 잡아도 현재 가비지 컬렉션이 사용되지 않는다는 에러가 나기 때문에 Hbase만을 위한 자바 8을 설치하던가, web, Collector도 자바 8만 설치하여 8로 띄어주면 됩니다.
현재 저는 자바11을 따로 설치하였습니다.
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.jruby.java.invokers.RubyToJavaInvoker (file:/home/ubuntu/hbase-1.2.7/lib/jruby-complete-1.6.8.jar) to method java.lang.Object.registerNatives()
WARNING: Please consider reporting this to the maintainers of org.jruby.java.invokers.RubyToJavaInvoker
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
ArgumentError: wrong number of arguments (0 for 1)
method_added at file:/home/ubuntu/hbase-1.2.7/lib/jruby-complete-1.6.8.jar!/builtin/javasupport/core_ext/object.rb:10
method_added at file:/home/ubuntu/hbase-1.2.7/lib/jruby-complete-1.6.8.jar!/builtin/javasupport/core_ext/object.rb:129
Pattern at file:/home/ubuntu/hbase-1.2.7/lib/jruby-complete-1.6.8.jar!/builtin/java/java.util.regex.rb:2
(root) at file:/home/ubuntu/hbase-1.2.7/lib/jruby-complete-1.6.8.jar!/builtin/java/java.util.regex.rb:1
require at org/jruby/RubyKernel.java:1062
(root) at file:/home/ubuntu/hbase-1.2.7/lib/jruby-complete-1.6.8.jar!/builtin/java/java.util.regex.rb:42
(root) at /home/ubuntu/hbase/bin/../bin/hirb.rb:38
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
1-1 apt 업그레이드
apt(Advanced Packaging Tools) 은 리눅스에서 패키지 관리를 담당합니다.
sudo apt-get update && sudo apt-get upgrade
1-2 JDK 설치
sudo apt-get install openjdk-11-jdk
sudo apt-get install openjdk-8-jdk
java -version
출력 값
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1, mixed mode, sharing)
1-3 JAVA_HOME 설정
EC2에 대한 자바 환경변수 설정입니다.
#자바 위치 읽어오기
readlink -f /usr/bin/java
출력 : /usr/lib/jvm/java-11-openjdk-amd64/bin/java
#자바 홈 추가를 위한 명령어
sudo vi /etc/profile
# shift + G 를 누르면 vi 편집기 맨 아래로 이동!
# 이동후 i를 누르면 insert 모드로 변환되어 수정할 수 있음
# 맨 아래에 다음과 같이 추가
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
# 위와 같이 작성후 esc를 누른 후 :wq! (저장 후 나간다는 의미) 명령어를 입력해준다.
#적용
source /etc/profile
#확인
echo $JAVA_HOME
출력 : /usr/lib/jvm/java-11-openjdk-amd64/bin/java
2. Hbase 설치
Hbase는 2.X까지 나와있지만, 아직까지 Pinpoint의 모든 버전은 Hbase의 1.2.X 버전에 최적화되어 있습니다.
#Hbase 압축 파일 다운
wget https://archive.apache.org/dist/hbase/1.2.7/hbase-1.2.7-bin.tar.gz
#tar명령로 압축해제
tar xzvf hbase-1.2.7-bin.tar.gz
vi /home/ubuntu/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가 스크립트를 지원하기 때문에 해당 스크립트를 다운로드하여 실행하면 됩니다.
wget https://raw.githubusercontent.com/pinpoint-apm/pinpoint/master/hbase/scripts/hbase-create.hbase
스크립트 다운이 다 되셨으면 바로 스크립트를 실행해서 Pinpoint 테이블을 생성합니다.
hbase/bin/hbase shell ../hbase-create.hbase
3. Collector 설치
예전에는 Pinpoint의 모듈들이 Tomcat에서 War를 올리는 방식만을 지원했는데요.
최근에는 스프링부트 기반으로 Jar 단독 실행이 지원되어서, 별도의 WAS 설치가 불필요해졌습니다.
그래서 바로 jar파일만 다운로드하겠습니다.
그리고 바로 jar를 실행합니다.
#jar 파일 다운
wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/pinpoint-collector-boot-2.2.2.jar
#jar 실행
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.2.2.jar >/dev/null 2>&1 &
- nohup ~ >/dev/null 2>&1 &
- nohup.out 로그 파일 생성 없이, 세션 종료 없이 백그라운드 실행을 위해 사용합니다.
- -Dpinpoint.zookeeper.address=localhost
- 원래는 분산된 Hbase의 zookeeper 주소를 써야 하지만, 여기서는 다 같은 EC2 안에 있으니 localhost를 사용합니다.
Collector 설치가 끝났으니 바로 Web 설치를 진행하겠습니다.
4. Web 설치
다운로드한 Jar 파일 주소만 다를 뿐이지 그 외에는 완전히 동일합니다.
wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/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 &
자 이제 Pinpoint Agent를 제외하고 모든 것이 설치되었습니다.
5. Pinpoint Agent 구성하기
5-1. 프로젝트에 Agent 추가
먼저 Pinpoint로 모니터링하고 싶은 프로젝트에 pinpoint-agent를 설치합니다.
#agent 설치
https://github.com/pinpoint-apm/pinpoint/releases/download/v2.5.0/pinpoint-agent-2.5.0.tar.gz
# 압축해제
tar pinpoint-agent-2.5.0.tar.gz
압축해제한 파일을 프로젝트 루트 경로에 넣어줍시다.
5-2. 프로젝트 실행
Pinpoint Agent를 실행시키기 위해서는 4가지 설정이 필수인데요.
- pinpiont.applicationName
- Pinpoint에 연결된 많은 프로젝트들 중, 이 프로젝트를 구분짓기 위한 ID
- 스케일아웃하여 여러 EC2로 구성되어있더라도 같은 프로젝트라면 이 값을 모두 같은 값으로 둔다.
- pinpoint.agentId
- 같은 PINPOINT_APPLICATION_NAME 내에서 각 서버들을 구분하기 위한 ID
- 보통은 서버 IP를 지정합니다.
- pinpoint.collector.ip
- EC2에 떠있는 Collector의 ip = EC2 IP 이다.
- profiler.transport.grpc.collector.ip
- pinpoint가 grpc로 통신하기위한 EC2 ip
이 3개 값은 필수라서 환경변수 (Environment Variable)로 꼭 지정해야 합니다.
그리고 이 외에 필수는 아니지만, 이번 시간에는 필수로 지정되야 할 값이 바로 PINPOINT_SAMPLING_RATE 입니다.
- profiler.sampling.counting.sampling-rate
- 대량의 트래픽을 모두 추적할 것인지, 그 중 일부만 샘플링해서 추적할 것인지 판단합니다. (네이버의 몇몇 서비스들은 하루에 20억건 요청이 오다보니 이를 다 추적하는것은 비용낭비가 심하여 10% 이내만 샘플링해서 본다고 합니다.)
- 샘플링 %는 (1/profiler.sampling.counting.sampling-rate) 공식으로 진행됩니다.
- 즉, profiler.sampling.counting.sampling-rate의 값을 20으로 하게 되면 1/20이 되어 5%만 샘플링, profiler.sampling.counting.sampling-rate를 1로 두게되면 1/1이 되어 100% 추적이 됩니다.
::profiler.sampling.type :: COUNTING
::profiler.sampling.counting.sampling-rate :: 20
::profiler.sampling.percent.sampling-rate :: 5
아무런 값을 안주면 서버를 기동할때 위와 같이 디폴트 값이 설정되어 적용되게 됩니다.
이 값은 기본값이 20인데, 이렇게 될 경우 5%만 샘플링하게 되니, 테스트에서는 100% 추적하기 위해 1로 변경합니다.
이렇게 5가지의 환경 변수를 로컬 실행시에 적용해야하니 각자 실행 환경에 맞게 환경 변수에 넣어주시면 됩니다.
그래서 프로젝트를 실행하는 방법은 두 가지가 있습니다.
5-2-1. Intellij 실행

위의 옵션들은 인텔리제이에서 VM Option을 통해 실행할수 있는게 1번입니다.
5-2-2. 명령어 실행
java -jar -javaagent:pinpoint-agent-2.5.0/pinpoint-bootstrap-2.5.0.jar \
-Dpinpoint.applicationName=jisu-api \
-Dpinpoint.agentId=jisu-api \
-Dprofiler.collector.ip=ec2 ip \
-Dprofiler.transport.grpc.collector.ip=ec2 ip \
-Dprofiler.sampling.counting.sampling-rate=1 \
./build/libs/pinpoint-0.0.1-SNAPSHOT.jar
명령어로 실행할때 -D 옵션은 sprinf boot yml, properties의 키 값을 찾아 변경할 수 있습니다.
그렇기 때문에 위에서 설명한대로 애플리케이션 이름과 ec2 ip 들을 environment 을 주입해줍니다.
6. 핀포인트 사용하기
6-1. API 목록 및 실행 순서
1. GET - /users : 전체 유저 조회 API
2. POST - /users : 유저 생성
3. GET - /users/{id} : id로 유저 조회
4. GET - /users/{id} : 없는 id로 유저 조회 시 예외 발생
5. GET - /error1: 런타임 예외 발생 HttpStatus= 500
6. GET - /error4: 런타임 예외 발생 HttpStatus= 200
위와 같이 순서대로 API를 호출한 뒤 결과를 확인해보겠습니다.

6번의 요청과 1,2,3,4, 요청에 대해서 DB I/O를 사용했기때문에 MYSQL은 4번에 대해서 정보가 나옵니다.

오른쪽에 보면 요청건에 대해 점이 찍혀있는 것을 확인할 수 있습니다.
'Spring Boot > 모니터링' 카테고리의 다른 글
네이버 핀포인트란? (0) | 2023.04.01 |
---|
댓글