下载工作台
Spring Boot Web 开发

Micrometer、链路追踪与 APM

试读上半部分 · 解锁后可读全文

第 18 章 · Micrometer、链路追踪与 APM

本章目标:使用 Spring Boot Actuator 暴露健康检查与 /actuator/prometheus 指标;理解 RED 方法Grafana 告警概念;集成 Micrometer Tracing(OpenTelemetry Bridge),让 traceId 贯穿 MVC、JPA 与 Redis;将 MDC traceId(ch09)与 metrics、日志关联;了解 APM(Datadog / New Relic 类)概念;建立生产可观测性 checklist

学时建议:5~6 小时(含 2 小时 Prometheus + Grafana 跟练)

前置:本模块 ch09 AOP 与 MDC;ch10 Redis;ch11 jar 部署;ch17 JPA 慢查询。监控概念可对照 ops-deployspring-cloud-web ch18


18.1 可观测性三大支柱

         Metrics              Logs               Traces
    Prometheus/Grafana    JSON → ELK/Loki    OTel → Jaeger/Tempo
    「系统是否异常?」     「发生了什么?」      「慢在哪里?」
支柱shop-spring-demo 示例
Metricshttp_server_requests_seconds 直方图
LogstraceId=abc123 结构化 JSON
TracesSpan 串联 Controller → Service → Repository → Redis
虚构 shop-spring-demoapi.example.com严禁写入真实监控 SaaS API Key。

RED 方法Rate(QPS)、Errors(5xx 率)、Duration(P95/P99 延迟)。


18.2 Spring Boot Actuator

pom.xml

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

application.yml

management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus,metrics
  endpoint:
    health:
      show-details: when_authorized
  metrics:
    tags:
      application: shop-spring-demo
端点用途
/actuator/health存活/就绪探针(K8s)
/actuator/prometheusPrometheus 抓取
/actuator/metrics单指标查询

安全:生产勿将 actuator 全量暴露公网;Nginx 限制 IP 或独立 management 端口:

management:
  server:
    port: 9090

18.3 自定义业务指标

@Service
@RequiredArgsConstructor
public class OrderService {
    private final MeterRegistry registry;
    private final Counter orderCreatedCounter;

    public OrderService(MeterRegistry registry, OrderRepository repo) {
        this.registry = registry;
        this.orderCreatedCounter = Counter.builder("shop.orders.created")
            .description("订单创建总数")
            .tag("channel", "api")
            .register(registry);
        // ...
    }

    @Transactional
    public Order create(CreateOrderCommand cmd) {
        Order order = /* ... */;
        orderCreatedCounter.increment();
        registry.timer("shop.orders.create.latency").record(() -> { /* 可选 */ });
        return orderRepository.save(order);
    }
}

常用指标类型:

类型场景
Counter订单数、登录失败次数
Timer接口耗时、DB 操作
Gauge队列长度、连接池活跃数

18.4 Prometheus 与 Grafana(本地跟练)

docker-compose.observability.yml(虚构,仅教学):

services:
  prometheus:
    image: prom/prometheus:v2.48.0
    ports: ["9090:9090"]
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
  grafana:
    image: grafana/grafana:10.2.0
    ports: ["3000:3000"]

prometheus.yml 片段:

scrape_configs:
  - job_name: shop-spring
    metrics_path: /actuator/prometheus
    static_configs:
      - targets: ["host.docker.internal:9090"]

Grafana 导入 JVM (Micrometer)Spring Boot 2.1 Statistics 面板,观察:

  • http_server_requests_seconds P95
  • jvm_memory_used_bytes
  • hikaricp_connections_active(ch17 连接池)

告警规则示例(虚构):

- alert: HighErrorRate
  expr: rate(http_server_requests_seconds_count{status=~"5.."}[5m]) > 0.05
  for: 5m
  labels:
    severity: warning

以下内容需解锁后阅读

试读已结束。解锁本章 ¥5.00,或开通年度会员畅读全部教程。
年度会员 ¥199.00/年; 小紫 AI 工作台有效会员 ¥99.00/年

正文仅在服务端鉴权后下发,未付费无法获取下半部分内容。