Фильтр микрометра игнорируется с помощью CompositeMeterRegistry - PullRequest
0 голосов
/ 14 февраля 2019

Я использую 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?

Может кто-нибудь объяснить это?

1 Ответ

0 голосов
/ 19 февраля 2019

Это действительно набор вопросов.Я просто укажу несколько моментов.

Для указанного вами компонента MeterRegistry Spring Boot автоматически сконфигурирует компонент ElasticMeterRegistry, так как компонента ElasticMeterRegistry нет.Вместо того, чтобы создавать бин CompositeMeterRegistry самостоятельно, просто определите пользовательский бин ElasticMeterRegistry, к которому применяется требуемый MeterFilter, и позвольте Spring Boot создать один (бин CompositeMeterRegistry) для вас.

Для MeterFilterReply, ACCEPT немедленно примет счетчик, DENY немедленно отклонит счетчик, а NEUTRAL отложит решение до следующего фильтра (ей).В основном, метры будут приниматься, если не будет DENY.

...