OpenSource

Pinpoint

아르비스 2016. 11. 4. 17:24

참조 : https://github.com/naver/pinpoint

        http://dev2.prompt.co.kr/33

        https://github.com/naver/pinpoint/blob/master/quickstart/README.md



Naver에서 Opensource로 Monitoring 을 가능하도록 한 솔루션



참고) 해당 내용은 https://github.com/naver/pinpoint 를 많은 부분 참고하였습니다.


얼마 전 Naver Pinpoint 오픈소스가 공개되었습니다.

https://github.com/naver/pinpoint




Pinpoint 는 APM (Application Performance Management) Tool 로서

Java 로 만들어진 Large-scale 분산 시스템에서 사용될 수 있습니다... 라고 적혀있습니다만

소규모의 WAS(Web Application Server) 에서 사용해도 전혀 문제될 게 없습니다.

(제니퍼 라는 유명한 APM 이 있죠 ^^)


Pinpoint는 시스템 전반적인 구조를 분석하고, Transaction 을 추적합니다.

단 한줄의 코드도 변경하지 않고 에이전트를 설치할 수 있으며,

성능에 미치는 영향을 최소화 한다고 명시되어 있습니다. (자원 사용량이 약 3% 증가합니다.)


Pinpoint에서 밝히고 있는 제공하는 뷰는 다음과 같습니다.

ServerMap
    - 각 구성요소가 어떻게 상호연결되는지 시각화 해줍니다.
    - 각 노드를 클릭하여 현재상태, Transaction 수 등과 같은 구성요소에 대한 세부 사항을 확인할 수 있습니다.
Request/Response Scatter Chart
    - Request 수, Response 패턴을 시각화 합니다.
    - Transaction 은 차트에서 드래그함으로써 추가 상세 정보를 선택할 수 있습니다.
CallStack
    - 하나의 뷰에서 병목지점, 실패위치(points of failure)를 식별합니다.
    - 분산 환경에서 모든 Transaction에 코드 수준의 가시성을 확보할 수 있습니다.
Inspector
    - CPU 사용량, 메모리/GC, JVM arguments 같은 Application 상세 정보를 제공합니다.

 

전반적인 아키텍쳐는 다음과 같습니다. (출처 : Naver Pinpoint)


우측상단의 Host JVM 이 여러분들이 작성한 Application 이 돌아가고 있는 WAS 입니다.

여기에 Pinpoint Agent 가 올라갑니다.


Host JVM 이 동작하는동안 Pinpoint Agent 는 Profile 정보를 좌측상단의 Profiled Applications로 보내게 되고,

수집된 정보는 Pinpoint Collector 가 좌측하단 HBase에 기록하게 됩니다.

기록된 정보는 Pinpoint Web UI 를 통해 확인 할 수 있습니다.


Pintpoint에 명시된 설치를 위한 요구사항은 다음과 같습니다.
  • - JDK 6 installed
  • - JDK 7+ installed
  • - Maven 3.2.x+ installed
  • - JAVA_6_HOME environment variable set to JDK 6 home directory.
  • - JAVA_7_HOME environment variable set to JDK 7+ home directory.

Pinpoint는 Apache License, Version 2.0 입니다.

Pinpoint 필수 전제 사항

  • - Linux Server 에 설치하는 기준으로 작성되었습니다.

  • - 기본적인 Maven Build 를 사용 가능하다고 전제하였습니다.

  • - 기본적인 WAS (Tomcat 등)에 웹어플리케이션을 설치가능하다고 전제하였습니다.

  • - 기본적인 Java 환경변수(JAVA_HOME, CLASSPATH 등)이 셋팅되어 있다고 전제하였습니다.

  • - HBase, Pinpoint Collector, Pinpoint Web 은 하나의 서버에 설치한다고 전제하였습니다.


Pinpoint 를 사용하기 위해서는 다음과 같은 Component 가 설치되어야 합니다.

  • - HBase (for storage) : Pinpoint Agent 로부터 수집된 정보들을 기록합니다. (Hadoop database)

  • - Pinpoint Collector (deployed on a web container) : 외부에서 전송되는 정보를 수집합니다.

  • - Pinpoint Web (deployed on a web container) : Pinpoint Collector가 수집하여 HBase에 기록된 정보를 확인합니다.

  • - Pinpoint Agent (attached to a java application for profiling) : 모니터링 할 Host JVM에 설치되어 정보를 전송합니다.

 


Pinpoint 별 Java version 관계
Pinpoint VersionAgentCollectorWeb
1.0.x6+6+6+
1.1.x6+7+7+
1.5.x6+7+7+
1.6.x6+7+7+


HBase 설치 - http://hbase.apache.org
pinpint package에는 0.94 version이 포함되어 있지만, 
최신 버전을 사용가능하다. 단 Hbase 버전별 pinpoint의 사용 버전이 다르다.

Pinpoint

Version

