分布式追踪用上下文连接一次请求的跨服务路径

从 trace、span、上下文传播和采样理解跨服务因果路径,并说明追踪不能替代指标与日志。

分布式追踪用上下文连接一次请求的跨服务路径

一个用户请求经过网关、服务、数据库和消息系统后,单个进程日志只能看到局部。分布式追踪用 trace 表示端到端活动,用 span 表示其中一个有时间边界的操作,再通过上下文传播把跨进程操作关联起来。它帮助回答延迟花在哪里、哪个依赖失败以及一次调用如何扩散,但不自动解释系统全部状态。

追踪、指标和日志各有侧重。指标适合聚合趋势和告警,日志记录离散细节,追踪保留一条请求的结构与时序。三者可以通过 trace 标识和共享属性联系,但不能互相完全替代。

trace 与 span 表达因果结构

trace 通常由唯一标识关联多个 span。span 记录操作名、开始结束时间、状态、属性、事件以及父子关系。父子关系表达调用或逻辑派生,并不要求所有操作严格嵌套。

入口请求创建或接收上下文,调用下游时把 trace 标识和当前 span 信息写入标准传播头。下游提取后创建子 span,返回时结束。若传播中断,链路会裂成多个独立 trace,看起来像请求凭空开始。

异步消息的因果关系更复杂。生产和消费可能相隔很久,一个批次也可能合并多个上游事件。应使用链接或合适的语义表达,而不是强行构造不真实的单一父子树。

span 名称应稳定且基数受控,例如使用路由模板而不是具体用户 URL。用户 ID、订单号等高基数字段可以作为受控属性或业务日志,但不应进入指标维度或无限扩展存储索引。

上下文传播必须跨越所有边界

HTTP、RPC 和消息中间件需要明确传播格式。代理、网关和第三方服务可能删除、重写或不支持追踪头。多种格式并存时还可能生成两个根 trace 或循环携带无关 baggage。

baggage 允许随上下文传递业务信息,但每次调用都会复制,增加网络成本并可能泄露敏感数据。只应携带下游确实需要的、体积受限且经过分类的信息,不能把它当作通用会话存储。

线程池、协程和异步回调会切换执行上下文。自动埋点能覆盖常见框架,手工任务和自定义协议仍需显式传递。错误传播常表现为 trace 中出现孤立 span 或父子顺序异常。

跨信任边界时要决定是否接受外部 trace 标识。无条件信任可能造成标识碰撞、存储污染或采样操控。网关可以保留关联信息,同时创建内部受控上下文。

埋点应围绕可诊断边界

有价值的 span 通常对应远程调用、队列处理、数据库操作或重要业务阶段。为每个小函数创建 span 会产生巨大数据量,反而淹没关键路径。操作名称和属性要遵循一致语义约定,使跨语言服务可以比较。

数据库 span 可以记录系统类型、操作和规范化语句,但不应采集密码、令牌或完整个人数据。HTTP span 记录方法、路由模板、状态和对端信息时同样要脱敏。

错误状态应反映操作语义。HTTP 404 可能是预期业务结果,不一定是服务故障;捕获异常但成功降级时,需要同时记录异常事件与最终状态。机械地把所有非 2xx 标红会降低信号质量。

版本、部署环境、服务实例和区域等资源属性帮助定位发布与故障域。属性命名变化会破坏查询连续性,应随遥测模式版本化。

采样决定能看到哪些请求

全量追踪成本随流量增长。头部采样在请求开始时决定是否记录,开销低但无法预知后面是否变慢或失败;尾部采样收集初步数据后按结果选择,能保留错误和高延迟请求,但需要缓冲、协调和更多基础设施。

固定比例采样会让低频错误很难出现。可以按服务、租户、错误和延迟制定规则,但规则本身会造成统计偏差。用采样 trace 估计请求总量时,需要知道采样概率和决策方式。

上游未采样时,下游是否单独采样要有一致策略。任意服务改变决策可能形成断裂链路。调试临时提高采样率也要设置范围、时限和成本保护。

时钟与排队会影响时间解释

跨主机时钟偏差可能让子 span 看起来早于父 span。现代时间同步能减小问题,但对短操作仍需谨慎。追踪系统可做校正,原始时间和校正规则应可审计。

一个 span 的总时长包含执行、排队、连接和等待。只有添加合适子 span 或事件,才能区分应用计算与连接池等待。没有子结构的长 span只说明边界内慢,不能直接指向代码。

异步队列还要区分生产时间、排队时间与消费处理时间。把整个等待算在消费者 span 中会误判服务性能,把它完全丢掉又看不到积压。

追踪数据本身需要治理

trace 可能包含 URL、查询、错误消息和业务属性,是潜在敏感数据。采集前应建立字段允许列表、脱敏、租户隔离、访问审计与保留期限。开发环境的宽松埋点不能原样进入生产。

后端存储不可用时,应用不应因导出追踪而阻塞关键请求。采集 SDK、代理和收集器需要批处理、队列上限、丢弃策略和自身指标。遥测管道故障必须可见,但不能成为业务级联故障源。

追踪的价值最终体现在诊断流程。告警跳转到代表性 trace,trace 再关联日志与部署版本,才能缩短定位时间。收集海量 span 却没有查询规范和负责人,只会增加成本。

分布式追踪提供的是一次活动的可关联证据。传播完整、语义一致、采样透明并受到数据治理约束时,它能揭示跨服务路径;缺少这些条件时,一条漂亮的时间线也可能只是部分事实。

资料依据