MicroMeter: удалить / отключить определенный тег - PullRequest
1 голос
/ 13 марта 2019

Я использую связующие устройства MicroMeter по умолчанию, один из них создает калибровку 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

Каждый Meter из jvm.memory.used имеет следующую структуру:

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

Итакмы не можем просто фильтровать по getName().equals("jvm.memory.used") && getTag("id") != null

1 Ответ

3 голосов
/ 14 марта 2019

Я думаю, что вы, возможно, объединяете понятия. Теги просто «украшают» метрики / датчики дополнительной информацией, они фактически не приводят к отправке большего количества датчиков. Например, линия Metrics.gauge("name", Tags.of("id","a", "area","b"), 1) - это просто объект с одним калибром. Отказ от jvm.memory.used с тегом id, вероятно, приведет к запрету всех jvm.memory.used. Если вы все еще хотите фильтровать jvm.memory.used с тегом id, вы можете использовать

@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;
        }
    };
}

Вы также можете полностью настроить Meter.Id, возвращаемый путем вызова new Meter.Id(name, tags, baseUnit, description, type), как показано ниже, и изменения любых значений, которые вы хотите:

@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;
        }
    };
}
...