Фильтр микрометра игнорируется с помощью 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,

Другие вопросы по тегам