如何阻止Micrometer为Counter指标名称添加_total后缀?
关于Micrometer Counter指标自动添加_total后缀的问题解答
问题1:使用自定义CollectorRegistry的PrometheusMeterRegistry的其他弊端
- 需自行维护指标生命周期:默认PrometheusMeterRegistry已封装了指标注册、注销、去重等细节,自定义Registry后这些逻辑需要手动实现,增加维护成本。
- 丢失Micrometer的标准化能力:Micrometer默认会对指标名称、标签做跨监控系统的标准化处理,自定义Registry若未适配,可能导致指标不符合Prometheus最佳实践。
- 调试排查难度提升:出现指标异常时,需同时排查Micrometer层面和自定义CollectorRegistry的逻辑,而默认实现有成熟的社区文档和调试方案支撑。
- 兼容扩展功能成本高:Micrometer的全局标签、指标过滤、分层命名等扩展功能,需要额外适配才能在自定义Registry中生效。
问题2:直接使用PrometheusMeterRegistry的示例代码
依赖准备(Maven)
添加Micrometer Prometheus依赖:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.12.0</version> <!-- 使用最新稳定版本 --> </dependency>
代码示例
import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.config.NamingConvention; import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusMeterRegistry; import io.prometheus.client.Collector; import io.prometheus.client.CollectorRegistry; public class CustomPrometheusMeterExample { public static void main(String[] args) { // 创建自定义CollectorRegistry,可自定义指标注册逻辑 CollectorRegistry customRegistry = new CollectorRegistry(true) { @Override public void register(Collector collector) { // 此处可根据需求调整指标处理逻辑,示例保留父类默认行为 super.register(collector); } }; // 初始化PrometheusMeterRegistry,使用自定义Registry和原生命名规则 PrometheusMeterRegistry meterRegistry = new PrometheusMeterRegistry( PrometheusConfig.DEFAULT, customRegistry, NamingConvention.identity() // 确保Micrometer不修改原始指标名称 ); // 创建并递增Counter指标 Counter.builder("request_count") .tags("method", "GET") .tags("path", "/my/test/path") .register(meterRegistry) .increment(); // 输出抓取到的指标内容,验证名称是否为request_count而非request_count_total System.out.println(meterRegistry.scrape()); } }
关键说明
NamingConvention.identity()用于保持你定义的原始指标名称,避免Micrometer层面的名称修改。- 若需完全禁用
_total后缀,可在自定义CollectorRegistry的register方法中,修改Collector返回的MetricFamilySamples名称。
内容的提问来源于stack exchange,提问作者Giles Thompson
相关产品推荐
相关产品推荐

