# 指标监控(Micrometer) [English](../en/metrics.md) | **简体中文** | [繁體中文](../tw/metrics.md) | [日本語](../ja/metrics.md) | [한국어](../ko/metrics.md) | [Español](../es/metrics.md) | [Türkçe](../tr/metrics.md) | [Русский](../ru/metrics.md) 组件内置了基于 [Micrometer](https://micrometer.io/) 的指标采集能力。**默认关闭**,需要显式设置 `retrofit.metrics.enable=true` 才会启用。 > **为什么是默认关闭、显式开启**:Spring Boot autoconfig 之间没有可靠的加载顺序约束,依赖 `@ConditionalOnBean(MeterRegistry.class)` 自动启用会因求值时机问题导致"用户引入 actuator 却没有指标"的隐性失败。改为 opt-in 后行为完全可预期:用户引入 actuator 不会被自动埋点;显式开启时若容器内没有 `MeterRegistry`,启动会快速失败而非静默无指标。 ## 启用方式 1. 引入 Micrometer 与对应的监控后端(Prometheus / Datadog / Atlas 等)。Spring Boot Actuator 会注册 `MeterRegistry`: ```xml org.springframework.boot spring-boot-starter-actuator io.micrometer micrometer-registry-prometheus ``` 2. 在配置中显式开启: ```yaml retrofit: metrics: enable: true ``` ## 采集的指标 | 指标名 | 类型 | 含义 | |---|---|---| | `retrofit.client.requests` | Timer | 每次 HTTP 调用耗时分布(含分位数与 SLO 直方图) | | `retrofit.client.requests.active` | LongTaskTimer | 进行中的请求数与最长存活时间 | | `retrofit.client.errors` | Counter | 请求异常计数(按 exception 类名维度) | ## 标签维度 默认 tag(基数有界,可放心用于 Prometheus 等高基数敏感后端): | Tag | 含义 | 取值示例 | |---|---|---| | `client` | Retrofit 接口的简单类名 | `UserService` | | `method` | Java 方法名 | `getUser` | | `http.method` | HTTP 方法 | `GET`/`POST` | | `uri` | 注解上的路径模板(不展开 `@Path`) | `user/{id}` | | `status` | 状态码桶 | `2xx`/`3xx`/`4xx`/`5xx`/`IO_ERROR` | | `outcome` | 业务结果 | `SUCCESS`/`CLIENT_ERROR`/`SERVER_ERROR`/`IO_ERROR` | | `exception` | 仅 errors 指标,异常类名 | `SocketTimeoutException` | > **注意**:tag 取值必须是有界集合,因此 `uri` 标签使用注解上的路径模板(含 `{id}` 占位符),而非展开后的实际 URL。这样可以避免动态路径参数导致的指标基数爆炸。 ## 配置项 ```yaml retrofit: metrics: # 是否启用,默认 false。需要显式设置为 true 才会装配 metrics 拦截器。 enable: true # Timer 发布的分位数;空数组表示不发布 percentiles: [0.5, 0.95, 0.99] # SLO 直方图分桶;空数组表示不发布直方图 sla: - 50ms - 100ms - 300ms - 1s - 3s tags: # 是否带 host 标签,默认关闭(动态 baseUrl 场景下 host 数量可能很大) host: false # 是否带 uri 标签,默认开启 uri: true # 全局静态附加标签 extra-tags: app: my-service env: prod # 指标名前缀,默认 retrofit.client metric-name-prefix: retrofit.client ``` ## 自定义标签 如果默认的 tag 维度不满足需求,可以实现 `RetrofitTagsProvider` 接口并注册为 Spring Bean,将自动覆盖默认实现: ```java @Component public class TenantAwareTagsProvider implements RetrofitTagsProvider { private final RetrofitTagsProvider delegate; public TenantAwareTagsProvider(MetricsProperty property) { this.delegate = new DefaultRetrofitTagsProvider(property); } @Override public Tags getTags(Request request, Response response, Throwable exception) { return delegate.getTags(request, response, exception) .and("tenant", TenantContext.current()); } } ``` > 自定义实现时务必保证:tag 取值集合有界、tag 顺序与名称稳定,否则会导致 Micrometer 创建多个无意义的 Meter,造成内存浪费。 --- [上一节:错误解码器](error-decoder.md) | [下一节:Actuator Endpoint](actuator.md)