gpt4 book ai didi

java - MicroMeter:删除/禁用某个标签

转载 作者:行者123 更新时间:2023-11-29 04:11:02 27 4
gpt4 key购买 nike

我正在使用默认的 MicroMeter Binder ,其中之一创建了 Gauage jvm.memory.used。问题是它带有 2 个可用标签:“area”和“id”。这实际上生成了 6 个我不感兴趣的仪表。

我能够做到这一点:

@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCustomizer() {

return registry -> {
registry.config().meterFilter(MeterFilter.ignoreTags("id"));
};
}

但这将忽略带有此标签的所有仪表

我如何deny() 仅使用 id 标签的 jvm.memory.used

谢谢!

编辑:
查看 globalRegistry:

Metrics.globalRegistry.getRegistries().iterator().next().meterMap

jvm.memory.used 的每个Meter 都具有以下结构:

“MeterId{name='jvm.memory.used', tags=[tag(area=nonheap),tag(id=Metaspace)]}”

所以我们不能只通过 getName().equals("jvm.memory.used") && getTag("id") != null 进行过滤

最佳答案

我认为您可能混淆了概念。标签只是用附加信息“装饰”指标/仪表,它们实际上并不会导致发送更多仪表。例如,行 Metrics.gauge("name", Tags.of("id","a", "area","b"), 1) 只是一个单一的仪表对象。使用 id 标签拒绝 jvm.memory.used 可能会拒绝所有 jvm.memory.used。如果您仍想使用 id 标签过滤 jvm.memory.used,您可以使用

@Bean
public MeterFilter meterFilter() {
return MeterFilter.deny(
id -> "jvm.memory.used".equals(id.getName()) &&
id.getTags().stream().anyMatch(t -> "id".equals(t.getKey()))
);
}

另一方面,如果您只想删除id 标签,则需要使用replaceTags 方法。

@Bean
public MeterFilter meterFilter() {
return new MeterFilter() {
@Override
public Meter.Id map(Meter.Id id) {
if("jvm.memory.used".equals(id.getName())) {
List<Tag> tags = id.getTags().stream().filter(t -> !"id".equals(t.getKey())).collect(Collectors.toList());
return id.replaceTags(tags);
}
return id;
}
};
}

您还可以通过调用 new Meter.Id(name, tags, baseUnit, description, type) 完全自定义返回的 Meter.Id,如下所示,并更改任何一个你想要的值(value)观:

@Bean
public MeterFilter meterFilter() {
return new MeterFilter() {
@Override
public Meter.Id map(Meter.Id id) {
if("jvm.memory.used".equals(id.getName())) {
return new Meter.Id(id.getName(), <put tags here>, id.getBaseUnit(), id.getDescription(), id.getType()
}
return id;
}
};
}

关于java - MicroMeter:删除/禁用某个标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55146929/

27 4 0