端到端 Trace 指南
把一次完整的用户操作(浏览器 / App → 后端服务 → 下游服务)串成一条因果链,存进 Argus,
在 Console 用瀑布图查看。Argus Trace 100% 基于 W3C Trace Context(traceparent 头)。
能力概览:端 SDK 出站注入 → 后端 SDK 继承 → Console 瀑布图。三端(Web / iOS / Android)注入 + 后端(Go / Node)继承均已实现(Trace v1.5)。
关键概念
一个 trace 是一次用户操作引发的因果链,由多个 span 组成树状结构。每个 span 有
trace_id(整条链路共享)、span_id(本节点)、parent_span_id(父节点)。traceparent 头把
这三者在服务间传播:
traceparent: 00-<32hex trace_id>-<16hex span_id>-<2hex flags>
└─ 整条链路共享 └─ 本 span └─ 01=采样 / 00=不采一条端到端 trace 长这样:
trace_id = abc123...
└─ span: client.http "POST /api/order" (Web / App 端 SDK,出站注入)
└─ span: server.http "POST /api/order" (你的 Go / Node 服务,中间件继承)
├─ span: internal "charge-card" (手动子 span)
└─ span: client.http "POST payments" (出站注入,传给下游)
└─ span: server.http ... (下游服务继承)三步打通
端 SDK 出站注入 traceparent
Web:captureFetch(默认开)自动包裹 globalThis.fetch,给非 Argus 出站请求注入
traceparent 并上报 client span。非 fetch 传输手动传播:
const headers = Argus.traceHeaders(); // { traceparent: "00-<trace>-<span>-01" }iOS / Android:SDK 支持给出站请求注入 W3C traceparent(三端 parity 已收官)。
后端 SDK 继承 + 创建 server span
后端 SDK 的中间件读入站 traceparent,沿用其 trace_id,以上游 span_id 为本 server span
的 parent_span_id;无入站头则生成新 root trace。
// Go
http.ListenAndServe(":8080", client.Middleware(mux))// Node(Express)
app.use(argus.middleware());请求上下文内的日志自动带 trace_id、手动 StartSpan / startSpan 自动接父子。
把链路继续传给下游服务
出站请求再注入一次 traceparent,下游服务(同套后端 SDK / Go ↔ Node 混部)继续同一条 trace:
// Go
req.Header.Set("traceparent", argus.TraceparentFromContext(ctx))// Node
fetch(url, { headers: { ...argus.traceHeaders() } });采样一致性
头部采样按 trace_id 做 FNV-1a 一致性 hash,Web / Go / Node SDK 同算法、同向量——保证
整条 trace 要么全采、要么全弃,不会出现残缺链路。status=error 的 span 强制保留(即使采样
率很低也不丢错误链路)。
后端 SDK 用 sampleRate / SampleRate 配置([0,1],0/缺省=全采)。
日志 ↔ Trace 关联
后端日志若处于 active span 上下文,会自动带上 trace_id:
client.Info(ctx, "order received", map[string]string{"user_id": "u-42"})
// → 该日志带 trace_id,可在 Console 按链路聚合「后端 + 端上」日志客户后端日志 shipper 也可显式带 trace_id 或透传 traceparent,把同一请求横跨多服务的日志聚到
一起。详见 后端日志接入 。
Console 瀑布图
接入后,在 Console 的 /traces 页:
- Trace 列表:按 project / 时间 /
user_id/session_id/ status / operation / duration 过滤。 - Trace 详情(瀑布图):按父子关系缩进,每个 span 是一条时间轴长条,长度 ∝ 耗时,颜色编码:
- 🔴 红 =
status=error - 🔵 蓝 =
kind=client(出站调用) - 🟢 绿 =
kind=server(服务端处理) - ⚪ 灰 = 其他(internal 等)
- 🔴 红 =
- 点 span 看 attributes / status,定位慢在哪一跳。
端到端验证(本地)
# 1) 起后端服务(Go 或 Node 示例)
cd examples/go-backend-demo
ARGUS_DSN='argus://demo-public:demo-secret@localhost:4318/demo' go run .
# 2) 模拟端上 SDK 带 traceparent 进来
curl -H 'traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01' \
http://localhost:8080/api/order在 Console /traces 用该 trace_id(4bf92f3577b34da6a3ce929d0e0e4736)即可看到这条链路。
CE / EE 边界:W3C TraceContext 协议、events_trace 表 + 基础查询、端 + 后端 SDK、Console 列表
- 瀑布图、Trace↔Log/Crash/APM 关联跳转、基础采样配置 均在 CE(Apache 2.0)。跨服务拓扑图、
自动根因分析、长期归档(>14 天)属 EE / Cloud。详见
docs/02-product/29-trace-observability.md。