HBase
0.94.x
HBase
0.98.x
HBase
1.0.x
HBase
1.1.x
HBase
1.2.x
1.0.xyesnononono
1.1.xnonot testedyesnot testednot tested
1.5.xnonot testedyesnot testednot tested
1.6.xnonot testednot testednot tested

yes

지금버전은 pinpoint 1.6.0 버전을 사용하므로, Hbase 1.2.3 version을 사용하려고 한다.
[pinpoint]
https://github.com/naver/pinpoint/archive/master.zip
[hbase]
http://apache.mirror.cdnetworks.com/hbase/1.2.3/hbase-1.2.3-bin.tar.gz


Hbase 버전 다운로드 후  압축해제
tar zxvf hbase-1.2.3-bin.tar.gz

Hbase를 pinpoint 폴더 내에 다음 경로로 옮겨 준다.

/pinpoint/quickstart/hbase/hbase

다음 Hbase를 실행하고 Schema를 생성하는 script를 실행한다.

Install & Start HBase

$PINPOINT_HOME/quickstart/bin/start-hbase.sh

$PINPOINT_HOME/quickstart/bin/init-hbase.sh


정상적으로 Schema가 생성될 경우 다음과 같은 메시지 생성됨

14개의 Table 이 생성됩니다.

0 row(s) in 2.0410 seconds

0 row(s) in 1.1410 seconds

0 row(s) in 1.0860 seconds

0 row(s) in 1.0900 seconds

0 row(s) in 1.0860 seconds

0 row(s) in 1.0980 seconds

0 row(s) in 3.2820 seconds

0 row(s) in 1.1420 seconds

0 row(s) in 1.1430 seconds

0 row(s) in 1.1420 seconds

0 row(s) in 1.1250 seconds

0 row(s) in 1.0890 seconds

0 row(s) in 1.0780 seconds

0 row(s) in 1.0830 seconds


TABLE

AgentInfo

AgentStat

ApiMetaData

ApplicationIndex

ApplicationMapStatisticsCallee

ApplicationMapStatisticsCaller

ApplicationMapStatisticsSelf

ApplicationStatistics

ApplicationTraceIndex

HostApplicationMap

HostApplicationMap_Ver2

SqlMetaData

StringMetaData

Traces

14 row(s) in 0.0460 seconds


 

Start Pinpoint Daemons


Pinpoint 는 기본적으로 JDK6 이상에서 동작하므로 기본적으로 JDK6으로 빌드하나,

profiler-optional 이라는 프로젝트는 JDK7 에서 빌드, 동작되므로 전체 빌드를 위해서는 두 버전의 JDK 가 필요합니다.

환경변수를 셋팅하고 Maven Build 가 가능한 환경에서 mvn install 를 실행하면 전체빌드를 수행합니다.

// JAVA_HOME 환경변수 셋팅 (JDK 1.6) 

// JAVA_6_HOME 환경변수 셋팅 (JDK 1.6)

// JAVA_7_HOME 환경변수 셋팅 (JDK 1.7)

 

pinpoint-master> mvn install -Dmaven.test.skip=true

 

