
在 spring boot 应用中使用 micrometer 时,可通过 `/actuator/metrics/{name}` 端点配合 `tag=key:value` 查询参数,精确获取带特定标签的指标值,无需额外引入 prometheus 等注册中心。
Micrometer 是 Spring Boot 默认集成的指标收集框架,支持通过标签(Tag)对同一指标名称进行多维度区分(如按租户、环境、API 路径等)。正如你在代码中所实践的——为每个租户动态创建带 tenant 标签的 Counter 实例:
tenantList.forEach(tenant -> {
Counter.builder("company.publishing_errors")
.description("Total number of failed tries to publish an object.")
.tag("tenant", tenant) // 关键:为每个租户添加独立标签
.register(registry);
});这种写法会在 Micrometer 的 MeterRegistry 中注册多个逻辑上独立的 Counter 实例(底层共享同一 Meter.Id,但因 Tag 不同而分离统计),因此 /actuator/metrics/company.publishing_errors 返回的 JSON 中会包含 availableTags 字段,列出所有已注册的 tenant 值(如 ["tenant1", "tenant2"])。
但要注意:该端点默认返回的是该指标下所有标签组合的聚合统计(即总和),并非各标签的明细值。要获取某一个租户的具体计数值,必须显式指定标签过滤条件。
✅ 正确方式是:在请求 URL 中添加 tag 查询参数,格式为 tag=KEY:VALUE:
GET http://127.0.0.1:8080/actuator/metrics/company.publishing_errors?tag=tenant:tenant1
响应示例:
{
"name": "company.publishing_errors",
"description": "Total number of failed tries to publish an object.",
"baseUnit": null,
"measurements": [{
"statistic": "COUNT",
"value": 3.0
}],
"availableTags": []
}⚠️ 注意事项:
- tag 参数区分大小写,且 KEY 必须与注册时使用的标签键完全一致(如 "tenant" 不能写成 "Tenant" 或 "TENANT");
- 支持多次使用 tag 参数实现多标签过滤(如 ?tag=tenant:tenant1&tag=region:us-east),但前提是指标注册时已同时设置了这些标签;
- 无需启用 Prometheus 或其他第三方注册中心——这是 Micrometer Core + Spring Boot Actuator 内置功能,仅依赖 spring-boot-starter-actuator 和默认的 SimpleMeterRegistry(开发/测试环境)或 CompositeMeterRegistry(生产推荐);
- 不建议在代码中手动维护 Map
(如你的 errorCounters),这易导致内存泄漏或注册重复。更推荐使用 Counter.builder(...).tag("tenant", tenant).register(registry) 直接注册,并通过 registry.find("company.publishing_errors").tag("tenant", "tenant1").counter() 按需查找(适用于动态标签场景);
? 小技巧:若想一次性查看所有租户的明细,可调用 /actuator/metrics/company.publishing_errors 获取全部 availableTags,再循环构造带 tag 参数的请求;在 Grafana 等可视化工具中,该机制也正被自动用于构建下拉筛选器。
总之,Micrometer 的标签查询能力开箱即用,核心就是善用 ?tag=key:value —— 简洁、标准、无需扩展。










