Spring Boot + Prometheus + Grafana 로 모니터링 구축
개요
Spring Actuator, Prometheus, Grafana, Thanos 등 개념공부를 해보았으니 이제 직접 모니터링 시스템을 구축해 보도록 하겠습니다.
본 글에서는 Actuator, Prometheus, Grafana에 대해 어느정도 알고 계신다고 가정하고 docker를 활용하여 모니터링 시스템을 구축하겠습니다.
Prometheus, Grafana를 직접 설치하는 예제들도 존재하므로 docker를 활용하고 싶지 않은 분들은 다른 분들의 글을 참고하시면 좋을 것 같습니다.
개념공부를 하면 정리했던 글들을 모아보았습니다. 필요하신 분들은 참고하시면 좋을 것 같습니다.
- Spring Actuator란?
- 프로메테우스란 무엇인가?
- Spring Actuator health check 주의사항
- 내가 만든 ThreadPool 모니터링 하기
- Grafana란?
- Thanos란?
모니터링이 필요한 이유?
또는 CPU 사용량, 메모리 사용량 등 시스템의 현재 상태를 확인하려면 어떻게 해야 할까요?
이 또한 현재 서버가 구동되는 환경에 접근하여 현재 상태를 확인하면 될까요?
1시간마다 정해진 시간에 CPU 사용량, 메모리 사용량을 확인하면 될까요?
운영하는 서비스에 장애가 발생하거나 버그가 발생한 경우에는 어떻게 해야 할까요?
EC2 등에 접근해서 Exception이 발생한 로그를 확인해야 할까요?
장애나 버그가 발생한 건 어떻게 인지할 수 있을까요?
사용자가 제보하거나 1시간마다 모든 기능을 테스트하는 건 너무 비효율적일 것 같습니다.
모니터링 시스템을 활용하면 주요 지표에 대한 적절한 알림 경고를 통해 버그, 장애가 발생한 상황을 인지할 수 있으며 에러 로그들을 빠르게 확인할 수 있습니다.
모니터링 시스템 아키텍처 구조
Spring Boot Actuator를 사용하여 /actuator/premetheus 경로로 Promethesus에서 사용할 메트릭 정보를 외부에 노출합니다.
메트릭 정보를 Promethues는 일정시간마다 주기적으로 pull 해와서 수집합니다.
Prometheus에서 수집된 메트릭은 Grafana가 Query를 통하여 사용자가 볼 수 있도록 시각화를 할 때 사용합니다.
Docker 기반으로 모니터링 시스템 구축하기
코드는 github에서 확인할 수 있습니다.
build.gradle.kts
implementation ("org.springframework.boot:spring-boot-starter-actuator")
runtimeOnly ("io.micrometer:micrometer-registry-prometheus")
actuator와 prometheus관련된 micrometer 의존성을 추가해 줍니다.
application.yml
management:
endpoints:
web:
exposure:
include: "*"
# include: prometheus << 이렇게 해도됩니다.
Prometheus에서 사용되는 메트릭 엔드포인트를 노출시키기 위해서 전체를 노출시켰습니다.
Spring Boot Application 실행
http://localhost:8080/actuator/prometheus
위의 endpoint에 접근하게 되면 여러 가지 메트릭 정보들을 확인할 수 있습니다.
Prometheus & Grafana 설치
prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: prometheus
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080']
promethues에 대한 설정을 작성해 줄 수 있습니다.
메트릭을 수집할 주기, 메트릭을 수집할 경로, 어떤 호스트에서 수집할지에 대한 내용들을 작성할 수 있습니다.
Promethues는 docker 환경에서 구동되고 있고 내 컴퓨터 localhost에 접근하기 위해서는 host.docker.internal을 활용합니다.
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
앞서 작성했던 prometheus의 설정을 등록해 줍니다.
docker-compose up -d 명령어를 활용하여 Prometheus & Grafana를 실행할 수 있습니다.
Prometheus 실행
localhost:9090/graph
localhost:9090/targets
2개의 endpoint에 접근하여 Prometheus가 정상적으로 구동되고 있는지 확인할 수 있습니다.
localhost:9090/graph
logback_events_total 으로 Execute 버튼은 클릭하면 메트릭 정보를 조회할 수 있습니다.
localhost:9090/targets
targets경로로 접근하면 host로 작성했던 EndPoint와 서버의 상태를 확인해 볼 수 있습니다.
Grafana 실행
http://localhost:3000
3000번 포트를 통해 Grafana를 실행할 수 있습니다.
기본 id/password는 admin/admin 입니다.
DATA SOURCES로 접근합니다.
이후 Prometheus를 Database로 선택합니다.
Connection에 http://host.docker.internal:9000 을 입력해 줍니다.
Grafana는 docker 환경에서 구동되고 있고 내 컴퓨터 localhost에 접근하기 위해서는 host.docker.internal을 활용합니다.
9000번 포트는 Prometheus 접근 포트입니다.
이후 하단의 Save & test
대시보드를 직접 구성할 수도 있지만 잘 구성된 dashboard를 import 해서 활용할 수 있습니다.
JVM(Micrometer) 대시보드를 활용할 수 있습니다.
dashboard ID인 4701을 입력하고 Load를 적용합니다.
아까 설정했던 prometheus database를 선택해 주고 import를 눌러주면 끝입니다.
완성~
참고자료
https://velog.io/@roycewon/Spring-boot-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81Prometheus-Grafana-docker
https://hudi.blog/spring-boot-actuator-prometheus-grafana-set-up/
https://meetup.nhncloud.com/posts/237