Prometheus와 Grafana를 활용한 Spring Boot 애플리케이션 모니터링 시스템 구축하기
안녕하세요! 오늘은 Spring Boot 애플리케이션의 성능과 상태를 모니터링하기 위한 Prometheus와 Grafana 설정 방법에 대해 알아보겠습니다. 실시간으로 애플리케이션의 상태를 시각적으로 확인할 수 있는 모니터링 시스템을 구축해 봅시다.
Prometheus란?
- 메트릭을 저장하고 관리하는 도구 중 하나
- 데이터와 메트릭을 저장하고 애플리케이션의 성능 및 상태 모니터링을 제공
- 프로메테우스는 메트릭을 받아서 저장만 하지, 메트릭 자체를 수집하지 않는다.
아키텍처
Metric이란?
서버의 상태를 측정한 항목이나 지표
CPU 사용량, 메모리 사용량, 디스크 공간, 네트워크 트래픽, 요청 처리량, 응답 시간 등이 해당됩니다.
Push/Pull 방식의 차이
1. Pull 방식
- 프로메테우스 등 대부분의 모니터링 시스템에서 사용하는 방법
- 수집 대상 시스템에서 메트릭 데이터를 추출
- 프로메테우스 서버가 주기적으로 해당 시스템에 메트릭을 요청(프로메테우스 서버가 메트릭을 가져온다.)
- 수집 대상 시스템에서 수집되는 메트릭 데이터의 시기를 정확히 알 수 있다.
- 메트릭 수집에 실패한 경우 이유를 파악할 수 있다.
2. Push 방식
- 수집 대상 시스템에서 메트릭 데이터를 추출한 후 pushgateway와 같은 중간 서버에 전송
- 수집 대상 시스템에서 프로메테우스 서버로 직접 메트릭 데이터를 전송할 수 있어 부하를 줄일 수 있다.
- pushgateway를 사용하면 일시적인 메트릭 데이터 손실을 방지
Grafana란?
- GUI를 지원하는 데이터 시각화 툴
- 프로메테우스에서 수집한 데이터를 그라파나를 통해 시각화하고 대시보드 형태로 표시
모니터링 시스템 구축하기 (for Spring)
모니터링 서버 고려사항
- docker-compose를 이용하여 docker container를 띄우는 방법 선택
💡 참고
같은 EC2 서버에 두게 된다면, 메인 서버가 터지면 모니터링 서버까지 터진다.
구축 과정
1. 스프링 부트 프로젝트에 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
2. application-prod.yml 설정
spring:
application:
name: 프로젝트 이름
management:
endpoints:
web:
exposure:
include: "prometheus"
metrics:
tags:
application: ${spring.application.name}
3. docker-compose.yml 생성
version: '3.7'
services:
prometheus:
image: prom/prometheus #도커 이미지 명
container_name: prometheus #원하는 컨테이너 명을 입력해줍니다.
volumes:
- ~/prometheus/config/:/etc/prometheus/
- ~/prometheus/prometheus-volume:/prometheus
ports:
- '9090:9090'
command:
- '--web.enable-lifecycle'
- '--config.file=/etc/prometheus/prometheus.yml'
restart: always
networks:
- monitor-network
4. Prometheus 설정 파일 생성 (~/prometheus/config/prometheus.yml)
global:
scrape_interval: 15s
scrape_timeout: 15s
external_labels:
monitor: 'goodjob-monitor'
query_log_file: saved.log
scrape_configs:
- job_name: 'goodjob'
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: '/actuator/prometheus'
honor_labels: false
honor_timestamps: false
scheme: 'https'
static_configs:
- targets: ['www.waveofmymind.shop']
labels:
service: 'monitor-1'
설정 항목 설명:
- scrape_interval: 데이터를 가져오는 빈도, 15초마다 가져오도록 설정
- scrape_timeout: 위에서 데이터를 가져오는 작업이 완료되기를 기다리는 시간을 설정
- evaluation_interval: 알람 규칙이 평가되는 빈도
- external_labels: 모든 시계열에 추가되는 라벨 설정
- query_log_file: 쿼리 로그를 기록할 파일의 경로(이름 변경 자유)
- job_name: job의 이름, 유니크한 것으로 설정
- metrics_path: 아까 스프링부트 프로젝트에서 정의한 프로메테우스 경로
Grafana 설정하기
도커로 서비스가 올라간 후에는 아래 단계를 따라 Grafana를 설정합니다.
1. 그라파나 접속
- 기본 포트는 3000번입니다. (http://서버주소:3000)
- 기본 로그인 정보: admin/admin
2. Prometheus와 연결
Grafana를 통해 메트릭 정보를 수집하기 위해서는 Data Source를 추가해야 합니다.
2-1. 메인화면에서 Data Sources 버튼 클릭
2-2. Data Sources에 Prometheus 선택
2-3. Prometheus 서버 URL 입력 및 연결 확인
3. Dashboard 추가
3-1. Grafana 대시보드 사이트에서 템플릿 찾기
https://grafana.com/grafana/dashboards/ 에서 원하는 템플릿을 찾습니다.
3-2. 원하는 대시보드 ID 복사
원하는 대시보드를 찾고 ID를 복사한 후, Grafana로 돌아와 Dashboards 버튼을 클릭합니다.
3-3. Import 버튼 클릭
3-4. 복사한 대시보드 ID 붙여넣기
복사한 대시보드 ID를 붙여넣고 Load 버튼을 클릭합니다.
3-5. Data Source로 Prometheus 선택
다음 페이지에서 Prometheus를 선택합니다.
이렇게 하면 대시보드가 성공적으로 추가되어 데이터가 시각화됩니다.
동작 과정 요약
- Spring Boot 애플리케이션에서 Actuator를 통해 메트릭 노출
- Prometheus가 해당 메트릭을 수집하여 저장
- Grafana가 Prometheus에서 데이터를 가져와 시각화
이렇게 Spring Boot 애플리케이션에 Prometheus와 Grafana를 연동하여 모니터링 시스템을 구축하는 방법에 대해 알아보았습니다.
실제 운영 환경에서는 알람 설정 등을 추가하여 더욱 효과적인 모니터링 시스템을 구축할 수 있습니다.
다음에는 더 자세한 모니터링 대시보드 설정 방법과 알람 구성에 대해 다뤄보겠습니다.