HelloWorld Jaeger 追踪指南
要为 HelloWorld 应用启用 Jaeger 追踪,只需三步走:部署 Jaeger 后端或使用托管服务;在应用里集成 OpenTelemetry/Jaeger 客户端并创建与导出跨度;确保上下文传播与合理采样,然后在 Jaeger UI 验证并迭代优化。

HelloWorld Jaeger 追踪指南 —— 用一句话讲清楚
把分布式追踪想成“事务的记账本”:每次请求在系统里经过多个服务,追踪把这些经过串成一条线索(trace),每段经过就是一个跨度(span)。当 HelloWorld 应用只是示例服务时,加入 Jaeger 追踪能让你看到请求的全程,找出慢点、瓶颈和调用关系。
先理解几个基本概念(费曼式把复杂拆开)
- Trace(追踪):一次端到端请求的完整链路,包含若干个 span。
- Span(跨度):表示请求在某个服务或函数内的一段操作,含有开始时间、结束时间、标签和日志。
- Context(上下文传播):让子调用知道父请求信息(trace id、span id、baggage 等),保持链路关联。
- Sampler(采样器):决定哪些 trace 会被发送并存储,避免洪水式数据。
- Agent / Collector / Storage:Jaeger 的组件,agent 接收并转发,collector 处理并写入存储(memory/elasticsearch/cassandra 等)。
准备工作(你需要的东西)
- 运行环境:本地 Docker、Kubernetes 集群或云虚拟机。
- Jaeger 后端:可用 jaeger-all-in-one(测试)、生产建议拆分 collector、ingester、query 和 storage。
- 应用代码:HelloWorld 服务源码,可在 Java、Go、Python、Node 等语言上接入。
- 追踪库:推荐使用 OpenTelemetry(兼容 Jaeger 导出器),也可直接用 Jaeger 客户端。
快速上手:本地 Docker Compose 示例(最少阻力)
如果只是试验,最简单的流程是用 jaeger-all-in-one 镜像启动后端,然后把 HelloWorld 应用配置为把 trace 发到本地 agent/collector。
- 命令示例(本地测试):
- docker run -d –name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 16686:16686 -p 6831:6831/udp -p 14268:14268 jaegertracing/all-in-one:latest
- 打开 Jaeger UI:访问 http://localhost:16686,搜索服务名即可看到 traces。
如何在 HelloWorld 应用里打点(用 OpenTelemetry 思路)
核心要做的事情很简单:初始化 Tracer → 在关键路径创建 Span → 确保上下文在请求链路里传递 → 导出到 Jaeger。
通用步骤(伪代码思路)
- 初始化 SDK:选择语言对应的 OpenTelemetry SDK,并配置 Jaeger 导出器(或者直接 JaegerExporter)。
- 包装入口:在 HTTP handler、gRPC 或消息入口处创建根 span(root span)。
- 传递 context:在发起下游 HTTP/gRPC 调用时,把 trace context 注入到请求头中(W3C traceparent 或 Jaeger header)。
- 添加标签与日志:把关键业务字段(user id、order id)作为属性/标签写入 span。
- 关闭/结束 span:每个 span 在完成时必须调用 end,以便正确记录持续时间。
不同语言的接入要点
- Go:用 go.opentelemetry.io/otel 和 otel/trace,HTTP 可用 otelhttp 中间件;注意使用批量导出器与 goroutine 安全。
- Java:使用 opentelemetry-java,Web 框架(Spring)常有自动化拦截器;注意 JVM 的资源限制与采样策略。
- Node.js:使用 @opentelemetry/sdk-node,对异步回调/Promise 链路要确保 context 保留(AsyncHooks)。
- Python:opentelemetry-sdk,Wsgi/Asgi 有插件,注意异步框架(asyncio)上下文传播。
示例:在一个简单的 HelloWorld HTTP 服务里打追踪点(伪实现)
下面是思路而非完整代码,方便理解每步的目的:
- 请求进来时:start root span “GET /hello”
- 在处理逻辑前:set attribute “user.id” / “request.id”
- 如果调用下游服务:inject trace headers 到 HTTP 请求
- 下游接收时:extract trace headers,继续创建 child span
- 响应结束:end span 并 flush exporter(批量模式会自动做)
Jaeger 部署架构与端口(便于快速检索)
| 组件 | 默认端口 | 说明 |
| UI(Query) | 16686 | Web 查看与搜索 traces |
| Agent UDP | 6831/UDP(Zipkin 9411 可选) | 本地 agent 接收 SDK 发送的 UDP 数据 |
| Collector | 14268(HTTP) | 接收并写入存储 |
| Storage(Elasticsearch/Cassandra) | 依存组件端口 | 生产持久化 |
采样策略与标签规范(避免后悔的工程实践)
追踪数据会很快变大,采样和标签是两个杠杆:
- 采样:开始用 100% 在测试环境验证逻辑;生产用概率采样(比如 1%)或基于规则(关键用户/错误/耗时请求全采样)。
- 标签:只加必要的高价值属性。避免高基数(cardinality)字段如完整用户邮箱、时间戳等作为标签,会导致索引暴涨。
常见问题与排查步骤(实用清单)
- 没有 trace 出现在 UI:
- 确认应用是否真的导出:查看日志是否有 exporter 错误。
- 检查 network:应用能否访问 agent/collector 的端口。
- 采样率是否过低:临时调高到 100% 做验证。
- trace 断裂(上下文丢失):
- 确认在跨进程调用时已注入/提取 trace headers。
- 异步框架中注意 context 保持(Node 的 AsyncHooks,Python 的 contextvars)。
- 存储压力大或查询慢:
- 检查索引策略(Elasticsearch)或表设计(Cassandra)。
- 降低采样率或使用更高效的存储引擎。
性能注意事项(不要因为观测而拖慢业务)
- 使用批量与异步导出器,减少阻塞性网络请求。
- 在高吞吐场景下,agent 模式(本地 UDP)通常比直接 HTTP 导出更轻量。
- 避免在每个请求把大量日志/标签写入 span。
- 监控 Jaeger 本身的资源消耗(CPU、内存、磁盘 I/O)。
生产环境的建议架构(渐进式成熟路线)
- 阶段 1(试验):使用 jaeger-all-in-one 或托管 Jaeger,100% 测试环境打点。
- 阶段 2(小规模生产):部署 agent + collector,使用 Elasticsearch 或 Cassandra 作为长期存储,配置概率采样或适配器式采样。
- 阶段 3(大规模):引入 OpenTelemetry Collector 做统一接入、聚合与处理,做规则化采样、标签清洗、数据脱敏与路由到不同后端。
实用清单(部署与调试步骤)
- 步骤 A:选择后端(本地测试用 all-in-one,生产用独立组件或托管)。
- 步骤 B:在 HelloWorld 应用里集成 SDK,设置服务名一致(便于搜索)。
- 步骤 C:实现上下文注入/提取,验证跨服务追踪连贯性。
- 步骤 D:设置采样策略与关键标签,避免高基数字段。
- 步骤 E:在 Jaeger UI 搜索并分析慢调用,按需优化。
小技巧与陷阱(那些会让你抓狂的细节)
- 不要把太多私有信息作为标签:合规与成本双重考虑。
- 在容器化环境里,优先用 sidecar/daemonset 的 agent 模式,减少应用配置复杂度。
- 遇到跨语言调用问题,确认双方都支持相同的 context 格式(W3C tracecontext 是推荐的标准)。
- 出问题先从采样率、网络与日志入手,逐步缩小范围。
进一步提升:把 Tracing 与 Metrics / Logs 结合
追踪回答“是哪一条链路慢”,而 Metrics 指标告诉你“系统是不是整体变慢”,Logs 提供了事件详情。把三者串联(常称为三位一体可观测性)能大幅提升问题定位速度。例如在 span 里写入 trace_id,方便在日志系统里快速跳转到对应 trace。
一些实践参考文献(名称即可)
- Jaeger 官方文档(概念与部署指南)
- OpenTelemetry 规范与语言 SDK 文档
- 链路追踪相关论文与博客(如“Google Dapper”)
好了,讲到这里你已经有一套从零到可用的思路:理解概念、快速验证、逐步迁移到生产、注意采样与标签、并结合日志与指标来做完整的可观测性。写这份指南的时候我也在想,要是把每一步都贴上代码和配置会更直观,不过那就得针对具体语言和部署环境把细节铺开了——这方面你要是有偏好的语言或部署方式,咱们可以接着把 HelloWorld 的示例代码一步步补齐。