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

Я использую стандартные папки MicroMeter, одна из которых создает Gauage 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") && getTag("id") != null


person yaseco    schedule 13.03.2019    source источник
comment
ответ ниже был обновлен, и я проверил его, чтобы убедиться, что он работает локально   -  person aarbor    schedule 20.03.2019


Ответы (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()) &&
              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;
        }
    };
}
person aarbor    schedule 13.03.2019
comment
Я попробую завтра, а пока спасибо! - person yaseco; 14.03.2019
comment
К сожалению, оба метода не работают - первый не может быть выполнен, поскольку теги неизменяемы, а второй удаляет все jvm.memory.used счетчики. - person yaseco; 14.03.2019
comment
Я добавил объяснение в свой вопрос - person yaseco; 14.03.2019
comment
@yaseco извините, я пропустил ваш ответ, я не получил уведомление. Удалил removeIf, поскольку он не работал, и добавил что-то еще, что должно делать то, что вы ищете. - person aarbor; 20.03.2019
comment
Работает как шарм - извините за поздний ответ и большое спасибо! - person yaseco; 21.03.2019
comment
можно ли что-то подобное сделать для веб-клиента? где я хочу отфильтровать все запросы, идущие к одной конкретной конечной точке из моего приложения. - person im_bhatman; 21.05.2021