Jolokia + Elasticsearch 를 활용한 JVM metric 시스템의 단점과 prometheus API 를 이용한 보완

Namhoon Kim
3 min readJan 22, 2020

Java application 을 개발 하다 보면 예기치 못하게 memory leak 의 이슈로 application 이 죽는 경우가 있다. 이를 미연에 방지하기 위해서는 JVM metric monitoring 을 통해 heap 에 점유하는 메모리가 지속적으로 증가 하는지 살펴봐야 한다. Java 진영에서는 전통적으로 JMX 기술을 이용해서 JVM 의 상태를 관찰하는데 이 글에서는 Jolokia 와 Elasticsearch 를 이용해 JVM 의 metric 을 수집하고 조회하는 방법에 대해 다루려고 한다.

JMX (Java Management Extensions) 기술은 Java platform 에 기본으로 포함된 기술로 application 의 여러가지 resource 를 동적으로 모니터링 하고 관리할 수 있게 해준다. 또한 JVM (Java Virtual Machine) 도 모니터링 및 관리를 할 수 있다. [1]

Jolokia [2] 는 HTTP protocol 을 활용해 jmx 를 이용할 수 있도록 해준다. 사용하기 편리하며, spring boot 에서는 actuator 라이브러리에 org.jolokia:jolokia-core dependency 를 추가하고 property 를 바꿔주는 것으로만으로 간단히 연동시킬 수 있다. [3]

실제로 jolokia + actuator 의 연동으로 jvm metric 수집은 굉장히 간단하고 잘 작동되었다. 하지만 jolokia 가 servlet 기반으로 되어 있어 webflux 기반의 spring application 에서는 작동하지 않았다. 관련된 내용을 찾아본 결과 향후에도 webflux 에서도 동작되게끔 feature 를 추가 할 일은 없어 보였다 [4]

현재 사내에서는 다수의 servlet 기반 application 서버와 소수의 webflux 기반 서버가 존재하고 있다. jolokia 를 이용해 JVM metric 을 수집하는 것은 전사를 대상으로 구축하기에는 무리가 있어, 실제로는 spring-boot-actuator, micrometer-registry-prometheus, Metric Beat 의 Prometheus module, ELK stack 을 활용해서 metric 을 수집하여 JVM 모니터링 시스템을 구축하였다. 실제로 구축된 페이지의 모습은 다음과 같다.

References
[1] https://docs.oracle.com/javase/tutorial/jmx/overview/index.html
[2] https://jolokia.org/
[3] https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-jolokia
[4] https://github.com/spring-projects/spring-boot/issues/17647

--

--