elasticsearch,micrometer,spring-micrometer,Spring Boot,elasticsearch,Micrometer,Spring Micrometer" /> elasticsearch,micrometer,spring-micrometer,Spring Boot,elasticsearch,Micrometer,Spring Micrometer" />

Spring boot 使用CompositeMeterRegistry忽略测微计过滤器

Spring boot 使用CompositeMeterRegistry忽略测微计过滤器,spring-boot,elasticsearch,micrometer,spring-micrometer,Spring Boot,elasticsearch,Micrometer,Spring Micrometer,我使用Spring Boot 2.1.2.RELEASE,并尝试将测微计与CompositeMeterRegistry结合使用。我的目标是将一些选定的仪表发布到ElasticSearch。下面的代码显示了我的示例配置。问题是,过滤器被完全忽略(因此所有指标都被发送到ElasticSearch),尽管我可以在日志中看到它已被处理(“过滤器对仪表的回复…”行) 奇怪的是,如果我将MeterFilter定义为Springbean,那么它将应用于所有注册表(然而,我希望它只应用于“elasticMete

我使用Spring Boot 2.1.2.RELEASE,并尝试将测微计与CompositeMeterRegistry结合使用。我的目标是将一些选定的仪表发布到ElasticSearch。下面的代码显示了我的示例配置。问题是,过滤器被完全忽略(因此所有指标都被发送到ElasticSearch),尽管我可以在日志中看到它已被处理(“过滤器对仪表的回复…”行)

奇怪的是,如果我将MeterFilter定义为Springbean,那么它将应用于所有注册表(然而,我希望它只应用于“elasticMeterRegistry”)

下面是一个示例配置类:

@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;
    }
});
elasticMeterRegistry.config().meterFilter(
    MeterFilter.accept(id -> id.getName().startsWith("logback")));
elasticMeterRegistry.config().meterFilter(
    MeterFilter.deny());
区别在于:我返回ACCEPT而不是NEUTRAL

奇怪的是,以下代码不起作用(ES获取所有指标):

但这是可行的:

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;
    }
});
elasticMeterRegistry.config().meterFilter(
    MeterFilter.accept(id -> id.getName().startsWith("logback")));
elasticMeterRegistry.config().meterFilter(
    MeterFilter.deny());
结论:

因此,似乎过滤器应该返回ACCEPT而不是NEUTRAL。但对于不以“logback”开头的仪表,我原来的过滤器(带空档)返回DENY。那么,为什么要将这些指标发布到ElasticSearch注册表


有人能解释一下吗?

这真是一堆问题。我只想指出几点

对于您定义的
MeterRegistry
bean,Spring Boot将自动配置
ElasticMeterRegistry
bean,因为没有
ElasticMeterRegistry
bean。与其自己创建一个
CompositeMeterRegistry
bean,只需定义一个自定义
ElasticMeterRegistry
bean,该bean应用于所需的
MeterFilter
,并让Spring Boot为您创建一个(
CompositeMeterRegistry
bean)


对于
MeterFilterReply
ACCEPT
会立即接受仪表,
DENY
会立即拒绝仪表,
NEUTRAL
会将决定推迟到下一个过滤器。基本上,除非有任何
DENY

定义
elasticmeter,否则仪表将被接受。注册
是一个很好的建议,谢谢。然而,它似乎不起作用。首先,我尝试定义
elasticMeterRegistry
bean,但失败了,因为已经注册了一个同名的bean。事实证明,
elasticmetericsexportautoconfiguration
中自动定义了
elasticmetericsregistry
bean。然后我尝试注入这个bean(而不是定义自己的bean)并添加过滤器(在用
@PostConstruct
注释的方法中,但筛选器没有任何效果。对于
MeterFilterReply
,您是对的。但是,如果您只有一个筛选器,则返回
NEUTRAL
而不是
ACCEPT
应该具有相同的效果,对吗?