[APM] Prometheus를 이용한 Spring Boot 모니터링

이영재·2025년 3월 26일

Load & Stress Testing

목록 보기
2/4

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


1. Prometheus 기본 개념

Prometheus란?

Prometheus는 CNDF에 소속된 오픈 소스 모니터링 시스템으로, 메트릭 기반 데이터 수집과 경고 기능을 제공한다. 주 목적이 시계열 데이터를 처리하는 것이다. CPU, 메모리 사용량 같은 Metrics 데이터에 대한 APM 구축을 목표로 두었다. 때문에 MSA 형태 컨테이너 서비스, 대규모 서버 클러스터 모니터링 등에서 사용한다. 또한 PromQL을 사용하여 다차원 데이터 모델을 활용할 수 있다.

용어 정리

  • CNDF : 클라우드 네이티브 기술(예: Kubernetes, Prometheus 등)을 표준화하고 발전시키는 오픈소스 재단
  • 메트릭(Metric) : 숫자로 표현되는 시스템의 상태나 활동 기록
  • 시계열 데이터 : 시간(time)에 따라 변화하는 값을 기록하는 데이터
  • MSA : 기능별로 애플리케이션을 여러 서비스로 나누는 설계 방식
  • PromQL : Prometheus에 저장된 메트릭 데이터를 조회하거나 계산할 수 있는 쿼리 언어
    • PromQL 이 정도만 감을 잡고 넘어가자. -> JSON이 데이터를 "어떻게 담을지"에 집중한다면, PromQL은 데이터를 "어떻게 뽑고 해석할지"에 집중한다.
  • 다차원 데이터 모델 : Prometheus는 메트릭에 label(라벨)을 붙여서 다양한 관점으로 필터링할 수 있다.
    • 예: /api/users/api/posts 각각에 메트릭 기록 가능

Why Prometheus?

그럼 어째서 Prometheus 사용하는가? 다른 APM 보다 Prometheus가 각광 받을까? Time-series DB는 프로메테우스만 있는 것은 아닌데, 왜 굳이 프로메테우스를 선택해야 할까? 단순히 'Kubernetes와 잘 맞는다'는 이유만으로 Prometheus를 선택하는 것은 부족하다.

Prometheus 장점

1. 개발자 중심의 설계: Prometheus는 처음부터 개발자와 운영자(SRE, DevOps)를 위한 도구로 설계되었다.

  • 직관적인 PromQL을 통해 실시간 모니터링, 병목 분석, 슬로우 요청 탐지 등이 가능

2. 자체 스토리지와 고성능 수집기: Prometheus는 외부 DB에 의존하지 않고 자체 Time-Series DB를 갖고 있다.

  • 단일 바이너리로 실행되며, 로컬에 수집하고 즉시 조회할 수 있다.

3. 플러그인 없는 확장성: Prometheus는 exporter 기반으로 구성되어 있어, JVM, DB, Redis, Nginx, Kafka, 시스템 리소스 등 다양한 메트릭을 단순한 exporter 설정만으로 수집 가능

  • exporter: 서비스의 내부 상태(CPU, 메모리, DB 상태 등)를 HTTP로 꺼내볼 수 있게 포맷을 맞춰주는 프로그램.

4. 커뮤니티 생태계와 지속적인 발전: Prometheus는 Kubernetes와 함께 가장 활발한 오픈소스 프로젝트 중 하나로, 수많은 exporter, 대시보드 템플릿, 베스트 프랙티스가 공유되고 있다.

  • Grafana 대시보드와 완벽한 연동

5. 알람과 자동화의 완성도: Prometheus는 단순 조회를 넘어서 알람(Alertmanager)과 연동해 Slack, Email, Webhook 등으로 경고를 보낼 수 있다.

6. 유연하고 안전한 Pull 기반 구조: Prometheus는 기본적으로 HTTP Pull 방식으로 메트릭을 수집한다.

  • Prometheus가 직접 대상 서비스의 /metrics 엔드포인트에 주기적으로 접근하여 데이터를 가져가는 구조
  • 서비스는 단순히 메트릭을 노출하기만 하면 되고, Prometheus가 실패 여부까지 판단 가능

Prometheus 장점에 대해서 정리해 보았는데 가장 큰 장점은 Metrics를 가져올 때 Pull 방식으로 동작한다는 것이다.

Metrics를 가져올 때 Pull 방식이 왜 장점일까?

Metrics를 가져오기 오는 방식은 pull, push 로 나뉘는데 Prometheus는 pull 방식으로 가져온다.

기존 Push 방식 (에이전트가 APM 서버로 전송)

  • 애플리케이션에 Datadog 에이전트(JVM Agent, Python Hook 등)를 설치
  • 이 에이전트가 애플리케이션 내부 호출 흐름, 쿼리, 예외 등을 감지
  • 그리고 실시간으로 APM 서버(Datadog, New Relic 등)에 Push 전송

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

Prometheus의 Pull 방식

  • 클라이언트가 앱에 요청을 보내면 이 요청은 애플리케이션 로직이 처리하고
  • Micrometer + Actuator가 이 요청에 대한 정보 (응답 시간, 상태 코드 등)를 내부적으로 기록한다.
  • Prometheus가 주기적으로 저장된 메트릭 데이터만 요청한다. (Pull 방식)

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

Prometheus의 전체적인 구조

  • Pull 방식으로 타겟 애플리케이션에서 메트릭스 데이터를 요청하고있다.

2. Spring Boot와 Prometheus 통합 준비

Spring Boot Actuator와 Micrometer

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에서 메트릭 엔드포인트 활성화

Spring Boot Actuator를 통해 /actuator/prometheus 엔드포인트를 활성화. application.properties 설정을 추가

management.endpoints.web.exposure.include=prometheus

3. Prometheus 설치 & 실행

방법 1 직접 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']
  • 5s 마다 pull
  • 8080 포트를 targets 으로 설정

방법 2 Prometheus docker container 생성

prometheus.yml 파일을 구성하고

docker run -d \
  -p 9090:9090 \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  --name prometheus \
  prom/prometheus

4. 메트릭 수집 및 확인

Spring Boot 애플리케이션이 실행되면 /actuator/prometheus 엔드포인트에서 기본 메트릭 데이터를 확인할 수 있습니다. 또한, 커스텀 메트릭을 생성하여 애플리케이션의 특정 동작을 모니터링할 수도 있다.

  • 총 요청 횟수를 확인해 봤다.
  • 30번의 요청 중에서 1개의 실패, 29개의 성공 요청이 잘 보인다.

Next

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

0개의 댓글