우아한테크코스/레벨4

Spring Actuator, Prometheus, Grafana를 사용한 모니터링 대시보드 구축

MINGYUM 2024. 10. 21. 22:56


Spring Actuator, Prometheus와 Grafana를 사용해 JVM의 정보를 모니터링 대시보드에 보여주기 위한 시스템을 구축하였다.

🍃 Spring Actuator

Spring Actuator는 스프링 애플리케이션에서 CPU나 메모리 사용량 등을 확인하기 위한 지표를 제공하고 관리하기 위한 도구이다.

    implementation 'org.springframework.boot:spring-boot-starter-actuator'

 
해당 의존성을 추가하면 Spring Actuator를 사용할 수 있다.
 
아래와 같이 application.yml에 애플리케이션의 상태를 노출할 경로를 지정해주면 해당 엔드포인트에서 지표의 값을 확인할 수 있다.

management:
  endpoints:
    web:
      exposure:
        include: prometheus
  endpoint:
    health:
      show-details: always

 

이 경우 localhost:8080/actuator/prometheus 와 같이 입력하면 아래와 같이 스프링이 제공하는 기본 지표의 값을 확인할 수 있다.

 
여기서 Prometheus와 연동하여 Spring Actuator에서 수집한 데이터를 전송하기 위한 도구로 Micrometer를 사용한다.
Micrometer는 아래 의존성을 추가하여 구현할 수 있습니다.

    implementation 'io.micrometer:micrometer-registry-prometheus'

 

🔥 Prometheus

스프링이 수집한 지표를 실시간으로 관리하기 위한 Prometheus는 하나의 시계열 데이터베이스다. 주기적으로 Metrics를 수집하고 시간에 따른 변화를 기록하여 노출하는 역할을 한다. 
 
프로메테우스를 다운로드하고 내부에 위치한 prometheus.yml을 아래와 같이 수정한다.

global:
  scrape_interval: 15s // (1)

scrape_configs: 
  - job_name: "prometheus" // (2) 
    metrics_path: '/actuator/prometheus' // (3) 
    static_configs:
      - targets: ["localhost:8080"] // (4)

 
(1) 15초 간격으로 지표를 수집한다.
(2) 수집할 작업을 식별하기 위한 이름을 작성한다.
(3) 수집할 엔드 포인트를 입력한다. 
(4) 지표 수집 대상인 서버의 주소와 포트를 입력한다.
 
yml 파일과 실행 파일이 있는 디렉토리에서 아래 명령어를 입력하여 프로메테우스를 실행한다. 기본적으로 9090 포트에서 프로그램이 실행된다.

./prometheus --config.file=prometheus.yml

 

 
localhost:9090에 접근하면 지표를 검색할 수 있는 프로메테우스가 띄워져 있다. 
위와 같이 수집할 지표를 입력하면 시간에 따른 지표의 값이 표시되는 것을 확인할 수 있다.

⭐⭐ Trouble Shooting

윈도우에서 프로메테우스 실행 파일을 눌렀을 때 CMD 창이 사라지는 현상이 있었다. 
로그를 확인하지 않은 채 문제의 원인을 모르다가 😂 CMD에서 명령어를 실행하여 로그를 
 

🦐 Grafana

 
Grafana(그라파나) 는 수집한 시계열 데이터를 대시보드 형태로 시각화하는 도구이다.  
 
그라파나 다운로드 후 Prometheus와 연동해주면 된다. 
그라파나를 실행하면 자동으로 3000 포트로 연결된다. 로컬 설치 기준 localhost:3000으로 접근하면 아래와 같이 그라파나 메인 페이지가 뜬다.

 
첫 로그인 시 username에 admin, password에 admin을 입력해준다.
DataSource > Add new data source 를 클릭하고 Prometheus를 선택한다.

 
그리고 아래 부분에 연결할 URL을 작성해주면 된다. 그라파나와 프로메테우스를 같은 로컬 환경에 설치하였다면 http://localhost:9090으로 입력하고 바로 Save & Test 를 진행한다. 

⭐⭐ Trouble Shooting

나는 이상하게 윈도우 환경에 그라파나가 잘 설치되지 않아서 도커를 사용해서 설치하였다. 
 
이 경우 그라파나는 도커 가상 환경에, 프로메테우스는 로컬 환경에서 동작하기 때문에 localhost로 동작하지 않는다. 컨테이너 내부의 환경을 가리키게 되기 때문이다.
따라서 이런 경우 localhost:9090 대신 host.docker.internal:9090 을 입력하여호스트 시스템을 바라보도록 작성해준다.

 
마지막으로 JVM에서 수집된 정보를 그라파나 대시보드에서 쉽게 확인하기 위하여 Micrometer를 활용할 차례이다.
 
그라파나 화면에서 Dashboards > import dashboard 를 입력한다.

 
https://grafana.com/grafana/dashboards/4701-jvm-micrometer/

JVM (Micrometer) | Grafana Labs

JVM (Micrometer) A dashboard for Micrometer instrumented applications (Java, Spring Boot, Micronaut). Features JVM memoryProcess memory (provided by micrometer-jvm-extras)CPU-Usage, Load, Threads, Thread States, File Descriptors, Log EventsJVM Memory Pools

grafana.com

 
해당 경로의 대시보드를 불러와서 생성한다.
생성한 대시보드에 들어가면 이렇게 지표들에 대한 수치가 보여지는 것을 확인할 수 있다.

 
 
 
 
참고
 
프로메테우스 공식문서

Getting started | Prometheus

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

트러블 슈팅 참고 이슈

tsdb.HandleRequest() error Post "http://localhost:9090/api/v1/query_range": dial tcp [127.0.0.1:9090](http://127.0.0.1:9090/): c

What happened: All of a sudden alerts started coming with below error note. tsdb.HandleRequest() error Post "http://localhost:9090/api/v1/query_range": dial tcp 127.0.0.1:9090: connect: connection ...

github.com