1. 课程导学与背景:可观测性、链路追踪与 OpenTelemetry

1.1 什么是可观测性?

可观测性(Observability)是衡量系统内部状态可通过其外部输出推断的程度。在分布式系统中,它通常由三大支柱构成:日志(Logs)、指标(Metrics) 和 追踪(Traces)。

支柱 定义 典型问题
日志 离散的、带时间戳的事件记录 “这个错误发生在什么时候?”
指标 可聚合的数值数据(如 QPS、延迟、错误率) “系统当前负载是否过高?”
追踪 端到端的请求链路,记录跨服务的调用关系与耗时 “这个慢请求到底卡在哪个服务?”
核心观点:可观测性不是“拥有数据”,而是“无需预知问题就能快速定位根因”的能力。日志、指标、追踪三者互补,缺一不可。

1.2 为什么需要链路追踪?

在单体应用中,一次请求的调用栈清晰可见。但在微服务架构下,一个用户请求可能跨越 5~10 个服务、数十个数据库与缓存实例。当出现“页面加载慢”或“接口超时”时,传统监控只能告诉你“哪个服务慢了”,却无法回答“为什么慢”。

链路追踪(Distributed Tracing)通过为每个请求注入全局唯一的 Trace ID,串联起所有经过的服务节点,形成完整的调用拓扑与时间线。它的核心价值在于:

  • 定位瓶颈:精确找出耗时最长的 Span(跨度),是数据库查询、RPC 调用还是序列化操作。
  • 还原依赖:自动绘制服务依赖图,发现隐藏的循环调用或异常拓扑。
  • 关联数据:将 Trace ID 与日志、指标关联,实现“一键跳转”排障。
真实场景:某 Go Web 服务在高峰期出现 5% 的请求超时。通过链路追踪发现,并非所有服务都慢,而是某个 Redis 缓存节点因热 key 导致响应延迟从 2ms 飙升到 800ms。没有追踪,这种“针尖上的瓶颈”几乎无法定位。

1.3 OpenTelemetry 项目简介与优势

OpenTelemetry(简称 OTel)是 CNCF 的毕业项目,由 OpenTracing 和 OpenCensus 合并而来,旨在提供一套厂商中立、统一标准的可观测性数据采集框架。

它的核心组件包括:

  • API:定义 Traces、Metrics、Logs 的数据模型与操作接口。
  • SDK:实现 API,提供采样、上下文传播、导出等能力。
  • Collector:独立的代理服务,负责接收、处理、导出遥测数据。
  • Exporter:将数据发送到后端(如 Jaeger、Zipkin、Prometheus、Datadog)。

选择 OpenTelemetry 的五大优势:

优势 说明
统一标准 一套 API 覆盖追踪、指标、日志,避免多套 SDK 混用
厂商中立 不绑定任何后端,可随时切换 Jaeger、Zipkin、SkyWalking 等
多语言支持 Go、Java、Python、JavaScript 等主流语言均有官方 SDK
自动插桩 通过 Instrumentation 库自动拦截 HTTP、gRPC、数据库等常见库
社区活跃 CNCF 毕业项目,贡献者众多,迭代迅速
OpenTelemetry 架构概览 Go Web 应用 Java 微服务 Python 服务 OTel Go SDK OTel Java SDK OTel Python SDK OTel Collector Jaeger Prometheus Datadog Zipkin 应用通过 SDK 产生遥测数据 → Collector 统一处理 → 导出到任意后端

1.4 本课程的核心目标

本课程将带领你从零开始,使用 OpenTelemetry Go SDK 为 Go Web 应用构建完整的链路追踪体系。你将学到:

  • 如何为 Go HTTP 服务、gRPC 服务、数据库操作添加追踪插桩。
  • 如何配置采样策略、上下文传播与 Span 属性。
  • 如何搭建 OTel Collector 并导出数据到 Jaeger 进行可视化分析。
  • 如何通过链路追踪定位慢查询、慢调用等性能瓶颈。
前置要求:你需要具备 Go 语言基础(熟悉 net/http、context 包),了解微服务基本概念。无需 OpenTelemetry 或链路追踪经验,本课程会从原理到实践逐步讲解。