MicroMeter: remove/disable 某个标签
MicroMeter: remove/disable a certain tag
我正在使用默认的 MicroMeter 活页夹,其中之一创建了 Gauage jvm.memory.used
。问题是它带有 2 个可用标签:"area" 和 "id"。这实际上生成了 6 个我不感兴趣的仪表。
我能够做到这一点:
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCustomizer() {
return registry -> {
registry.config().meterFilter(MeterFilter.ignoreTags("id"));
};
}
但这将忽略 所有带有此标签的仪表。
如何才能 deny()
只有 jvm.memory.used
带有 id
标签?
谢谢!
编辑:
查看 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
过滤
我认为您可能混淆了概念。这些标签只是 "decorate" 和 metrics/gauges 以及附加信息,它们实际上并不会导致发送更多的仪表。例如,行 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
,并更改您想要的任何值:
@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;
}
};
}
我正在使用默认的 MicroMeter 活页夹,其中之一创建了 Gauage jvm.memory.used
。问题是它带有 2 个可用标签:"area" 和 "id"。这实际上生成了 6 个我不感兴趣的仪表。
我能够做到这一点:
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCustomizer() {
return registry -> {
registry.config().meterFilter(MeterFilter.ignoreTags("id"));
};
}
但这将忽略 所有带有此标签的仪表。
如何才能 deny()
只有 jvm.memory.used
带有 id
标签?
谢谢!
编辑:
查看 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
我认为您可能混淆了概念。这些标签只是 "decorate" 和 metrics/gauges 以及附加信息,它们实际上并不会导致发送更多的仪表。例如,行 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
,并更改您想要的任何值:
@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;
}
};
}