grafana, telegraf, influxDB로 실시간 모니터링은 구축했지만, jvm 모니터링을 구축한 내용이다.



이전 내용은 http://knight76.tistory.com/entry/grafana를 참조한다.






telegraf를 이용해 자바를 모니터링하는 방법이 있다. 


- 웹 애플리케이션에 jolokia 활용하기 (https://github.com/influxdata/telegraf/tree/master/plugins/inputs/jolokia)

- stats-jvm-profile를 java agent를 사용하는 방법(https://github.com/etsy/statsd-jvm-profiler)


두 방법 모두 javaagent 기반이라 등록/해제 모두 재시작을 해야 한다는 점이 좀 걸렸다. 웹도 아니면 jolokia가 불편하기도 하기도 하다. 더 간단한 방법으로 보고 싶었다. 



jmx를 순수하게 사용하는 방식을 사용했다. 결론은 대만족이다. 

cmdline-jmxclient 0.10.3을 다운받아 jmx 호출을 통해 jvm 메모리 부분을 모니터링하도록 스크립트를 구성했다. 


그리고, influxDB http write api를 이용해서 저장했다. (단순한 질의와 파일을 이용한 bulk 작업이 가능하다)

influxDB 1.1 이전에는 json을 지원했지만, influxDB 1.1부터는 그냥 property와 sql형태만 지원하는 것 같다. 

(참조 : https://docs.influxdata.com/influxdb/v1.1/guides/writing_data/)



crontab에 아래 스크립트(g1, cms 메모리 정보)를 만들어 jvm이 떠 있는 장비로 jmx을 모니터링 정보를 influxDB에 저장하도록 했다. 




<핵심 스크립트>



# timestamp 구성하기 

t="$(date -u +%s)"

oo="000000000"

timestamp=$t$oo

echo $timestamp 


/usr/java/default/bin/java -jar cmdline-jmxclient-0.10.3.jar - abc.google.io:10100 "java.lang:type=MemoryPool,name=G1 Eden Space" "Usage" 2>> /tmp/javalog2

used="$(cat /tmp/javalog2 | grep used | cut -f2 -d" ")"

curl -i -XPOST 'http://influxdb.google.io:8086/write?db=telegraf' -d "javamem,server=abc.google.io,type=g1-eden value=$used $timestamp"




많이 보면 좋긴 하지만, 잘 동작한다고 가정하고 주요 지표만 보도록 했다. 

만약 다른 지표를 추가해 세밀히 볼 수 있을 것이다. 



g1일 때 

"java.lang:type=Memory" "HeapMemoryUsage"

"java.lang:type=MemoryPool,name=G1 Survivor Space"

"java.lang:type=MemoryPool,name=G1 Old Gen"

"java.lang:type=MemoryPool,name=G1 Eden Space"



cms일 때 

"java.lang:type=Memory" "HeapMemoryUsage"

"java.lang:type=MemoryPool,name=Par Eden Space" "Usage"

"java.lang:type=MemoryPool,name=Par Survivor Space" "Usage"

"java.lang:type=MemoryPool,name=CMS Old Gen" "Usage"




기존 grafana에 jvm 모니터링 추가한 내용이다. jvm 서버 재시작 없이 gc 내용을 볼 수 있게 만들었다. 




Posted by '김용환'
,