背景
OpenTracing 是一个提供标准化分布式追踪功能的API和工具。它的主要作用包括:
跨系统边界追踪请求流程:OpenTracing 允许开发者跟踪一个请求从开始到结束在整个分布式系统中的所有经过的点(包括异构系统),帮助理解系统中的请求流程和服务间的相互依赖。
性能分析和瓶颈识别:通过记录请求在系统中各部分的时间花销,OpenTracing 可帮助识别请求处理过程中出现的性能瓶颈。
错误定位和问题诊断:当系统出现错误或异常行为时,OpenTracing 提供的细粒度数据可以帮助快速定位问题源头,进行故障诊断。
可视化:许多基于 OpenTracing API 的工具(如 Jaeger, Zipkin 等)提供了可视化界面,可以将追踪数据呈现为图形化的流程图,辅助开发者更直观地理解和排查问题。
适应性和可插拔性:OpenTracing 为追踪数据的收集提供了一个标准化框架,可以轻松替换或增加追踪系统的后端实现而不需要更改业务代码。
上下文传递:OpenTracing 定义了传播上下文信息的方式,这些信息在微服务、异步调用和其他复杂架构中尤为重要。
OpenTracing 作为 CNCF(云原生计算基金会)的一部分,是支持多种编程语言和框架的开源项目,使得开发者能够在各种环境以及服务提供商上使用同一套标准的追踪技术。
Mac 体验Opentracing
在本地机器上搭建一个简单的 Jaeger 演示环境来体验其 OpenTracing 功能。以下是创建一个基本 Jaeger 演示环境的步骤:
安装 Jaeger:
Jaeger 提供了 Docker 镜像,可以快速启动所有相关的服务(包括 Jaeger Agent、Jaeger Collector、Query Service 和一个简单的 Web UI)。使用以下 Docker 命令来启动:
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 14250:14250 \
-p 9411:9411 \
jaegertracing/all-in-one:latest
这个命令会下载并启动 Jaeger 的 all-in-one 镜像,其中包含了所有需要的组件,并且把一系列端口映射到你的宿主机,使得你可以本地访问 Jaeger UI。
查看 Jaeger UI:
通过浏览器访问 Jaeger UI,默认URL为 http://localhost:16686。
集成 OpenTracing API 到你的应用程序:
修改你的应用程序代码,加入 OpenTracing API 相关的代码,确保对关键操作创建跨度(Spans)。
配置 Jaeger 客户端:
在你的应用程序中使用 Jaeger 客户端配置连接到 Jaeger Agent。如果你使用的是本地环境,默认的地址通常是 localhost:6831。
运行你的应用程序:
当你的应用程序运行并处理请求时,它会生成追踪数据,并将数据发送到 Jaeger Agent。
分析追踪数据:
再次访问 Jaeger UI,在 Web 界面中你应该能够看到你的应用程序生成的追踪数据。你可以分析请求跨越系统各组件的路径,查看时序图,和调用关系。
A调用B Service观察 Opentracing UI
A service:
package main
import (
"io"
"log"
"net/http"
"time"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go/config"
)
func main() {
// 初始化 Jaeger tracer
tracer, closer := initJaeger("service-A")
defer closer.Close()
opentracing.SetGlobalTracer(tracer) // 设置全局 tracer
// 为服务 A 定义一个 HTTP 接口
http.HandleFunc