1

我试图弄清楚如何为特定指标设置通用标签。注意:我使用的是 Cloudwatch 监控系统。这是我所拥有的:

@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
    return new MeterRegistryCustomizer<MeterRegistry>() {

        @Override
        public void customize(MeterRegistry registry) {
            registry.config()
                .meterFilter(MeterFilter.denyNameStartsWith("jvm.gc.pause"))
                .meterFilter(MeterFilter.denyNameStartsWith("logback"))
                .meterFilter(MeterFilter.denyNameStartsWith("process"))
                .meterFilter(MeterFilter.denyNameStartsWith("system.cpu"))
                .meterFilter(MeterFilter.denyNameStartsWith("jvm.buffer"))
                .meterFilter(MeterFilter.denyNameStartsWith("jvm.classes")
                .commonTags(Arrays.asList(Tag.of("instanceId", instanceId)));
        }
    };
}

我正在考虑类似于的 MeterFilter 方法MeterFilter.allow("metric.name").tags("tag1","tag2")

千分尺确实允许我在创建仪表时设置标签,但是这对我启用 Spring 的仪表没有帮助。

似乎唯一的方法是创建两个 MeterRegistryCustomizer 对象,一个用于 Spring 指标和我创建的任何需要公共标签的自定义指标,另一个用于不需要的。

有没有办法做到这一点,我错过了?

4

2 回答 2

1

如果要为特定的仪表添加标签,请注册MeterFilter为 bean。例如,请参见以下代码:https ://github.com/izeye/sample-micrometer-spring-boot/blob/so-53925641/src/main/java/com/izeye/sample/config/MetricsConfig.java #L40-L52

于 2018-12-26T16:14:51.190 回答
1

为了子孙后代,这是我的代码解决方案。选择的答案建议使用@Autowired MeterFilter bean,但这对于我的特定用例来说不是必需的。

为了区分我想要和不想拥有 instanceId 标签的计量器,我在那些我不想拥有 instanceId 标签的计量器上设置了一个“AGG”标签键(即,它们是将被聚合的指标从所有实例中),然后将其删除。

@Bean
public MeterRegistryCustomizer<MeterRegistry> buildMeterRegistry() {
    return new MeterRegistryCustomizer<MeterRegistry>() {

        @Override
        public void customize(MeterRegistry registry) {
            registry.config()
                .meterFilter(new MeterFilter() {

                    @Override
                    public Meter.Id map(Meter.Id id) {

                        // Check for the "AGG" tag
                        if (id.getTag("AGG") != null) {
                            log.debug("Setting an aggregate meter: {} :: {}", id.getName(), id.getTags());
                            // Remove the "AGG" tag
                            List<Tag> tags = id.getTags().stream()
                                .filter(tag -> !StringUtils.equalsIgnoreCase(tag.getKey(), "AGG"))
                                .collect(Collectors.toList());

                            // Create a new Meter.Id
                            return new Meter.Id(id.getName(), tags, id.getBaseUnit(), id.getDescription(), id.getType());
                        }

                        // Create a new Meter.Id with the instanceId tag
                        return new Meter.Id(id.getName(), Arrays.asList(Tag.of("instanceId", instanceId)), id.getBaseUnit(), id.getDescription(), id.getType());
                    }
                })
                .meterFilter(MeterFilter.denyNameStartsWith("jvm.gc.pause"))
                .meterFilter(MeterFilter.denyNameStartsWith("logback"))
                .meterFilter(MeterFilter.denyNameStartsWith("process"))
                .meterFilter(MeterFilter.denyNameStartsWith("system.cpu"))
                .meterFilter(MeterFilter.denyNameStartsWith("jvm.buffer"))
                .meterFilter(MeterFilter.denyNameStartsWith("jvm.classes"));
        }
    };
}
于 2018-12-26T17:51:51.587 回答