gpt4 book ai didi

spring-boot - 千分尺过滤器被CompositeMeterRegistry忽略

转载 作者:行者123 更新时间:2023-12-02 22:28:15 25 4
gpt4 key购买 nike

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

奇怪的是,如果我将MeterFilter定义为Spring Bean,那么它将应用于所有注册表(但是,我希望仅将其应用于“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;
}
});

区别在于:我返回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注册表中呢?

有人可以解释吗?

最佳答案

这实际上是问题的综合。我只想指出几点。

对于您定义的MeterRegistry bean,Spring Boot将自动配置ElasticMeterRegistry bean,因为没有ElasticMeterRegistry bean。与其定义自己的CompositeMeterRegistry bean,不如定义一个自定义的ElasticMeterRegistry bean,它会应用您想要的MeterFilter,然后让Spring Boot为您创建一个(CompositeMeterRegistry bean)。

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

关于spring-boot - 千分尺过滤器被CompositeMeterRegistry忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54694204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com