Go客户端集成
介绍
Jaeger是一个开源的分布式追踪系统,用于监控和排查微服务架构中的性能问题。通过Go客户端集成,开发者可以轻松为应用程序添加追踪功能,帮助分析请求在不同服务间的流转情况。
什么是分布式追踪?
分布式追踪记录了请求在多个服务间的调用路径和耗时,常用于诊断延迟问题或依赖关系分析。
前置条件
- 已安装Go 1.16+
- 运行中的Jaeger Collector(或使用All-in-one Docker镜像)
- 基础Go语言知识
基础配置
1. 安装依赖
bash
go get github.com/jaegertracing/jaeger-client-go
2. 初始化Tracer
go
package main
import (
"context"
"log"
"github.com/uber/jaeger-client-go"
jaegercfg "github.com/uber/jaeger-client-go/config"
)
func initTracer() (opentracing.Tracer, io.Closer) {
cfg := jaegercfg.Configuration{
ServiceName: "my-go-service",
Sampler: &jaegercfg.SamplerConfig{
Type: jaeger.SamplerTypeConst,
Param: 1,
},
Reporter: &jaegercfg.ReporterConfig{
LogSpans: true,
},
}
return cfg.NewTracer()
}
3. 创建Span示例
go
func main() {
tracer, closer := initTracer()
defer closer.Close()
// 创建根Span(代表完整请求)
span := tracer.StartSpan("say-hello")
defer span.Finish()
ctx := opentracing.ContextWithSpan(context.Background(), span)
// 业务逻辑
greet(ctx, "World")
}
func greet(ctx context.Context, name string) {
// 创建子Span
span, _ := opentracing.StartSpanFromContext(ctx, "greet-function")
defer span.Finish()
log.Printf("Hello, %s!", name)
}
实际案例:HTTP服务追踪
集成net/http
go
import "github.com/opentracing-contrib/go-stdlib/nethttp"
func main() {
tracer, closer := initTracer()
defer closer.Close()
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
span := tracer.StartSpan("http-request")
defer span.Finish()
// 业务处理
w.Write([]byte("Hello Traced World"))
})
// 包装Handler以自动处理追踪
wrappedHandler := nethttp.Middleware(tracer, http.DefaultServeMux)
http.ListenAndServe(":8080", wrappedHandler)
}
追踪流程图
高级配置
添加自定义标签
go
span.SetTag("user.id", 1234)
span.LogKV("event", "processing_started")
错误处理
go
if err != nil {
span.SetTag("error", true)
span.LogKV("error.message", err.Error())
}
总结
通过本教程你学会了:
- 在Go中初始化Jaeger Tracer
- 创建基础Span和上下文传播
- 集成HTTP服务自动追踪
- 添加自定义标签和错误处理
最佳实践
- 为所有微服务使用相同的采样配置
- 避免在Span中记录敏感信息
- 合理设置采样率(生产环境建议动态采样)
扩展练习
- 尝试将追踪集成到数据库操作中
- 在Jaeger UI中查看跨服务追踪数据
- 实现一个包含3个服务的调用链追踪