Микрометр - общие метки для определенных метрик
Я пытаюсь выяснить, как установить общие теги для конкретных показателей. ПРИМЕЧАНИЕ: я использую систему мониторинга 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 и любые пользовательские метрики, которые я создаю, для которых нужны общие теги, а для других - нет.
Есть ли способ сделать это, что я скучаю?
2 ответа
Если вы хотите добавить метки к определенным счетчикам, зарегистрируйтесь MeterFilter
как боб. Для примера см. Следующий код: https://github.com/izeye/sample-micrometer-spring-boot/blob/so-53925641/src/main/java/com/izeye/sample/config/MetricsConfig.java#L40-L52
Ради потомков, вот мое решение с кодом. В выбранном ответе был предложен компонент @Autowired MeterFilter, но это не было необходимым для моего конкретного варианта использования.
Чтобы различать счетчики, которые я делаю и не хочу иметь тег instanceId, я установил тэг-ключ "AGG" для тех, для которых я не хочу иметь тег instanceId (т. Е. Это метрики, которые будут агрегированы из всех случаев), а затем удалить его.
@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"));
}
};
}