У меня есть компонент, настроенный в классе конфигурации.Моя цель - трансформировать, запрещать, применять общие теги и изменять метрики, отправляемые в New Relic.
Вот мой класс конфигурации
@Configuration
@Log4j2
public class MetricsConfig {
private static final Duration HISTOGRAM_EXPIRY = Duration.ofMinutes(10);
private static final Duration STEP = Duration.ofSeconds(5);
private final transient String profile;
@Autowired
public MetricsConfig(@Value("${spring.profiles.active}") final String profile) {
this.profile = profile;
}
@Bean
public MeterRegistryCustomizer<NewRelicMeterRegistry> metricsCommonTags() {
log.info("Configuring Registry");
return registry -> registry.config()
.commonTags(Arrays.asList(Tag.of("appId", "1111111"), Tag.of("environment", profile),
Tag.of("app", "aws-app-name")))
.meterFilter(new MeterFilter() {
@Override
public Meter.Id map(Meter.Id id) {
if(id.getName().startsWith("http")){
return id.withName("app-name." + profile + "." + id.getName());
}
return id;
}
@Override
public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
return config.merge(DistributionStatisticConfig.builder()
.percentilesHistogram(true)
.percentiles(0.5, 0.75, 0.95)
.expiry(HISTOGRAM_EXPIRY)
.bufferLength((int) (HISTOGRAM_EXPIRY.toMillis() / STEP.toMillis()))
.build());
}
}).meterFilter(MeterFilter.deny(id -> {
String uri = id.getTag("uri");
log.info("id: [{}]", id);
return (uri != null && uri.startsWith("/swagger") && uri.startsWith("/manage")) || !id.getName().toLowerCase().startsWith("app-name");
}))
;
}
}
Затем я также добавляю MeterRegistry
в некоторые из моих классов для захвата пользовательских событий (Timer, Counter).
Все работает в отношении захвата событий, за исключением того, что в данных в New Relic отсутствуют общие теги, преобразования и все остальное, что я применяю в классе MetricsConfig
.
Я что-то упустил, убедившись, что мое приложение правильно подключило MeterRegistryCustomizer
?