Armeria에서 Prometheus 메트릭 커스터마이징하기

이전 글 에서 Spring Actuator, Grafana를 활용하여 Prometheus로 Armeria 서버 metric을 모니터링하는 방법을 살펴봤다. 이번 글에서는 내 입맛에 맞게 Armeria에서의 Prometheus 메트릭 설정을 커스터마이징하는 방법을 다루어 보려고 한다.


Spring Actuator 이용하지 않기

이전 글에서는 Spring Actuator를 이용하여 Prometheus 메트릭들을 /actuator/prometheus 경로로 노출하였다.
하지만 사실 PrometheusExpositionService 를 이용하면 Spring Actuator를 사용하지 않고도 내가 설정한 path로 메트릭들을 노출시킬 수 있다.

@Configuration
public class ArmeriaServerConfiguration {

    // 추가
    @Bean
    public ArmeriaServerConfigurator prometheusConfigurator(PrometheusMeterRegistry registry) {
        return server -> server
                .service("/metrics",
                         new PrometheusExpositionService(registry.getPrometheusRegistry()));
    }

    @Bean
    public ArmeriaServerConfigurator serverConfigurator(MyAnnotatedService myService) {
        return server -> server
                .annotatedService("/", myService);
    }
}

/metrics 라는 path로 PrometheusExpositionService를 띄운 후, 해당 경로로 접근하면 이전과 동일하게 Prometheus 메트릭들을 확인할 수 있다.


Meter Id 이름 변경하기

어떤 설정도 하지 않았다면, Armeria에서는 기본적으로 서버 메트릭들에 armeria.server라는 prefix를 붙인다.

이 부분은 나만의 MeterIdPrefixFunction Bean을 만들어 inject하는 방법으로 내가 원하는 이름으로 변경할 수 있다.

@Configuration
public class ArmeriaServerConfiguration {

    @Bean
    public ArmeriaServerConfigurator prometheusConfigurator(PrometheusMeterRegistry registry) {
        return server -> server
                .service("/metrics",
                         new PrometheusExpositionService(registry.getPrometheusRegistry()));
    }

    @Bean
    public ArmeriaServerConfigurator serverConfigurator(MyAnnotatedService myService) {
        return server -> server
                .annotatedService("/", myService);
    }

    // 추가
    @Bean
    public MeterIdPrefixFunction meterIdPrefixFunction() {
        return MeterIdPrefixFunction.ofDefault("my.server");
    }
}

Metric들의 prefix가 my.server로 모두 변경되었음을 확인할 수 있다.


Metric 필터링하기

많은 metric 중에서 내가 원하는 metric만 필터링해서 노출시키고 싶을 수 있다. 이 때 MeterFilter Bean을 inject하여 요구사항에 맞게 필터링 설정을 할수 있다.
예를 들어 위에서 이름을 변경했었던 my.server prefix가 붙은 메트릭들만 노출시키고 싶다고 한다면,

@Configuration
public class ArmeriaServerConfiguration {

    @Bean
    public ArmeriaServerConfigurator prometheusConfigurator(PrometheusMeterRegistry registry) {
        return server -> server
                .service("/metrics",
                         new PrometheusExpositionService(registry.getPrometheusRegistry()));
    }

    @Bean
    public ArmeriaServerConfigurator serverConfigurator(MyAnnotatedService myService) {
        return server -> server
                .annotatedService("/", myService);
    }

    @Bean
    public MeterIdPrefixFunction meterIdPrefixFunction() {
        return MeterIdPrefixFunction.ofDefault("my.server");
    }

    // 추가
    @Bean
    public MeterFilter meterFilter() {
        return new MeterFilter() {
            @Override
            public MeterFilterReply accept(Id id) {
                return id.getName().startsWith("my.server") ?
                       MeterFilterReply.ACCEPT : MeterFilterReply.DENY;
            }
        };
    }
}

이전에 함께 노출됬었던 jvm, cpu 등의 메트릭은 이제 보이지 않고, my.server.* 메트릭들만 노출되는 것을 확인할 수 있다.