[SpringBoot] Micrometer 와 Actuator 개념과 사용 이유 알아보기

2025. 7. 21. 09:35·Spring

SpringBoot 환경에서 애플리케이션 모니터링을 구축할 때 흔히 사용되는 Micrometer 와 Actuator 에 대해 간략하게 개념을 정리한 글입니다.

Micrometer 알아보기

Micrometer는 JVM 기반 애플리케이션을 위한 벤더 중립적인 메트릭 수집 라이브러리다.
로그 시스템에서 SLF4J가 다양한 로깅 구현체에 대한 추상화를 제공하듯, Micrometer는 Prometheus, Datadog, CloudWatch 등 다양한 모니터링 시스템에 동일한 방식으로 메트릭을 기록할 수 있도록 추상화된 인터페이스를 제공한다.
이러한 추상화 덕분에 애플리케이션 개발자는 특정 모니터링 벤더에 종속되지 않고, 코드를 변경하지 않고도 메트릭 전송 대상을 유연하게 교체할 수 있다. Micrometer는 메트릭을 수집할 때부터 벤더별 MeterRegistry 구현체에 직접 기록하며, 해당 MeterRegistry가 각 벤더에 맞는 형식으로 메트릭을 처리한다. 즉, Micrometer가 데이터를 수집하고, 각 Registry 구현체가 처리를 담당하는 구조로 구성되어 있다.

https://docs.micrometer.io/micrometer/reference/implementations/prometheus.html

 

 

Spring Boot 에서 Micrometer  

Spring Boot는 애플리케이션 구동 시, 추상클래스인 MeterRegistry 를 상속받은 MeterRegistry 구현체들을 AutoConfigurtation 에 의해 자동 등록시켜준다.  즉 classpath 에 다음과 같은 구현체가 있는지 확인하고 자동 등록한다.

  • micrometer-registry-prometheus
  • micrometer-registry-datadog
  • micrometer-registry-cloudwatch
  • ...  등등

간략하게 등록 과정을 알아보면, MeterRegistry가 하나만 있으면 Spring Boot는 그 레지스트리 하나를 주입해준다. 다만 여러 개 등록하면 ambiguity가 생기므로 이때 CompositeMeterRegistry 를 이용해 이를 래핑해준다. 

AutoConfiguration 에 의해 등록
CompositeMeterRegistryConfiguration 에 의해 모니터링 툴 여러개에 대한 의존성이 있을 경우 CompositeMeterRegistry 가 구성됨

 

그렇기 때문에 특정 모니터링 시스템을 사용하려면 해당 의존성만 추가하면 된다. 그에 맞는 MeterRegistry 는 Spring Boot 가 자동으로 빈으로 등록해 사용할 수 있게 해준다.

implementation 'io.micrometer:micrometer-registry-prometheus'​

 

Spring Boot  Actuator 와 Micrometer 

[SpringBoot Actuator 알아보기]

Actuator는 HTTP 기반으로 메트릭을 노출하는 도구다. Spring Boot 2.x부터 Actuator는 Micrometer를 기반으로 다양한 메트릭(JVM 메모리, GC, 스레드, HTTP 요청 시간 등)을 자동으로 수집한다. 이 수집된 메트릭은 Actuator의 /actuator/metrics 또는 /actuator/prometheus 같은 엔드포인트를 통해 외부로 노출된다.

 

예를 들어 Prometheus는 pull 방식으로 동작하므로 아래 의존성을 추가해 /actuator/prometheus 엔드포인트를 actuator 를 이용해 노출시키고, 주기적으로 스크레이핑해 Micrometer가 기록한 메트릭을 가져갈 수 있도록 한다.

// monitoring 모듈의 build.gradle
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'

 

 management.endpoints.web.exposure.include 는 어떤 Actuator endpoint 를 HTTP 로 노출할지 결정한다. 예를 들어, application.yml 에 아래와 같이 설정하면 /actuator/prometheus, /actuator/health, /actuator/metrics 같은 endpoint가 외부에서 호출 가능하게 된다.

management:
  endpoints:
    web:
      exposure:
        include: prometheus, health, metrics

 

management.metrics.export.prometheus.enabled 는 Micrometer가 Prometheus용 MeterRegistry를 등록할지 여부를 결정한다. Micrometer가 Prometheus에 맞는 형식으로 메트릭을 수집할지 여부를 결정하는 것으로 이해할 수 있겠다. 

https://docs.spring.io/spring-boot/reference/actuator/metrics.html#actuator.metrics.export.prometheus

prometheus 의 경우 아래처럼  false로 설정하면 PrometheusMeterRegistry는 생성되지 않고, Micrometer가 Prometheus 메트릭을 수집하지 않는다.

management:
  endpoints:
    web:
      exposure:
        include: prometheus, health, metrics
  # PrometheusMeterRegistry 제외함
  prometheus:
    metrics:
      export:
        enabled: false

 

