Go微服务链路追踪从Jaeger到OpenTelemetry的完整实践

📅 2026/8/22 16:11:17
Go微服务链路追踪从Jaeger到OpenTelemetry的完整实践
Go微服务链路追踪Jaeger-OpenTelemetry集成实战文章导语在微服务架构中一个用户请求可能经过10个服务。当出现延迟或错误时如何快速定位问题分布式链路追踪就是为此而生。本文基于Jaeger和OpenTelemetry在Go微服务中实现完整的链路追踪。一、OpenTelemetry SDK集成import(go.opentelemetry.io/otelgo.opentelemetry.io/otel/exporters/jaegergo.opentelemetry.io/otel/sdk/trace)funcInitTracer(serviceName,jaegerEndpointstring)(*trace.TracerProvider,error){exporter,err:jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(jaegerEndpoint)),)iferr!nil{returnnil,err}tp:trace.NewTracerProvider(trace.WithBatcher(exporter),trace.WithResource(resource.NewWithAttributes(semconv.SchemaURL,semconv.ServiceNameKey.String(serviceName),)),)otel.SetTracerProvider(tp)returntp,nil}二、HTTP中间件集成funcTracingMiddleware()gin.HandlerFunc{returnfunc(c*gin.Context){tracer:otel.Tracer(http)// 从上游提取contextctx:otel.GetTextMapPropagator().Extract(c.Request.Context(),propagation.HeaderCarrier(c.Request.Header),)ctx,span:tracer.Start(ctx,c.Request.Method c.FullPath())deferspan.End()span.SetAttributes(attribute.String(http.method,c.Request.Method),attribute.String(http.url,c.Request.URL.String()),)c.Requestc.Request.WithContext(ctx)c.Next()span.SetAttributes(attribute.Int(http.status_code,c.Writer.Status()))}}三、跨服务Trace传递funcCallDownstream(ctx context.Context)error{tracer:otel.Tracer(client)ctx,span:tracer.Start(ctx,CallDownstream)deferspan.End()req,_:http.NewRequestWithContext(ctx,GET,http://downstream/api,nil)// 注入trace信息到HTTP头otel.GetTextMapPropagator().Inject(ctx,propagation.HeaderCarrier(req.Header))resp,err:http.DefaultClient.Do(req)// ...}四、全文总结OpenTelemetry是CNCF标准的可观测性框架Jaeger作为后端存储和展示trace通过HTTP Headertraceparent实现跨服务传播Gin中间件自动为每个请求创建Span参考文献OpenTelemetry Go SDK: https://github.com/open-telemetry/opentelemetry-goJaeger: https://www.jaegertracing.io/OpenTelemetry规范