场景描述
某电商平台在 Kubernetes 集群中运行微服务,近期用户反馈页面加载缓慢。运维团队通过基础监控发现 p99 延迟从 200ms 飙升到 2s,但现有 Prometheus 和 Grafana 仅收集 CPU、内存等指标,无法定位具体原因。团队决定引入 OpenTelemetry(OTel)实现链路追踪、指标和日志的统一可观测性。
症状
- Grafana 面板显示多个服务 p99 延迟异常升高(超过 1.5s)。
- 应用日志无错误,但出现大量 HTTP 503。
- Prometheus 告警触发“HighLatencyCritical”。
诊断
初步检查发现服务间调用缺乏关联。现有架构: - Prometheus 通过 kube-state-metrics 抓取基础指标。 - 应用未集成任何链路追踪库。 - 无统一日志聚合。
诊断结论:缺乏分布式追踪能力,无法识别瓶颈服务。
解决方案:整合 OpenTelemetry
- 部署 OpenTelemetry Collector:作为 Sidecar 模式注入每个服务 Pod,收集链路数据并导出到 Prometheus(通过 Remote Write)和 Grafana Tempo(或 Jaeger)。
- 应用代码注入:使用 OpenTelemetry SDK 自动或手动注入 API,上报 trace 和 metric。
- Grafana 配置:添加 Prometheus 和 Tempo 数据源,创建新 Dashboard 展示 trace 详情。
实施命令
步骤 1:部署 OpenTelemetry Collector(Sidecar)
创建 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-collector-conf
data:
config.yaml: |
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
prometheus:
endpoint: 0.0.0.0:8889
otlp:
endpoint: tempo-sample:4317 # 假设 Tempo 服务
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlp]
metrics:
receivers: [otlp]
exporters: [prometheus]
注入 Sidecar 到 Deployment:
spec:
template:
spec:
containers:
- name: myapp
image: myapp:latest
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://localhost:4317
- name: otel-collector
image: otel/opentelemetry-collector-contrib:latest
args: ["--config=/conf/config.yaml"]
volumeMounts:
- name: otel-collector-config-vol
mountPath: /conf
ports:
- containerPort: 4317
- containerPort: 4318
- containerPort: 8889
volumes:
- name: otel-collector-config-vol
configMap:
name: otel-collector-conf
步骤 2:配置 Prometheus 远程写入
Prometheus 配置中添加 remote write 接收 OTel 指标:
remote_write:
- url: http://prometheus-server:9090/api/v1/write
注意:生产环境建议使用专用 Remote Write 端点。
步骤 3:Grafana 设置
在 Grafana 中,添加 Prometheus 数据源(URL: http://prometheus-server:9090)和 Tempo 数据源(URL: http://tempo:3100)。
创建 Dashboard:搜索 span 延迟,如 kind=SPAN_KIND_SERVER。
风险控制
- 性能影响:Sidecar 模式占用额外资源(约 50MB 内存/收集器)。建议对高吞吐应用限制采样率(如 10%)。
- 数据安全问题:追踪数据可能包含敏感信息,需使用 OTel 处理器过滤或脱敏。
- 版本兼容:确保 OTel Collector 版本与 SDK 兼容。
回滚方案
如果出现问题:
1. 回滚应用 Deployment 到未注入 Sidecar 版本:kubectl rollout undo deployment/myapp。
2. 删除 OTel Collector 的 ConfigMap:kubectl delete configmap otel-collector-conf。
3. 移除 Grafana 中新增的数据源,恢复到旧 Dashboard。
验证方法
- 检查链路数据:在 Grafana Explore 中查询 trace,应看到完整调用链。
- 查看指标:Prometheus 中出现
service_latency_seconds等自定义指标。 - 重压测试:使用负载工具(如 hey)模拟请求,观察 p99 延迟是否恢复正常。
何时提交 OpsGlobal 工单
- 如果自行部署 OTel Collector 遇到配置错误(如数据不完整)。
- 需要优化采样策略或扩展 Tempo 存储。
- Grafana Dashboard 设计咨询。
我们的 SRE 专家可 15 分钟内响应,提供端到端可观测性方案。
适用场景
适合正在处理 Observability、Kubernetes, OpenTelemetry, Prometheus, Grafana 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
本文通过一个真实场景,介绍如何整合 OpenTelemetry、Prometheus 和 Grafana 解决 Kubernetes 集群中服务高延迟问题。涵盖症状、诊断、命令、风险控制、回滚、验证及工单提交流程。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。