MicroMeter:删除/禁用某个标签

Posted

技术标签:

【中文标题】MicroMeter:删除/禁用某个标签【英文标题】:MicroMeter: remove/disable a certain tag 【发布时间】:2019-08-04 10:15:46 【问题描述】:

我正在使用默认的 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.usedid 标签?

谢谢!

编辑: 查看 globalRegistry:

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

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

"MeterIdname='jvm.memory.used', tags=[tag(area=nonheap),tag(id=Metaspace)]"

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

【问题讨论】:

下面的答案已更新,我对其进行了测试以确认在本地工作 【参考方案1】:

我认为您可能会混淆概念。标签只是用附加信息“装饰”指标/量表,它们实际上并不会导致发送更多量表。例如,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;
        
    ;

【讨论】:

我明天试试,同时谢谢! 很遗憾这两种方法都不起作用 - 第一种方法无法完成,因为标签是不可变的,而第二种方法删除了所有“jvm.memory.used”米。 我在我的问题中添加了解释 @yaseco 抱歉,我错过了您的回复,我没有收到通知。删除了 removeIf,因为它不起作用并添加了其他内容,应该可以满足您的需求。 像魅力一样工作 - 抱歉回复晚了,非常感谢!

以上是关于MicroMeter:删除/禁用某个标签的主要内容,如果未能解决你的问题,请参考以下文章

如何根据标签更新 MicroMeter 量规

如何配置 spring-micrometer 标签

微米高内存使用率

以 Micrometer 为单位的 Counter 指标的动态标签值

如何使用 SLA 和标签注册 Micrometer Timer?

如何为某些 Spring Boot Micrometer 指标提供标签,但不为其他指标提供标签?