리그캣의 개발놀이터

jvm / java / spring tomcat apm monitoring 구축하기 본문

인프라/APM

jvm / java / spring tomcat apm monitoring 구축하기

리그캣 2020. 1. 29. 20:03

jvm?

java virtual machine의 줄임말이며 java byte code를 os에 맞게해주는 역할을 한다. 

JAVA compiler는 .java 파일을 .class라는 java byte code로 변환시켜주는데 . 이러한 java byte code 같은 경우에는 기계어가 아니기 때문에 os에서 바로 해독할 수 없다. jvm은 os가 bytecode를 이해할 수 있도록 해석해주는 역할을 한다.

 

이러한 jvm은 해석하는 과정이 있기 때문에 c언와 같은 native 언어에 비해 속도가 느렸지만 jit(just in time) 컴파일러를 구현해 이점을 극복했다.

Byte Code는 JVM 위에서는 OS에 상관없이 실행된다는 장점이 있다.

ref : https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2

 

위와 같은 장점으로 인하여 많은 엔터프라이즈 기업에서는 JVM을 사용하고 있다. JVM을 monitoring 할 수 있는 대시보드 프로토타입을 구축해보고자 한다.

JVM Exporter + Prometheus + Grafana

나는 위와 같은 조합으로 프로토타입을 구축하려고 한다.

 

JVM exporter는 jvm이 동작하는 노드에서 작동하며 해당 jvm에 대한 metric 정보를 http로 뿌려주는 역할을 한다

prometheus는 다들알겠지만 메트릭에 대한 정보를 가져와 손쉬운 쿼리를 제공한다

grafana는 대시보드로 메트릭에 대한 정보를 그래프화 하거나 수치로 표현할때 적합하다.

 

위의 내용들은 지극히 개인적인 생각이다. 다만, 나는 개인적으로 prometheus + grafana 조합을 사용하여 여러가지 metric에 대한 구축을 해본 결과 문제가 없다. (가끔 Nodata 나는데 이것은 네트워크 문제였다.)

 

prometheus와 연계된 exporter는 여러가지가 있다. 아래 링크를 참고하자

https://prometheus.io/docs/instrumenting/exporters/

 

jmx exporter라는 것을 찾았고 해당 exporter를 사용해보기로 하였다.(위에 링크에서 안나오길래 따로 구글링하였다.)

https://github.com/prometheus/jmx_exporter

JMX Exporter

prometheus 용 exporter이다.

java agent로 실행되며 jvm의 metric을 html로 제공하는 역할을 한다. 

독립적인 환경에서 실행될 수 있지만 이는 구성하기 어렵기에 추천하지 않는다고 써있다.

 

내용을 보다보니,  일단 사용하는 서비스의 .jar파일이 있어야하고 추가적으로 maven이 설치가 되어있어야 하는것같다.

maven 설치는 posting을 해놓앗다. centos가 아니라도 해당방식으로 진행하면 될것으로 보인다.

maven 설치하기 : https://league-cat.tistory.com/367 

 

jar 파일이란?

jar 파일은 Java Archive로 java class 파일과 여러 메타 파일들을 하나로 모아 묶어놓아 배포하기 쉽게 만드는 파일.

 

sample용 jar파일 구하기

jar file을 받아 보자

$ cd {workspace}

$ git clone https://github.com/hengyunabc/spring-boot-fat-jar-jsp-sample.git

 

만들어진 jar파일을 실행해보자

$ cd spring-boot-fat-jar-jsp-sample

$ mvn clean package -DskipTests

$ java -jar jsp-start/target/jsp-start-0.0.1-SNAPSHOT.jar

 

웹이 구동되는 것을 확인할 수 있다 (8080 포트)

 

이것을 이름을 sample.jar로 변경하고 workspace 공간에 넣자

$ mv jsp-start/target/jsp-start-0.0.1-SNAPSHOT.jar ../sample.jar

 

일단 sample.jar를 구하게 되었다.

 

어떻게 java metric을 prometheus에서 수집할것인가?

prometheus는 오픈 소스 시계열 데이터베이스이다. 

아래 아키텍처를 봐보자

 

  1. Java App이 실행되고 있다. 우리는 해당 java app을 위에서 만들 sample.jar라고 볼 것이다.

  2. sample.jar에서 수집된 metric은 JMX Exporter라는 오픈소스 exporter를 통해 노출이 될것이다.

  3. Prometheus라는 시계열 데이터베이스는 JMX Exporter에 접근하여 pull방식으로 metric 정보를 수집하게 된다.

  4. Grafana는 metric을 그래프로 표현해주는 대시보드이다.

  5. PromQL 문을 통해서 prometheus 에서 특정 metric만 가져온다.

위와 같은 방식으로 동작할 것이다. alertmanager는 prometheus에서 slack이나 mail등의 사용자에게 massage push를 주는 기능이라고 생각하면 된다. 예를들어 cpu나 중점 하드웨어 사용률이 80%가 넘으면 alert를 보내 사용자에게 인지시킬 수 있다는 기능이있다.

 