이렇게 특정 MeterRegistry ( 를 제외하면 Actuator가 Micrometer로부터 받은 메트릭을 가져올 수 없으므로 web.exposure 에 include 했더라도 /actuator/prometheus 로 데이터를 수집할 수 없게 된다.

 

아래처럼 명시적으로 true 로 설정하거나, enabled: false 를 제거하면 기본값이 true 기 때문에 PrometheusMeterRegistry 가 등록된다.

  prometheus:
    metrics:
      export:
        # 기본값은 true
        enabled: true

 

 

벤더별 Registry 구현체들은 MeterRegistry 를 상속받기 때문에 아래처럼 ApplicationContext 를 읽어와서 빈 등록 여부를 조회할 수 있다.

@Component
@Profile("local")
public class MicrometerRegistryChecker {

    @EventListener(ApplicationStartedEvent.class)
    public void checkRegistries(ApplicationStartedEvent event) {
        var context = event.getApplicationContext();
        var registries = context.getBeansOfType(MeterRegistry.class);
        System.out.println("registries = " + registries);
    }
}

 

 

 

[Actuator 는 필수인가?]

Prometheus 는 pull 방식으로 데이터를 수집하므로 Actuator의 도움 없이는 Http 엔드포인트가 노출되지 않아서 Micrometer 메트릭을 가져갈 수 없다.  반면 push 방식으로 동작하는 CloudWatch 와 같은 push 방식의 모니터링 툴을 사용한다면 Micrometer가 수집한 메트릭을 CloudWatchMeterRegistry가 직접 전송(export)할 수 있으므로, 이 경우엔 Actuator를 통한 HTTP 노출이 필요 없다.

 

어떤 방식으로 구성했느냐에 따라 actuator로 노출할지, 노출하지 않을지 결정하면 될 것 같다.

 

References

https://docs.micrometer.io/micrometer/reference/implementations/prometheus.html

https://docs.spring.io/spring-boot/reference/actuator/metrics.html#actuator.metrics.export.prometheus

'Spring' 카테고리의 다른 글

[Spring Security] Preflight는 성공하지만 실제 요청에서 CORS 오류가 발생하는 문제 해결하기  (0) 2025.05.26
[Spring] WireMock 로 Feign (ApacheHttp5Client) 테스트시 NoHttpResponseException 발생 케이스와 해결방법  (0) 2025.05.06
[Spring] TestContainers, @TestConfiguration 사용시 @DynamicPropertySource 가 적용되지 않는 문제와 해결방안  (0) 2025.04.10
[Spring] API 응답에서 직접 정의한 Error code 는 왜 사용할까?  (0) 2025.03.16
[Spring] OpenApI 3.0 Swagger 문서 작성 및 설정 방법  (1) 2025.02.11
'Spring' 카테고리의 다른 글
  • [Spring Security] Preflight는 성공하지만 실제 요청에서 CORS 오류가 발생하는 문제 해결하기
  • [Spring] WireMock 로 Feign (ApacheHttp5Client) 테스트시 NoHttpResponseException 발생 케이스와 해결방법
  • [Spring] TestContainers, @TestConfiguration 사용시 @DynamicPropertySource 가 적용되지 않는 문제와 해결방안
  • [Spring] API 응답에서 직접 정의한 Error code 는 왜 사용할까?
기억은 RAM, 기록은 HDD
기억은 RAM, 기록은 HDD
  • 기억은 RAM, 기록은 HDD
    적립식 개발
    기억은 RAM, 기록은 HDD
  • 전체
    오늘
    어제
    • 분류 전체보기 (45)
      • Gradle (1)
      • 알고리즘 (14)
        • 강한 연결 요소 (1)
        • BFS (1)
        • 다이나믹 프로그래밍 (2)
        • 그리디 (1)
        • 투 포인터 (2)
        • 비트마스크 (1)
        • 스택 (1)
        • 백트래킹 (1)
        • 유니온-파인드 (1)
        • 기초 기하학 (1)
        • 분할정복을 이용한 거듭제곱 (1)
        • 볼록 껍질 (1)
      • JPA (3)
      • Java (9)
      • Spring (9)
      • Git&GitHub (2)
      • Infra (4)
  • 최근 글

  • 인기 글

  • 태그

    Github
    thread 와 runnable
    자바synchronized키워드
    spring cors 해결
    enum활용법
    자바future
    java synchronized
    java 라이브러리 추가
    비트마스킹
    데몬쓰레드
    기하학
    githubworkflow
    자바 callable
    완전탐색
    @embedded
    java
    enum정리
    정렬
    투 포인터
    자바 runnable
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
기억은 RAM, 기록은 HDD
[SpringBoot] Micrometer 와 Actuator 개념과 사용 이유 알아보기
테마상단으로

티스토리툴바