第 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-deploy 与 spring-cloud-web ch18。
18.1 可观测性三大支柱
Metrics Logs Traces
Prometheus/Grafana JSON → ELK/Loki OTel → Jaeger/Tempo
「系统是否异常?」 「发生了什么?」 「慢在哪里?」
| 支柱 | shop-spring-demo 示例 |
|---|---|
| Metrics | http_server_requests_seconds 直方图 |
| Logs | traceId=abc123 结构化 JSON |
| Traces | Span 串联 Controller → Service → Repository → Redis |
虚构 shop-spring-demo、api.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/prometheus | Prometheus 抓取 |
/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_secondsP95jvm_memory_used_byteshikaricp_connections_active(ch17 连接池)
告警规则示例(虚构):
- alert: HighErrorRate
expr: rate(http_server_requests_seconds_count{status=~"5.."}[5m]) > 0.05
for: 5m
labels:
severity: warning