jmx에 대한 자세한 설명 : https://docs.oracle.com/javase/tutorial/jmx/overview/index.html

 

  • JMX prometheus jar download

$ wget  https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.12.0/jmx_prometheus_javaagent-0.12.0.jar

 

  • 다운로드 된 파일 확인 (이전에 sample.jar를 저장해 둔 곳에 위치)

$ ls


jmx_prometheus_javaagent-0.12.0.jar  sample.jar

 

  • config.yaml 파일 작성(같은 위치)

 

---

startDelaySeconds: 0

ssl: false

lowercaseOutputName: false

lowercaseOutputLabelNames: false

 

  • 실행(your workspace 위치에서)

$ java -javaagent:./jmx_prometheus_javaagent-0.12.0.jar=80:config.yaml -jar sample.jar

java -javaagent:./jmx_prometheus_javaagent-0.12.0.jar=80:config.yaml -jar sample.jar

 

  .   ____          _ __ _ _

 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )

  '  |____| .__|_| |_|_| |_\__, | / / / /

 

위와 같이 실행이 되어야한다.

 

그러면 8080포트가 아닌 80 포트로 들어가주자

 

http://{yourip}/metrics

위와 같이 뜨면 성공이다 metric을 수집 하게 되었다.

 

Prometheus

prometheus에 대한 설명은 따로 진행하지 않겠다 추가적으로 우리는 prometheus를 docker로 동작시킬것이다  도커를 기본적으로 설치하도록 하자 

docker 설치하기 : https://league-cat.tistory.com/317

 

prometheus user 생성 or workspace 생성

나는 prometheus라는 user를 생성하고 그곳을 workspace로 삼았다.

 

prometheus.yml 작성

prometheus의 기본적인 구성은 prometheus.yml에 저장된다.

나는 기존에 작업했던 prometheus.yml이 많아 다른이름으로 저장했다

 

  • yml 작성 (prometheus-jvmr.yml)

$ cd /home/prometheus/

$ ls

prometheus-application.yml  prometheus-cadvisor.yml

prometheus-blackbox.yml     prometheus-node-exporter.yml

$ vi prometheus-jvm.yml

 

yml 내용

global:

  scrape_interval: 15s

  external_labels:

    monitor: 'jvm-monitoring'


scrape_configs:

  - job_name: 'jvm-monitoring'

    scrape_interval: 5s

    static_configs:

      - targets: ['{ip}:80']

 

이렇게 config를 구성해놓으면 prometheus에서 {ip}:80/metrics 에 접근하여 metric들을 pull해 온다. 

 

prometheus docker container 구동

prometheus를 이제 구동해보자

 

  • promethesus 구동시 기본명령어는 아래와 같다.(버전 1.7.0 기준)

docker run -d -it --name prometheus-blackbox -p {hostport}:9090 -v {host yml 위치}:/etc/prometheus/prometheus.yml prom/prometheus:v1.7.0

 

  • 나는 보통 port를 변경해서 쓰기에 다음과 같이 구성하였다

docker run -d -it --name prometheus-jvm -p 31869:9090 -v /home/prometheus/prometheus-jvm.yml:/etc/prometheus/prometheus.yml prom/prometheus:v1.7.0

 

{ip}:31869 or {ip}:9090으로 접속해보면 다음과 같이 뜬다

[status] -> [target]에 보면 연동이 잘되었는지 확인가능하다.

연동이 잘 되어있다면 up으로 뜰 것이다.

 

이제 prometheus도 metric을 수집하고 있다. 마지막으로 grafana를 띄어보겠다

Grafana

grafana 실행

grafana는 다음과 같은 명령어로 띄우면 된다

docker run -d --name grafana -e GF_SECURITY_ADMIN_PASSWORD=admin -p 3000:3000 grafana/grafana:6.4.2

 

위와 같이 띄우면 기본적으로 3000 포트에 grafana가 띄어진다

id : admin

pw : admin

 

grafana prmetheus 연동

으로 로그인해보자

[configuration] -> add data source로 방금 구축한 prometheus를 추가해주자

 

url로 prometheus url:31869 를 입력해주고 Save & Test를 작동하여 정상적으로 연동되는지 확인하면 된다

아참 이름은 Prometheus-jvm으로 설정해준다.

 

grafana dashboard 구축

 

우리는 아래의 대시보드를 사용할 것이다.

https://grafana.com/grafana/dashboards/7727

 

대시보드를 사용하는 방법은 간단하다

dashboard -> import 후 해당하는 dashboard의 넘버를 넣어주면 된다 위의 대시보드 넘버는 7277 이다

대시보드 넘버를 입력하고 데이터 소스를 이전에 만들었던 Prometheus-jvm 으로 설정하면된다

그러면 다음과 같이 대시보드가 구성된다

 

그 외의 문의사항은 언제든지 환영합니다 !!




참고 

https://www.openlogic.com/blog/prometheus-java-monitoring-and-gathering-data

https://github.com/hengyunabc/spring-boot-fat-jar-jsp-sample

 

'인프라 > APM' 카테고리의 다른 글

krakend api exporter monitoring 구축  (3) 2020.01.30
Comments