可观测性: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 慢查询、异常栈串成一条请求链路。注意:没引入对应桥接依赖时这些占位为空,属正常现象。

观测落地顺序建议

  1. 先保证标准指标(JVM/HTTP/连接池)能被 Prometheus 拉到;
  2. 业务关键路径埋 Counter/Timer(下单、支付回调);
  3. 日志统一结构化 + traceId,异常必有 error 级别日志带上下文;
  4. 配 Grafana 面板与告警规则,发布后观察基线。

小结:Micrometer 负责埋点、Prometheus 负责采集、traceId 把日志串成链路;Boot 3 中加 registry 依赖 + include 配置即可输出指标,再加 tracing 桥接实现日志关联。

笔记加载中…