Spring Boot 고급 시리즈 9화 – 메트릭 수집과 Micrometer 통합 전략
Spring Boot 애플리케이션에서 메트릭 수집을 위한 Micrometer 설정 방법과 Prometheus 연동 전략을 다룹니다. 성능 모니터링과 비즈니스 지표 추적을 위한 실전 가이드를 확인하세요.
어떤 시스템이든 “문제가 생겼을 때 어디서 병목이 발생했는지”, “사용자 수가 늘었을 때 어떤 컴포넌트가 먼저 한계에 도달하는지” 모르면 운영이 어렵습니다.
바로 이런 상황에 대비하기 위해 메트릭(Metrics) 수집과 시각화는 선택이 아닌 필수입니다.
Spring Boot는 Micrometer라는 메트릭 수집 라이브러리를 기본으로 통합하고 있으며, Prometheus, Datadog, New Relic 등 다양한 모니터링 시스템과 연동됩니다.
이번 글에서는 Micrometer를 기반으로 Spring Boot 애플리케이션의 성능, 사용량, 지표를 수집하고 시각화하는 전략을 구체적으로 살펴보겠습니다.
Micrometer란 무엇인가?
Micrometer는 Spring Boot 2.0 이후부터 기본적으로 통합된 성능 모니터링 라이브러리입니다.
특징은 다음과 같습니다:
- 벤더 중립적인 인터페이스 제공 (Prometheus, Datadog, InfluxDB 등 지원)
- JVM, 메모리, GC, HTTP 요청 등 기본 메트릭 자동 수집
- 커스텀 메트릭 등록 가능
- Spring Boot Actuator와 긴밀하게 연동
즉, Micrometer는 개발자가 메트릭을 일일이 직접 구현하지 않아도, Spring Boot 애플리케이션의 주요 동작 상태를 실시간으로 추적할 수 있도록 해줍니다.
Micrometer 기본 설정 방법
Spring Boot 2.0 이상 프로젝트에서 다음 의존성을 추가하면 기본 설정이 완료됩니다.
<!-- Gradle 기준 -->
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
application.yml에 아래와 같이 Actuator 엔드포인트와 Prometheus 설정을 추가합니다.
management:
endpoints:
web:
exposure:
include: health,info,prometheus
metrics:
export:
prometheus:
enabled: true
이제 /actuator/prometheus 엔드포인트를 통해 메트릭 데이터를 Prometheus가 스크랩할 수 있습니다.
자동 수집되는 주요 메트릭
Micrometer는 다음과 같은 시스템/프레임워크 수준 메트릭을 기본으로 제공합니다:
- JVM 메모리 사용량 (jvm.memory.used, jvm.gc.pause)
- HTTP 요청 처리 시간 (http.server.requests)
- 스레드 수 (jvm.threads.live, jvm.threads.daemon)
- DataSource 커넥션 상태 (hikaricp.connections.active)
- Spring WebFlux / MVC 요청 시간
이러한 메트릭은 거의 모든 Spring 기반 애플리케이션에서 공통으로 필요하기 때문에, 추가 개발 없이도 실시간 모니터링이 가능합니다.
커스텀 메트릭 정의 방법
비즈니스 로직에 특화된 메트릭은 직접 코드로 정의할 수 있습니다. 예를 들어 주문 성공 횟수를 카운트하는 방식은 다음과 같습니다.
@Component
@RequiredArgsConstructor
public class OrderMetrics {
private final MeterRegistry meterRegistry;
private final Counter orderSuccessCounter;
public OrderMetrics(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
this.orderSuccessCounter = meterRegistry.counter("order.success.count");
}
public void countOrderSuccess() {
orderSuccessCounter.increment();
}
}
이렇게 정의된 order.success.count는 Prometheus를 통해 수집되고, Grafana 등 대시보드에서 시각화할 수 있습니다.
태깅을 통한 필터링 전략
Micrometer의 강력한 기능 중 하나는 태그 기반 필터링입니다. 특정 사용자 유형, API 경로, 지역별 메트릭 집계를 위해 다음처럼 태그를 활용할 수 있습니다.
meterRegistry.counter("api.call.count",
"endpoint", "/v1/orders",
"userType", "member")
.increment();
Prometheus 쿼리에서는 다음과 같은 형태로 조건 검색이 가능합니다.
api_call_count{endpoint="/v1/orders", userType="member"}
운영 환경에서의 활용 전략
- 경고 임계치 설정: 예를 들어 http.server.requests의 평균 응답 시간이 1초를 초과하면 경고 발생
- 슬로우 트랜잭션 분석: 특정 API의 처리 시간이 급격히 느려질 경우 알림 트리거
- 비즈니스 지표 모니터링: 주문 성공률, 회원 가입 수, 이벤트 참여율 등 도메인 지표 시각화
- 서비스 헬스 진단: GC 빈도나 커넥션 수 급증을 통한 시스템 이상 조기 감지
Micrometer + Grafana + Prometheus 구성 예시
실제 시스템에서는 Prometheus로 수집 → Grafana로 시각화 → Slack/Webhook으로 알림 체계를 구성합니다.
Spring Boot는 이 아키텍처에 최적화되어 있으며, 다음과 같은 이점이 있습니다:
- 설정이 간단하며, 운영 중에도 메트릭을 유연하게 추가 가능
- 컨테이너 환경(Docker/Kubernetes)과도 호환성 우수
- 수집 데이터에 대한 강력한 질의(Query) 및 시각화 기능
정리하며
Micrometer는 Spring Boot 환경에서 거의 표준화된 메트릭 수집 도구로 자리 잡았습니다.
운영 중인 시스템의 병목을 실시간으로 감지하고, 변화 추이를 시각적으로 추적하며, 리스크를 선제적으로 대응하기 위해서는 반드시 구성해야 할 핵심 기술입니다.
단순한 성능 최적화를 넘어, 서비스 신뢰도와 SLA를 보장하기 위한 도구로 바라보는 것이 이 시대의 운영 전략입니다.