Spring Boot 애플리케이션과 Prometheus를 통합하여 애플리케이션의 메트릭 데이터를 수집하고 모니터링하는 방법에 대해 알아보자. Prometheus는 강력한 모니터링 및 경고 도구로, Spring Boot와의 통합을 통해 애플리케이션 상태를 실시간으로 확인하고 성능을 최적화할 수 있다.

Prometheus는 CNDF에 소속된 오픈 소스 모니터링 시스템으로, 메트릭 기반 데이터 수집과 경고 기능을 제공한다. 주 목적이 시계열 데이터를 처리하는 것이다. CPU, 메모리 사용량 같은 Metrics 데이터에 대한 APM 구축을 목표로 두었다. 때문에 MSA 형태 컨테이너 서비스, 대규모 서버 클러스터 모니터링 등에서 사용한다. 또한 PromQL을 사용하여 다차원 데이터 모델을 활용할 수 있다.
JSON이 데이터를 "어떻게 담을지"에 집중한다면, PromQL은 데이터를 "어떻게 뽑고 해석할지"에 집중한다./api/users와 /api/posts 각각에 메트릭 기록 가능그럼 어째서 Prometheus 사용하는가? 다른 APM 보다 Prometheus가 각광 받을까? Time-series DB는 프로메테우스만 있는 것은 아닌데, 왜 굳이 프로메테우스를 선택해야 할까? 단순히 'Kubernetes와 잘 맞는다'는 이유만으로 Prometheus를 선택하는 것은 부족하다.
1. 개발자 중심의 설계: Prometheus는 처음부터 개발자와 운영자(SRE, DevOps)를 위한 도구로 설계되었다.
2. 자체 스토리지와 고성능 수집기: Prometheus는 외부 DB에 의존하지 않고 자체 Time-Series DB를 갖고 있다.
3. 플러그인 없는 확장성: Prometheus는 exporter 기반으로 구성되어 있어, JVM, DB, Redis, Nginx, Kafka, 시스템 리소스 등 다양한 메트릭을 단순한 exporter 설정만으로 수집 가능
4. 커뮤니티 생태계와 지속적인 발전: Prometheus는 Kubernetes와 함께 가장 활발한 오픈소스 프로젝트 중 하나로, 수많은 exporter, 대시보드 템플릿, 베스트 프랙티스가 공유되고 있다.
5. 알람과 자동화의 완성도: Prometheus는 단순 조회를 넘어서 알람(Alertmanager)과 연동해 Slack, Email, Webhook 등으로 경고를 보낼 수 있다.
6. 유연하고 안전한 Pull 기반 구조: Prometheus는 기본적으로 HTTP Pull 방식으로 메트릭을 수집한다.
Prometheus 장점에 대해서 정리해 보았는데 가장 큰 장점은 Metrics를 가져올 때 Pull 방식으로 동작한다는 것이다.
Metrics를 가져오기 오는 방식은 pull, push 로 나뉘는데 Prometheus는 pull 방식으로 가져온다.

왜 비효율적일까?
Push 방식은 애플리케이션 내부에 에이전트를 직접 설치하여 실시간 APM 서버로 Metrics 를 보낸다. 애플리케이션에 내장 되어 있는 에이전트의 유연하게 변경하기 어렵고, APM 서버가 장애가 발생했을 때도 애플리케이션에서 계속 APM 서버에 불필요하게 요청이 발생할 수 있다.

왜 효율적일까?
내부의 Micrometer + Actuator 가 APM 서버에 의존하지 않고 메트릭 데이터를 보관한다. 그 후 Prometheus가 주기적으로 따로 요청해서(Pull) 가져가는 구조이다. 둘은 동시에 동작하지만 서로 독립적이기 때문에, 성능에도 큰 부담이 없고, 아주 유연하게 모니터링이 가능하다. 그래서 사용자 코드 개입이 거의 없다.

Spring Boot Actuator는 애플리케이션의 상태를 모니터링하고 관리할 수 있는 다양한 기능을 제공한다. Prometheus와의 통합은 Micrometer라는 라이브러리를 통해 이루어지며, Micrometer는 다양한 모니터링 시스템과의 연동을 지지원한다.
Spring Boot 프로젝트에 Prometheus와 Micrometer를 통합하려면 다음과 같은 의존성을 추가
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
Spring Boot Actuator를 통해 /actuator/prometheus 엔드포인트를 활성화. application.properties 설정을 추가
management.endpoints.web.exposure.include=prometheus
Prometheus는 다양한 운영 체제에서 설치가 가능
공식 Prometheus 다운로드 페이지 설치 후 prometheus.yml 파일을 통해 기본 설정을 구성이 가능
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'spring-boot-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080']
prometheus.yml 파일을 구성하고
docker run -d \
-p 9090:9090 \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
--name prometheus \
prom/prometheus
Spring Boot 애플리케이션이 실행되면 /actuator/prometheus 엔드포인트에서 기본 메트릭 데이터를 확인할 수 있습니다. 또한, 커스텀 메트릭을 생성하여 애플리케이션의 특정 동작을 모니터링할 수도 있다.

이번에는 Prometheus에 대해 알아보고, 간단히 내 애플리케이션에 적용해 보았다. 이후에는 Grafana를 적용하여 여러 데이터들을 시각화해주는 모니터링을 해볼 것이다. 또한 JMeter로 부하를 일으켜 성능을 측정해볼 예정이다.