当前位置: 首页 > 知识库问答 >
问题:

使用CompositeMeter注册表忽略千分尺过滤器

柳仲卿
2023-03-14

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

奇怪的是,如果我将MeterFilter定义为Spring bean,那么它将应用于所有注册表(但是,我希望它仅应用于“elasticMeter注册表”)。

这是一个示例配置类:

@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而不是NEUTRAL。

奇怪的是,以下代码不起作用(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());

结论:

因此,过滤器似乎应该返回ACCEPT而不是NEUTRAL。但是对于不以“logback”开头的米,我的原始过滤器(使用NEUTRAL)返回DENY。那为什么这些指标会发布到ElasticSearch注册表?

有人能解释一下吗?

共有1个答案

郭永怡
2023-03-14

这实际上是一系列问题的组合。我只想指出几点。

对于您定义的计量注册bean,Spring Boot将自动配置弹性计量注册bean,因为没有弹性计量注册bean。不要自己创建一个CompositeMeterRegistry bean,只需定义一个自定义的ElasticMeterRegistry bean,该bean将应用所需的MeterFilter,并让Spring Boot为您创建一个(CompositeMeterRegistrybean)。

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

 类似资料:
  • 有没有办法通过微米使用Servlet过滤器(即非Spring应用程序)收集HTTP指标。我正在寻找一个类似于io.micrometer.jersey2.server.MetricsApplicationEventListener的解决方案,在泽西的情况下……但是我正在寻找HTTP级别的东西,而不是依赖于REST……

  • 我对Spring很陌生,正在尝试将我的应用程序连接到麋鹿。该应用程序运行的是Spring boot 1.5.5,因此我使用的是微米遗产。我的pom看起来像这样: 每当我尝试启动我的应用程序时,我都会收到以下错误: 根本原因似乎是类io.micrometer.core.instrument.config.validate.Validated它似乎没有像它应该的那样出现在包中。对此有什么想法吗?

  • 我正试图将普罗米修斯的度量标准迁移到千分尺,但现在我只能做一件事。。。 目前,我有一个普罗米修斯直方图配置如下: 因此,为了切换到测微计,我将其替换为: 好啊让我们看看我想如何使用它。。。此刻我只是打电话 所以我把这个换成了 但现在的问题是,测微计抱怨我之前配置的度量没有这些标签。我当然知道,因为我不知道当时的值。以下是例外情况: 好啊所以我想,然后让我们用呼叫。但这不起作用,因为没有传递这些值的

  • 我很难让Spring Camel获得注册为Bean的HeaderFilterStrategy类,这样就可以通过Camel路线找到它。我试图注释HeaderFilterStrategy自定义类似乎是徒劳的。。。那么如何注册这个东西,以便在运行时找到它呢? 我有一个驼峰应用程序,其中一条路线使用定制的HeaderFilterStrategy 策略类看起来像: 我注册它与骆驼使用一个简单的注册表: 我在

  • 我正在利用dogstatsd方法,使用千分尺将指标发送给datadog。我获得了正常的指标,如计数器和计量器,但我无法生成事件。有办法生成datadog事件吗?

  • 假设我有一个应用程序,其中REST API更新产品的价格。 我想使用微米计来公开新价格作为指标。我无法理解微米计留档应该如何完成。 唯一对我有效的DoubleFunction是在我的ProductService中创建一个新方法来返回它的价格。这似乎是我想公开作为指标的每一条数据的开销。 我这里缺少什么?为什么不足以更新Gauge?