IT/Server

[Pinpoint] Pinpoint란?

음료요정 2021. 6. 10. 16:29

 

 

회사에서 사용하고있는 모니터링 오픈소스 플랫폼은 pinpoint이다

AWS-> IDC 핀포인트로 target collector를 수정을 배포하다가 자세한내용이 궁금해서 찾아보고 적어보는 블로그!

아래 출처페이지 네이버 사이트에 자세한 설명이 나와있으며, 이 게시글은 그 내용을 요약한 내용을 적어두었다.

출처페이지 : https://d2.naver.com/helloworld/1194202

 

Pinpoint란?

원인을 콕 찝어내다는 뜻의 핀포인트!

대규모 분산시스템의 성능을 분석하고 문제를 진단, 처리하는 java 플랫폼이다

네이버에서 2015년 오픈소스로 배포하였다.

시스템의 복잡도가 높아지면서 장애나 성능문제가 발생했을때 분석과 해결이 어려웠던 것을 해결하기위한 새로운 플랫폼을 만든것이다.

 

 

적용과 해제 방법

코드를 변경할 필요 없이 쉽게 적용하고 해제할수 있다.

JVM 구동시 JVM 시작 스크립트에 Pinpoint Agent 설정 3개를 추가하면 쉽게 적용할 수 있다

핀포인트때문에 문제가 발생했다면 JVM 시작 스크립트에서 Pinpoint Agent설정을 제거해 적용을 해제하면 된다

 

  • javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar
  • Dpinpoint.agentId=
  • Dpinpoint.applicationName=<동일 서비스임을 나타내는 이름(AgentId의 집합)>

나는 쉘 스크립트파일에 아래 내용을 추가하였다

JAVA_OPTS="${JAVA_OPTS} -javaagent:/home/ubuntu/pinpoint-agent/pinpoint-bootstrap-{버전}.jar -Dpinpoint.agentId=#isid# -Dpinpoint.applicationName={ApplicationName} -Dpinpoint.profiler.profiles.active=release"

 

Install 방법

install_dependencies.sh 쉘 파일에 아래 명령어를 추가하였다 

# Install pinpoint agent
sudo rm -rf /home/ubuntu/pinpoint-agent                      -- 기존것 삭제
sudo rm -f /home/ubuntu/pinpoint-agent*.tar.gz            -- 기존것 삭제
cd /home/ubuntu/                                                               -- 설치위치로 이동
sudo mkdir -p pinpoint-agent                                           -- 디렉토리 생성
sudo wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/pinpoint-agent-2.2.2.tar.gz    -- 콘텐츠가져옴
sudo tar xvfz pinpoint-agent*.tar.gz -C /home/ubuntu/pinpoint-agent --strip-components=1               -- 압축품
sudo chown -R {서버기동계정}:{서버기동계정} /home/ubuntu/pinpoint-agent                                                -- 소유자,그룹 변경 부여


# pinpoint.config 설정 치환-- sed : stream edit 치환
sudo sed -i "/profiler.transport.grpc.collector.ip=/ c\profiler.transport.grpc.collector.ip=$PINPOINT_URL" /home/ubuntu/pinpoint-agent/profiles/release/pinpoint.config
sudo sed -i "/profiler.collector.ip=/ c\profiler.collector.ip=$PINPOINT_URL" /home/ubuntu/pinpoint-agent/profiles/release/pinpoint.config
sudo sed -i "/profiler.sampling.rate=/ c\profiler.sampling.rate=$PINPOINT_SAMPLING_RATE" /home/ubuntu/pinpoint-agent/profiles/release/pinpoint.config


# Pinpoint Log Level 치환 -- sed : stream edit 치환
sudo sed -i 's/level=\"INFO\" additivity''/level=\"'$PINPOINT_LOG_LEVEL'\" additivity/g' /home/ubuntu/pinpoint-agent/profiles/release/log4j2.xml
sudo sed -i 's/Root level=\"INFO\"''/Root level=\"'$PINPOINT_LOG_LEVEL'\"/g' /home/ubuntu/pinpoint-agent/profiles/release/log4j2.xml

 

작동 방법

