개요

이번에 presto 모니터링 지표를 jmx로 뽑아내기 위해 알아보다 jolokia에 대해 알게 되었고 이를 내용으로 정리해둔다. 해당글에서는 jolokia에 대한 개념과 간단한 REST API 사용법을 익혀본다.

jolokia란?

자바 프로그램을 jvm으로 띄울때 jmx port를 노출시킬수 있는데 문제는 jmx port로 접근하는 프로토콜이 손쉽지 않다는 것이다. 이를 jolokia는 http로 접근할 수 있게 프록시 서버 역할을 해준다.

즉, jolokia를 통해 사용자 http 조회 -> jolokia server -> jolokia agent -> jmx port 를 가능하게 해준다.

구성에 대한 설명은 아래 그림을 참고하면 이해가 쉽다.

API 종류

크게 5가지의 연산이 가능한데 read, write, exec, search, list 정도가 가능하다. 자세한 내용은 문서를 참고하자.

검증하기

예제로 java.lang/type=MemoryHeapMemoryUsage를 찾는 과정을 알아보자.

search

search 명령어로 특정 패턴의 mbean 이름을 획득 할 수 있다. 이를 통해 memory 관련 mbean이름은 java.lang/type=Memory라는 것을 알 수 있다.

curl -L 'http://jolokia_주소/jolokia' -X POST -d '{ "type":"SEARCH", "mbean":"java.lang:type=*",
"target": { "url":"service:jmx:rmi:///jndi/rmi://10.91.25.201:9080/jmxrmi", "user":"", "password":"" }}'

list

다시 java.lang/type=Memory 안에 어떤 attribute들이 있는지 찾아보면 HeapMemoryUsage가 있는것을 확인 할 수 있다. 주의할점은 list만 mbean이 아닌 path를 써서 :대신에 /를 써야 한다.

curl -L 'http://jolokia_주소/jolokia' -X POST -d '{ "type":"list", "path":"java.lang/type=Memory",
"target": { "url":"service:jmx:rmi:///jndi/rmi://10.91.25.201:9080/jmxrmi", "user":"", "password":"" }}'

read

이제 mbean 이름과 attribute를 알았으니 아래와 같이 조회하면 결과를 확인 할 수 있다.

curl -L 'http://jolokia_주소/jolokia' -X POST -d  '{ "type":"read", "mbean":"java.lang:type=Memory", "attribute":"HeapMemoryUsage", "target": { "url":"service:jmx:rmi:///jndi/rmi://10.91.25.201:9080/jmxrmi", "user":"", "password":"" }}'

혹은 attribute의 여러 값중 하나만 지정해서 뽑기 위해서는 추가로 path를 지정하여 추출할수도 있다.

curl -L 'http://jolokia_주소/jolokia' -X POST -d  '{ "type":"read", "mbean":"java.lang:type=Memory", "attribute":"HeapMemoryUsage", "path": "used", "target": { "url":"service:jmx:rmi:///jndi/rmi://10.91.25.201:9080/jmxrmi", "user":"", "password":"" }}'

필요시 attribute는 제외하고 mbean만으로 전체 value를 조회할 수도 있다.

curl -L 'http://jolokia_주소/jolokia' -X POST -d  '{ "type":"read", "mbean":"java.lang:type=Memory", "target": { "url":"service:jmx:rmi:///jndi/rmi://10.91.25.201:9080/jmxrmi", "user":"", "password":"" }}'

presto 지표를 하나 살펴보면 아래와 같다.

curl -L 'http://jolokia_주소/jolokia' -X POST -d  '{ "type":"read", "mbean":"presto.execution:name=QueryManager", "attribute":"CpuInputByteRate.AllTime.P50", "target": { "url":"service:jmx:rmi:///jndi/rmi://10.91.25.201:9080/jmxrmi", "user":"", "password":"" }}'

bulk read

조회해야 되는 지표가 여러개면 아래와 같이 array 타입으로 request를 던져 response를 받아 올 수 있다.

curl -L 'http://jolokia_주소/jolokia' -X POST -d  '[{ "type":"read", "mbean":"java.lang:type=Memory", "attribute":"HeapMemoryUsage", "path": "used", "target": { "url":"service:jmx:rmi:///jndi/rmi://10.91.25.201:9080/jmxrmi", "user":"", "password":"" }},{ "type":"read", "mbean":"java.lang:type=Memory", "attribute":"HeapMemoryUsage", "path": "used", "target": { "url":"service:jmx:rmi:///jndi/rmi://10.91.25.201:9080/jmxrmi", "user":"", "password":"" }}]'

참고자료