Фильтр микрометра игнорируется с помощью CompositeMeterRegistry
Я использую 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;
}
});
Разница заключается в следующем: я возвращаю ПРИНЯТЬ вместо НЕЙТРАЛЬНО.
Как ни странно, следующий код не работает (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?
Может кто-нибудь объяснить это?
1 ответ
Это действительно набор вопросов. Я просто укажу несколько моментов.
Для MeterRegistry
боб, который вы определили, Spring Boot автоматически настроит ElasticMeterRegistry
боб, как нет ElasticMeterRegistry
боб. Вместо создания CompositeMeterRegistry
бин по своему усмотрению, просто определить обычай ElasticMeterRegistry
боб, который применяется MeterFilter
хотите и пусть Spring Boot создаст один (CompositeMeterRegistry
боб) для вас.
За MeterFilterReply
, ACCEPT
сразу примет счетчик, DENY
немедленно откажется от счетчика и NEUTRAL
отложит решение до следующего фильтра (ов). В основном метры будут приняты, если нет DENY
,