pinpoint는 인터셉터로 추상화해 클래스 로드시점에 애플리케이션 코드를 가로채 성능정보와 분산 트랜잭션 추적에 필요한 코드를 주입(inject) 한다. 애플리케이션 코드에 직접 추적코드가 주입되어 성능이 좋다.

 

JVM 클래스 로더 에서 추적대상 메서드에 인터셉터를 주입해 앞뒤로 Before(), After()메서드를 호출하게 하고 성능데이터를 기록하는 부분을 구현했다. 

 

public void helloWorld(){

  Intterceptor.before();      -> traceContext

  System.out.println("안녕");

  Intterceptor.after();          -> traceContext

}

 

 

성능최적화 방법

- 바이너리 포맷 (Thrift) 사용

 Thrift 형식의 바이너리 포맷을 사용하면 사용방법이나 디버깅이 어렵지만 인코딩 속도가 빠르다. 또한 생성되는 바이트 데이터의 크기가 작아 네트워크 사용량을 줄일 수 있다.

- 가변길이 인코딩과 포맷에 최적화된 데이터 기록 

 데이터의 크기를 줄이기위해 고정길이 데이터가 아닌 가변 길이로 인코딩 하고, 인코딩 포맷에 최적화 되도록 데이터를 기록한다. Pinpoint Agent는 추척된 루트(root) 메서드를 기준으로 나머지 시간을 벡터값으로 변환해 데이터 크기를 줄인다.  

- 반복되는 API정보와 SQL, 문자열을 상수 테이블로 치환

- 대량의 요청은 샘플링으로 처리 

 엄청난 요청량의 모든요청을 추척하지않고 샘플링한 데이터를 수집 할 수있다. 요청량에따라 요청량이 적은 경우는 모든 데이터를 수집하고, 요청량이 많은 환경에서는 1~5% 만 수집해도 전체 애플리케이션의 상태를 확인하는데 무리가 없다.

샘플링 방법 : Counting 샘플러를 지원한다. 

 

 

- 비동기 데이터 전송으로 애플리케이션 스레드 중단 최소화

 비동기 방식으로 동작하므로 애플리케이션 스레드를 중단(block)시키지 않는다.

- UDP로 데이터 전송 

 네트워크는 공용인프라로 폭주 시 문제가 발생할 수 있어 UDP프로토콜을 사용한다.

 

 

 

 

특징?

 

  • 분산된 애플리케이션의 메시지를 추적할 수 있는 분산 트랜잭션 추적
  • 애플리케이션 구성을 파악할 수 있는 애플리케이션 토폴로지 자동 발견
  • 대규모 서버군을 지원할 수 있는 수평 확장성
  • 코드 수준의 가시성을 제공해 문제 발생 지점과 병목 구간을 쉽게 발견
  • bytecode instrumentation 기법으로 코드를 수정하지 않고 원하는 기능을 추가

 

업무상의 기록

pinpoint agent 설정

profiler.sampling.rate=1(dev, qa, stg → 1, prod → 10) - 20이 default값

                                    : 비율로 1이면 1/1으로 100% 수집, 10이면 1/10으로 10% 수집, 20이면 1/20으로 5% 수집)

PINPOINT_LOG_LEVEL : prod 는 ERROR, 그 외 환경은 WARN

 

 

기능? 

 1. 서버 맵 - 대상 서버와 연결된 다른 서버와의 관계 다이어그램

 2. 스캐터 - 요청별 응답시간에 따른 그래프

 3. request detail - 스캐터에서 선택된 요청의 스택트레이스 뷰

 4. 에러 발생 요청 표시 - 에러가 발생한 요청 빨간색으로 표시

 5. 서버의 jar목록 표시 - 서버에 접속하지 않아도 관련된 jar 목록 확인 가능

 

 

참고 사이트

pinpoint 공식 홈페이 : https://docs.ncloud.com/ko/pinpoint/pinpoint-1-2.html

​모듈 다운로드 주소 : https://github.com/naver/pinpoint/releases

 

Releases · pinpoint-apm/pinpoint

APM, (Application Performance Management) tool for large-scale distributed systems. - pinpoint-apm/pinpoint

github.com

docker 다운로드 주소 : https://github.com/naver/pinpoint-docker