Я использую Spring Boot 2.1.2.RELEASE и пытаюсь использовать микрометр с CompositeMeterRegistry.Моя цель - опубликовать некоторые выбранные счетчики в ElasticSearch.Код ниже показывает мой пример конфигурации.Проблема в том, что фильтр полностью игнорируется (поэтому все метрики отправляются в ElasticSearch), хотя я вижу в журналах, что он был обработан (строки «filter reply of meter ...»).
Странно, если я определю MeterFilter как бин Spring, то он будет применен ко ВСЕМ реестрам (однако я хочу, чтобы он применялся только к «asticMeterRegistry »).
Вот пример класса конфигурации:
@Configuration
public class AppConfiguration {
@Bean
public ElasticConfig elasticConfig() {
return new ElasticConfig() {
@Override
@Nullable
public String get(final String k) {
return null;
}
};
}
@Bean
public MeterRegistry meterRegistry(final ElasticConfig elasticConfig) {
final CompositeMeterRegistry registry = new CompositeMeterRegistry();
registry.add(new SimpleMeterRegistry());
registry.add(new JmxMeterRegistry(new JmxConfig() {
@Override
public Duration step() {
return Duration.ofSeconds(10);
}
@Override
@Nullable
public String get(String k) {
return null;
}
}, Clock.SYSTEM));
final ElasticMeterRegistry elasticMeterRegistry = new ElasticMeterRegistry(elasticConfig, Clock.SYSTEM);
elasticMeterRegistry.config().meterFilter(new MeterFilter() {
@Override
public MeterFilterReply accept(Meter.Id id) {
final MeterFilterReply reply =
id.getName().startsWith("logback")
? MeterFilterReply.NEUTRAL
: MeterFilterReply.DENY;
log.info("filter reply of meter {}: {}", id.getName(), reply);
return reply;
}
});
registry.add(elasticMeterRegistry);
return registry;
}
}
Итак, я ожидаю, что ElasticSearch получит только метрики "logback", а JMX получит все метрики.
ОБНОВЛЕНИЕ:
Я играл сфильтрует и нашел «решение», но я не совсем понимаю, почему приведенный выше код не работает.
Это работает:
elasticMeterRegistry.config().meterFilter(new MeterFilter() {
@Override
public MeterFilterReply accept(Meter.Id id) {
final MeterFilterReply reply =
id.getName().startsWith("logback")
? MeterFilterReply.ACCEPT
: MeterFilterReply.DENY;
log.info("filter reply of meter {}: {}", id.getName(), reply);
return reply;
}
});
Разница в том, что вместо этого я возвращаю ACCEPTНЕЙТРАЛЬНО.
Странно, следующий код не работает (ES получает все метрики):
elasticMeterRegistry.config().meterFilter(
MeterFilter.accept(id -> id.getName().startsWith("logback")));
Но это работает:
elasticMeterRegistry.config().meterFilter(
MeterFilter.accept(id -> id.getName().startsWith("logback")));
elasticMeterRegistry.config().meterFilter(
MeterFilter.deny());
ЗАКЛЮЧЕНИЕ:
Итак, похоже, что вместо НЕЙТРАЛЬНО, фильтр шоУльд возврат ПРИНЯТЬ.Но для счетчиков, не начинающихся с «logback», мой оригинальный фильтр (с NEUTRAL) возвращает DENY.Тогда почему эти показатели публикуются в реестре ElasticSearch?
Может кто-нибудь объяснить это?