정상적으로 빌드에 성공하면 다음과 비슷한 메시지를 볼 수 있습니다.

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] pinpoint ........................................... SUCCESS [  0.290 s]
[INFO] pinpoint-thrift .................................... SUCCESS [ 10.663 s]
[INFO] pinpoint-commons ................................... SUCCESS [01:02 min]
[INFO] pinpoint-bootstrap-core ............................ SUCCESS [  1.990 s]
[INFO] pinpoint-bootstrap ................................. SUCCESS [ 19.859 s]
[INFO] pinpoint-rpc ....................................... SUCCESS [ 27.887 s]
[INFO] pinpoint-profiler .................................. SUCCESS [01:55 min]
[INFO] pinpoint-profiler-optional ......................... SUCCESS [  2.040 s]
[INFO] pinpoint-agent-distribution ........................ SUCCESS [  2.290 s]
[INFO] pinpoint-collector ................................. SUCCESS [ 21.599 s]
[INFO] pinpoint-web ....................................... SUCCESS [01:53 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 06:17 min

 

실패할 경우, Build fail이 발생하며, 방화벽이나, jar의 download 여부를 확인해야 한다.

Pinpoint Collector 설치


정상적으로 Pinpoint Build에 성공했다면, 
다음 경로에 collector 파일이 생성된다.

/pinpoint/collector/target/ pinpoint-collector-1.6.0-SNAPSHOT.war 


collector war를 WAS(tomcat)에 deploy 한다.


WEB-INF/classes 에는 hbase.properties 와 pinpoint-collector.properties 가 존재하며

해당 property 에는 Listen IP, Port 등이 정의되어 있고, 변경하여 Deploy 할 수 있습니다.

추가로 log4j.xml 에서 Log Level 을 조절할 수 있습니다.


Pinpoint Web 설치


정상적으로 Pinpoint Build에 성공했다면, 
다음 경로에 web 파일이 생성된다.

 /pinpoint/web/target / pinpoint-web-1.6.0-SNAPSHOT.war


web war를 WAS에 deploy 한다.


WEB-INF/classes 에는 pinpoint-web.propertieshbase.properties 가 존재하며

설정값을 변경하여 Deploy 할 수 있습니다.

추가로 log4j.xml 에서 Log Level 을 조절할 수 있습니다.


여기까지 정상적으로 셋팅 하였다면, Pinpoint 는 이제 외부 Agent 로 부터 Profile을 전달받을 준비가 완료됩니다.

Pinpoint Web 화면을 브라우져로 띄워보시면 다음과 같은 화면이 나타납니다.

 


이번엔 Pinpoint Agent 설치과정에 대해 알아봅니다.


  • - Pinpoint 전체소스가 빌드되어 있다고 전제하였습니다.
  • - Linux Server 에 설치하는 기준으로 작성되었습니다.

 

Pinpoint Agent 는 Host JVM 에서 Profiled Applications 로 Profile 를 전송하는 역할을 합니다.

따라서, 모니터링 할 WAS 에 Agent 를 셋팅하면 됩니다.

그러면 미리 설치해놓은 Pinpoint 에 Profile 를 전송하게 될 것입니다.


 

Pinpoint Agent 설치 및 셋팅

Pinpoint Agent 는 다음의 위치에 있습니다.

pinpoint-master/agent/target/pinpoint-agent

 

구조는 다음과 같습니다. (출처 : Naver Pinpoint Installation)

 

 

해당 Agent 를 적당한 디렉토리에 위치시키고, pinpoint-agent 경로를 환경변수 AGENT_PATH 로 셋팅합니다.

이후 모니터링할 JVM argument 에 -javaagent, -Dpinpoint.agentId, -Dpinpoint.applicationName 을 추가 셋팅하면 됩니다.

  • $AGENT_PATH - Pinpoint agent 가 설치된 디렉토리

  • -javaagent : $AGENT_PATH/pinpoint-bootstrap-{$VERSION}-SNAPSHOT.jar

  • -Dpinpoint.agentId - ID (해당 ID는 Pinpoint 안에서 유일한 값이어야 합니다.)

  • -Dpinpoint.applicationName - 이름 (Pinpoint Web 페이지에서 사용됩니다.)

  •             applicationName이 같을 경우 단일 서비스의 Multi Instance 로 처리됩니다.

  •             Multi Instance 의 경우도 agentId 는 서로 달라야 합니다.

 

리눅스 환경의 Tomcat의 경우 실행스크립트에 다음과 같이 셋팅할 수 있습니다.

export AGENT_PATH={Pinpoint Agent 경로}
export CATALINA_OPTS="$CATALINA_OPTS -javaagent:$AGENT_PATH/pinpoint-bootstrap-1.0.4-SNAPSHOT.jar"
export CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=agentId_01"
export CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=agentId_01_Name"

 

Pinpoint Agent 는 수집된 Profile을 전송할 Collector 서버를 지정해야 합니다.

다음 Configuration 파일에 Collector 서버 를 지정합니다.

pinpoint-master/agent/target/pinpoint-agent/pinpoint.config

 

Default 로 셋팅하였고, Agent 와 Collector 가 같은 서버에 있다면 수정할 필요가 없지만,

Agent 와 Collector 의 서버가 다르다면 pinpoint.config 파일을 열어서

profiler.collector.ip

를 Collector 서버 IP 로 수정해 줍니다.

셋팅 하면서 Port 를 변경하였다면 변경된 Port 에 맞게 수정해 줍니다.

 

Pinpoint Agent 설치 확인

Agent 를 셋팅한 WAS 를 구동시키면, 평소와 다른 로그들이 나타납니다.

만약 정상적으로 셋팅되지 않는다면 Error Log 를 확인하실 수 있을 것입니다.

정상적으로 셋팅되었다면, Pinpoint Web 으로 접속했을 때 상단 Select Box 에 Application 이 추가된 것을 확인하실 수 있습니다.

 

다양한 기능들이 구석구석에 숨어 있으니 직접 사용해 보시기 바랍니다.

메인에는 각 구성요소가 어떻게 상호연결 되는지 ServerMap 으로 시각화 해 주고 있으며

각 노드를 클릭하여 각 구성요소에 대한 세부 사항을 확인할 수 있습니다.

오른쪽 위에 보이는 Scatter Chart에서 마우스로 원하는 영역만큼을 지정하면 CallStack 페이지가 나타납니다.

특정 노드의 경우 우하단에 Inspector 가 나타나는데, CPU 사용량, 메모리/GC, JVM arguments 같은 Application 상세 정보를 제공합니다.

 

 

정상적으로 셋팅이 완료 되었다면,

$AGENT_PATH/lib/log4j.xml

에서 Log Level 을 조절할 수 있습니다.

 

Pinpoint 를 활용하여 개발, 테스트 및 운영에 도움이 되시길 바랍니다.