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