참조 : 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 상세 정보를 제공합니다.
우측상단의 Host JVM 이 여러분들이 작성한 Application 이 돌아가고 있는 WAS 입니다.
여기에 Pinpoint Agent 가 올라갑니다.
Host JVM 이 동작하는동안 Pinpoint Agent 는 Profile 정보를 좌측상단의 Profiled Applications로 보내게 되고,
수집된 정보는 Pinpoint Collector 가 좌측하단 HBase에 기록하게 됩니다.
기록된 정보는 Pinpoint Web UI 를 통해 확인 할 수 있습니다.
- - 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.
- 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 Version | Agent | Collector | Web |
---|---|---|---|
1.0.x | 6+ | 6+ | 6+ |
1.1.x | 6+ | 7+ | 7+ |
1.5.x | 6+ | 7+ | 7+ |
1.6.x | 6+ | 7+ | 7+ |
Pinpoint Version | HBase 0.94.x | HBase 0.98.x | HBase 1.0.x | HBase 1.1.x | HBase 1.2.x |
---|---|---|---|---|---|
1.0.x | yes | no | no | no | no |
1.1.x | no | not tested | yes | not tested | not tested |
1.5.x | no | not tested | yes | not tested | not tested |
1.6.x | no | not tested | not tested | not tested | yes |
/pinpoint/quickstart/hbase/hbase
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_6_HOME 환경변수 셋팅 (JDK 1.6)
// JAVA_7_HOME 환경변수 셋팅 (JDK 1.7)
pinpoint-master> mvn install -Dmaven.test.skip=true
정상적으로 빌드에 성공하면 다음과 비슷한 메시지를 볼 수 있습니다.
[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
/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/web/target / pinpoint-web-1.6.0-SNAPSHOT.war |
web war를 WAS에 deploy 한다.
WEB-INF/classes 에는 pinpoint-web.properties, hbase.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 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 를 활용하여 개발, 테스트 및 운영에 도움이 되시길 바랍니다.