如何为Prometheus Micrometer标准指标添加application及instance标签?
问题描述
我有若干集成Actuator并暴露Prometheus指标的Spring Boot微服务,示例指标如下:
# HELP process_uptime_seconds The uptime of the Java virtual machine # TYPE process_uptime_seconds gauge process_uptime_seconds 3074.971
但这些指标缺少application标签,无法在Grafana仪表盘中关联至特定应用;同时部分微服务存在多实例,希望添加instance标签。请问能否对这些标准指标进行上述标签定制?
解决方案
完全可以给Spring Boot Actuator暴露的标准Prometheus指标添加application和instance标签,有两种常用实现方式:
方式一:通过配置直接全局添加
在每个微服务的配置文件中添加以下配置,就能给所有Actuator生成的指标统一加上指定标签:
YAML格式(application.yml)
management: metrics: tags: application: ${spring.application.name} instance: ${spring.cloud.client.ip-address}:${server.port}
Properties格式(application.properties)
management.metrics.tags.application=${spring.application.name} management.metrics.tags.instance=${spring.cloud.client.ip-address}:${server.port}
配置生效后,重启服务访问/actuator/prometheus,就能看到像这样带标签的指标:
process_uptime_seconds{application="order-service",instance="192.168.2.3:8081",} 3074.971
方式二:自定义MeterFilter实现精细化控制
如果只需要给特定指标加标签,或者有更复杂的标签逻辑,可以自定义MeterFilter类:
import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.config.MeterFilter; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CustomMetricTagConfig { @Value("${spring.application.name}") private String appName; @Value("${spring.cloud.client.ip-address}:${server.port}") private String instanceInfo; @Bean public MeterFilter addTargetTags() { return new MeterFilter() { @Override public Meter.Id map(Meter.Id id) { // 仅给process开头的指标添加标签 if (id.getName().startsWith("process_")) { return id.withTag("application", appName) .withTag("instance", instanceInfo); } return id; } }; } }
注意事项
- 如果没有引入Spring Cloud依赖,
${spring.cloud.client.ip-address}可以替换为${server.address},或者直接设置固定的实例标识字符串。 - 两种方式都不需要修改原有指标的生成逻辑,属于对现有指标的标签增强。
内容的提问来源于stack exchange,提问作者darth jemico
相关产品推荐
相关产品推荐

