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.*
메트릭들만 노출되는 것을 확인할 수 있다.