第 10 章 · 可观测性进阶:链路追踪、日志管道与告警
本章在第 6 章 Prometheus / Grafana 基础上,补齐 日志聚合、分布式链路追踪 与 告警闭环,形成「指标 + 日志 + 链路」三板斧。
前置:Elasticsearch(第 5 章)、Prometheus + Grafana(第 6 章或集群插件)已部署。
10.1 可观测性架构
┌──────────────┐ metrics ┌─────────────┐
│ 业务 Pod │ ───────────────► │ Prometheus │──► Grafana 大屏
│ /metrics │ └─────────────┘
├──────────────┤ traces ┌─────────────┐
│ OpenTelemetry│ ───────────────► │ Jaeger │──► 16686 UI
├──────────────┤ logs ┌─────────────┐
│ stdout/文件 │ ───────────────► │ Loki / ES │──► Grafana Explore
└──────────────┘ └─────────────┘
│
告警规则 ──► 邮件/Webhook/钉钉
| 维度 | 组件(商店 id) | 解决什么问题 |
|---|---|---|
| 指标 | prometheus / 集群插件 | QPS、延迟、资源占用 |
| 日志 | loki + Grafana;或 elasticsearch | 排障、审计、全文检索 |
| 链路 | jaeger | 跨服务调用耗时、瓶颈定位 |
| 告警 | Prometheus rule_files + Grafana Alerting | 故障主动通知 |
商店 无独立 Kibana 目录项。日志可视化推荐 Grafana + Loki 或 Grafana + Elasticsearch 数据源;复杂检索可用 ES Dev Tools(第 5 章)。
10.2 Jaeger 1.57(分布式链路追踪)
适用场景
| 选用 | 说明 |
|---|---|
| 微服务调用链分析 | API → 订单 → 库存 → MQ 全链路耗时 |
| 慢请求定位 | 哪个 Span 占用 2s |
| 与指标互补 | Prometheus 看聚合,Jaeger 看单次请求 |
不选用:单体应用、无跨服务调用;仅需日志时用 Loki/ES。
商店部署参数
| 项 | 值 |
|---|---|
| id | jaeger |
| 镜像 | jaegertracing/all-in-one:1.57 |
| 端口 | 16686(UI);采集 4317(OTLP gRPC)、4318(OTLP HTTP) |
| PVC | 可选;All-in-One 演示可不挂卷 |
| Namespace | monitor |
环境变量(确认页 YAML)
env:
- name: COLLECTOR_OTLP_ENABLED
value: "true"
步骤 ③ 网络:除 16686 外,在 端口 弹窗补充 4317、4318(ClusterIP 即可,应用内网推送)。
连接语法
| 协议 | Endpoint(集群内) |
|---|---|
| OTLP gRPC | jaeger.monitor.svc.cluster.local:4317 |
| OTLP HTTP | http://jaeger.monitor.svc.cluster.local:4318/v1/traces |
| UI | http://<节点IP>:<NodePort> → 16686 |
应用埋点(OpenTelemetry)
Spring Boot 3(application.yml)
management:
tracing:
sampling:
probability: 1.0
otlp:
tracing:
endpoint: http://jaeger.monitor.svc.cluster.local:4318/v1/traces
依赖:opentelemetry-spring-boot-starter + micrometer-tracing-bridge-otel。
Python FastAPI
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
provider = TracerProvider()
provider.add_span_processor(
BatchSpanProcessor(OTLPSpanExporter(endpoint="jaeger.monitor:4317", insecure=True))
)
trace.set_tracer_provider(provider)
验收
- 浏览器打开 Jaeger UI → Service 下拉出现
order-api等 - 发起一次跨服务 HTTP 调用 → Find Traces 可见完整 Span 树
- 点击慢 Span 查看 Tags(
http.url、db.statement)
小紫运维
| 入口 | 操作 |
|---|---|
| 应用部署 → 日志管理 | 确认 COLLECTOR_OTLP_ENABLED=true |
| 运维 → 工作负载 → YAML | 补端口 4317/4318 |
| 无 Trace | 检查应用 OTLP Endpoint、采样率、防火墙 |
10.3 Grafana Loki(日志聚合)
适用场景
| 选用 | 说明 | |
|---|---|---|
| 容器 stdout 日志集中查询 | `{namespace="app"} | = "error"` |
| 与 Grafana 一体 | 指标与日志同一面板 | |
| 成本低于 ES 全文索引 | 按标签过滤为主 |
商店部署参数
| 项 | 值 |
|---|---|
| id | loki |
| 镜像 | grafana/loki:2.9.x(以卡片为准) |
| 端口 | 3100 |
| PVC | 20 Gi → /loki |
| Namespace | monitor |
核心配置(单节点演示)
确认页 YAML 可设:
args:
- -config.file=/etc/loki/local-config.yaml
或通过工作负载挂载 loki-config.yaml:
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h