Микрометр: удалить / отключить определенный тег

#java #spring-boot #spring-boot-actuator #micrometer #spring-micrometer

#java #весенняя загрузка #пружинный загрузочный механизм #микрометр #spring-микрометр

Вопрос:

Я использую привязки микрометра по умолчанию, один из которых создает калибровку jvm.memory.used . Проблема в том, что он поставляется с 2 доступными тегами: «область» и «идентификатор». Это практически генерирует 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") amp;amp; getTag("id") != null

Комментарии:

1. приведенный ниже ответ был обновлен, и я протестировал его, чтобы подтвердить, что он работает локально

Ответ №1:

Я думаю, вы, возможно, объединяете понятия. Теги просто «украшают» метрики / датчики дополнительной информацией, фактически они не приводят к отправке большего количества датчиков. Например, строка 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()) amp;amp;
              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;
        }
    };
}
  

Комментарии:

1. Я попробую завтра, а пока спасибо!

2. К сожалению, оба метода не работают — первый невозможно выполнить, поскольку теги неизменяемы, а второй удаляет все измерители «jvm.memory.used».

3. Я добавил объяснение в свой вопрос

4. @yaseco извините, я пропустил ваш ответ, я не получил уведомление. Удалил removeIf , поскольку он не работал, и добавил что-то еще, что должно делать то, что вы ищете.

5. Работает как шарм — Извините за поздний ответ и большое спасибо!