适用场景
链路追踪解决的是「一次请求慢在哪一段」。落地难点不在装组件,而在采样与关联:全量采样成本高、采样率低了抓不到故障、trace_id 不进日志等于白装。
配置步骤(接入方式与埋点)
# 1) 无侵入接入(Java 示例:OpenTelemetry Java Agent)
java -javaagent:/opt/otel/opentelemetry-javaagent.jar \
-Dotel.service.name=order-api \
-Dotel.exporter.otlp.endpoint=http://otel-collector:4317 \
-Dotel.traces.sampler=parentbased_traceidratio \
-Dotel.traces.sampler.arg=0.05 \
-jar order-api.jar
# 2) 网关生成 trace_id(Nginx/Lua 思路)
# 若上游没带 traceparent,则生成并透传
# 3) 消息队列上下文传播:生产端注入 traceparent 到消息头,消费端读取继续
# 4) 应用日志带上 trace_id(PHP 示例字段)
# log: {"ts":"...","level":"error","svc":"order","trace_id":"4bf92f...","msg":"pay timeout"}
关键参数与建议
- 接入方式:优先无侵入(Agent/Sidecar),改代码成本高且容易漏埋点
- trace_id 贯穿:网关生成或透传,应用日志必须打 trace_id,否则排障时无法串联
- 采样策略:平时 1%-10% 尾采样,故障期或错误请求 100% 采样
- 上下文传播:HTTP header(traceparent)、消息队列、定时任务都要透传
- 数据保留:明细保留 7-15 天,聚合指标长期保留
- 性能开销:Agent 采样与上报要限速,避免把业务拖慢
- 验收:能对一次真实慢请求还原出完整调用链,含每段耗时与依赖
容易踩的坑
- 只在部分服务埋点,链路在中间断掉,看不到全貌
- trace_id 不进日志,排障时只能靠时间猜
- 采样率设 100%,Collector 与存储被打爆
- 采样率设 0.1%,故障请求根本没采到
- 异步任务与消息消费没透传上下文,链路断裂
- Agent 版本与业务框架不兼容,出现偶发超时
验证与巡检
# Collector 与采样检查
curl -s localhost:13133/ | head -3 # Collector 健康
# 在 trace 系统里按 trace_id 检索,确认有多段 span
# 日志关联抽样:随机取 5 条报错日志,看是否都有 trace_id
- 巡检:链路完整率、采样率配置与实际一致、错误请求 100% 采样、日志 trace_id 覆盖率 > 95%
小结
链路追踪验收:随机挑一条用户投诉的慢请求,能在 3 分钟内指认慢在哪一段(应用、数据库、缓存、第三方),而不是「感觉都慢」。
> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。