[server] spring boot + 프로메테우스, 그라파나를 활용한 모니터링 실습 (1/2)
메트릭(Metric) 이란?
메트릭(Metric)이란 시스템이나 애플리케이션의 성능, 상태, 동작 등을 측정하고 모니터링하기 위한 지표.
스프링부트에서 이러한 메트릭(Metric)의 수집은 마이크로미터(MicroMeter) 모듈을 내장한 액츄에이터(actuator)가 담당한다. 그럼 이 메트릭 정보를 직접 확인해보자.
build.gradle - actuator 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-actuator'
application.yml
management:
# Spring Boot 액추에이터의 웹 엔드포인트 중 어떤 것들을 노출할 것인지 지정
endpoints:
web:
exposure:
include: "*" # 모든 엔드포인트 노출
위와 같이 설정한 후에 http://localhost:8080/actuator/metrics 에 접속해보자.
사진과 같이 액츄에이터가 어떠한 정보를 수집하는지 JSON 형태로 확인할 수 있다.
하지만 이렇게 수집한 메트릭 정보들은 시간에 따라 계속해서 쌓이기 때문에 application의 메모리에서 이를 관리하는 것은 좋지 않다. 따라서 이러한 메트릭 정보를 저장하기 위한 DB로 프로메테우스를 사용할 수 있다.
프로메테우스는 마이크로미터가 수집한 데이터를 일정시간 간격으로 가져와 DB에 수집한다. 이 때 마이크로미터는 위에서 확인할 수 있듯 수집한 메트릭을 JSON 형식으로 전달하지만 프로메테우스는 JSON 데이터를 처리하지 못한다. 따라서 마이크로미터와 프로메테우스 사이에 JSON 형식을 프로메테우스가 처리 가능한 형식으로 바꿔주는 구현체가 필요하고, 이것에 MicroMeter Prometheus 구현체이다.
그럼 이제 메트릭 정보를 프로메테우스로 가져와보자.
build.gradle - 프로메테우스 의존성 추가
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
application.yml
management:
# Spring Boot 액추에이터의 웹 엔드포인트 중 어떤 것들을 노출할 것인지 지정
endpoints:
web:
exposure:
include: "*"
# Micrometer 를 통해 수집된 Metric 데이터를 Prometheus 형식으로 노출할지 여부를 결정
prometheus:
metrics:
export:
enabled: true
위와 같이 설정해주면 JSON 정보를 프로메테우스 포맷으로 변경시킬 수 있다.
localhost:8080/actuator/prometheus 경로로 접속하면 위와 같이 변형된 형태의 메트릭 데이터를 볼 수 있다.
docker-compose.yml - 프로메테우스, 그라파나 서버 실행
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
ports:
- "9090:9090"
networks:
- monitoring-network
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
networks:
- monitoring-network
networks:
monitoring-network:
driver: bridge
프로메테우스 서버를 실행하기 위해 도커 컨테이너를 활용했다. 그라파나를 이용한 모니터링 시각화도 진행하기 때문에 docker-compose 파일을 작성해서 함께 실행되도록 했다.
위 파일이 있는 위치에서 docker-compose up -d 명령어를 사용해서 9090 포트에서 프로메테우스를, 3000번 포트에서 그라파나 서버를 실행해준다.
localhost:9090으로 접속하면 위와 같이 프로메테우스 화면을 볼 수 있다.
prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: prometheus
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080']
마지막으로 프로메테우스 서버가 localhost:8080/actuator/prometheus 경로를 바라볼 수 있도록 설정을 바꿔준다.
scrape_interval 을 통해 n초 마다 메트릭 데이터를 수집하도록 설정해 줄 수 있다.
localhost:9090/targets 에 접속했을 때 아래와 같은 화면이 나오면 성공이다.
sysyem_cpu_usage 쿼리를 실행하고 Graph에 들어가보면 사진과 같이 정상적으로 메트릭 데이터를 수집하는 것을 볼 수 있다.
프로메테우스는 메트릭 데이터를 DB로 가져오는 것이 주 목적이기 때문에 더 나은 모니터링을 위해서는 그라파나를 통해 메트릭 데이터를 시각화할 수 있다. 그라파나를 활용한 시각화는 다음 포스트에서 다뤄보겠다.
출처
https://lordofkangs.tistory.com/327