Trace 与日志关联:让一次请求只有一条排障路径

背景 同一次故障分散在网关、服务和消息消费者里,靠时间搜索日志很容易混入其他请求。需要统一的关联字段与传播协议。 核心判断 从当前有效 span 提取 trace_id 和 span_id,再构造结构化日志。 请求 ID 保留入口语义,版本与服务名帮助定位发布差异。 跨消息边界显式注入和提取追踪上下文。 最小示例 下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。 logger := slog.With("trace_id", traceID, "span_id", spanID); logger.Error("payment failed", "order_id", orderID) 边界与误区 示例中的 ID 来自业务上下文,不是任意字符串。未采样请求也可以有 trace ID,但追踪后端不一定留存该 trace,日志必须仍能独立排障。 验证方式 发送一个跨服务并经过队列的请求,检查各段日志的关联一致性;再覆盖无父级上下文、未采样请求与消费者重试。 小结 日志统一输出 trace_id、span_id、request_id 和版本,异步消息显式传递上下文。

2026年9月28日 · 1 分钟 · BvBeJ

OpenTelemetry 采样策略:让重要请求留下完整证据

背景 只做小比例入口采样,最想排查的错误请求也可能被丢掉。尾部采样可以根据已接收的 trace 内容决策,但需要付出缓存与等待成本。 核心判断 错误、慢请求和基础概率策略分别配置,给普通请求保留代表性样本。 同一 trace 的 spans 必须汇聚到同一尾采样实例。 按请求速率与决策窗口估算内存,监控缓存压力和丢弃情况。 最小示例 下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。 processors: tail_sampling: decision_wait: 10s num_traces: 50000 policies: - name: errors type: status_code status_code: status_codes: [ERROR] - name: slow type: latency latency: threshold_ms: 1000 - name: baseline type: probabilistic probabilistic: sampling_percentage: 5 边界与误区 示例是 Collector contrib 的处理器片段,需接入 traces pipeline。入口已经丢弃的 spans 无法被尾采样恢复,决策窗口也不能保证迟到 span 完整保留。 验证方式 发送成功、ERROR 状态和高延迟三类 trace,核对实际留存比例。扩容 Collector 时检查 trace 分片和完整性,而不只看导出吞吐。 小结 基础比例采样之外,应优先保留错误、超时和高价值业务请求。

2026年9月8日 · 1 分钟 · BvBeJ

OpenTelemetry 指标治理:控制基数比盲目埋点更重要

指标系统最怕什么 很多团队一开始埋点很积极,过一阵就发现存储暴涨、查询变慢。高基数标签通常是罪魁祸首。 典型高危标签: user_id request_id 完整 URL 路径 动态错误信息 设计原则 指标看聚合趋势,不看单请求细节 单请求细节放到 trace 或日志 标签值集合必须可控 一个可行做法 http.route 用模板路由,如 /users/:id 错误类型归类为固定枚举 把业务自定义标签做白名单审核 工程措施 在 SDK 层做标签拦截 给 metric pipeline 增加 cardinality 预算告警 定期扫描 top N label pairs 小结 可观测性不是“埋得越多越好”。指标、日志、追踪各司其职,系统才能长期稳定运行。

2026年4月25日 · 1 分钟 · BvBeJ

从零理解分布式追踪:OpenTelemetry 实战

问题是:微服务出问题了怎么办 假设你负责一个电商系统,用户下单失败,你知道问题在哪吗? 用户 → API Gateway → Order Service → Inventory Service → Database ↓ Payment Service → 第三方支付 可能出问题的点太多了:网络超时、数据库慢查询、第三方接口挂了、代码 bug… 如果没有任何追踪手段,你只能靠经验和日志去猜。 分布式追踪就是来解决这个问题的。 核心概念:三根柱子 可观测性有三根支柱:Traces(追踪)、Metrics(指标)、Logs(日志)。这里重点聊 Traces。 Trace:一次请求的完整路径 一个 Trace 由多个 Span 组成,每个 Span 代表一个操作: Trace: 用户下单流程 ├── Span: 接收 HTTP 请求 │ ├── Span: 查询库存 (Inventory Service) │ │ ├── Span: SELECT * FROM inventory WHERE sku = ? │ ├── Span: 创建订单 (Order Service) │ │ ├── Span: INSERT INTO orders ... │ ├── Span: 调用支付 (Payment Service) │ │ └── Span: POST /api/pay 每个 Span 记录: ...

2026年4月15日 · 4 分钟 · BvBeJ