可观测性:Micrometer + Prometheus 指标与日志关联
线上出问题,先问三个问题:指标(Metrics)——哪里慢了多了?日志(Logs)——报了什么错?链路(Traces)——一次请求经过了谁?这就是可观测性三支柱。Micrometer 是指标门面(应用只面向它埋点),Prometheus 是时序数据库 + 拉取器,日志关联用 traceId 把三支柱串起来。示例基于 Boot 3.x(4.0 的观测 API 基本延续,具体以官方文档为准)。
暴露指标端点
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: health,prometheus # 默认只暴露 health,需显式放行
启动后 GET /actuator/prometheus 即输出文本格式指标:JVM(jvm_memory_used_bytes)、HTTP(http_server_requests_seconds_*)、HikariCP 连接池等 Boot 已自动埋点,无需额外代码。
自定义业务指标
@Component
public class OrderMetrics {
private final Counter orderCreated;
private final Timer createDuration;
public OrderMetrics(MeterRegistry registry) { // MeterRegistry 自动注入
orderCreated = registry.counter("order.created.total", "channel", "web");
createDuration = registry.timer("order.create.duration");
}
public void recordCreate(long costMillis) {
orderCreated.increment(); // 输出:计数器 +1
createDuration.record(Duration.ofMillis(costMillis)); // 记录耗时
}
}
命名规范:小写点分(order.created.total),标签(tag)控制维度,别把订单号这类高基数值当 tag。
Prometheus 抓取
scrape_configs:
- job_name: "user-service"
metrics_path: /actuator/prometheus
static_configs:
- targets: ["localhost:8080"] # 生产指向服务实际地址/服务发现
拉取后即可在 Grafana 上做面板与告警(如 QPS、P99 延迟、连接池活跃数、JVM 堆)。
日志关联:traceId 贯穿
单看日志难串联一次跨服务请求。Boot 3 引入 Micrometer Tracing:请求进入时生成 traceId/spanId,随日志输出、可跨服务传递。加桥接依赖(如 micrometer-tracing-bridge-brave 或 OpenTelemetry 桥,配套 span 导出到 Zipkin/OTLP 的依赖组合以官方文档为准),然后在日志 pattern 里带上:
logging:
pattern:
level: "%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]"
输出形如:INFO [user-service,8f2c1a9e...,8f2c1a9e...] ... 创建用户——拿着 traceId 就能把网关、服务、DB 慢查询、异常栈串成一条请求链路。注意:没引入对应桥接依赖时这些占位为空,属正常现象。
观测落地顺序建议
- 先保证标准指标(JVM/HTTP/连接池)能被 Prometheus 拉到;
- 业务关键路径埋 Counter/Timer(下单、支付回调);
- 日志统一结构化 + traceId,异常必有 error 级别日志带上下文;
- 配 Grafana 面板与告警规则,发布后观察基线。
小结:Micrometer 负责埋点、Prometheus 负责采集、traceId 把日志串成链路;Boot 3 中加 registry 依赖 + include 配置即可输出指标,再加 tracing 桥接实现日志关联。