Golang OTel追踪工具在可观测性与上下文中的应用
Golang OTel追踪工具在可观测性与上下文中的应用 一篇相关文章(欢迎分享您的想法) >> Golang 分布式追踪 – 基于 OpenTelemetry 的可观测性
1 回复
更多关于Golang OTel追踪工具在可观测性与上下文中的应用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
OpenTelemetry(OTel)在Go语言的可观测性实践中确实扮演着核心角色,尤其是在分布式追踪和上下文传播方面。以下是一个基于OTel的Go示例,展示如何创建追踪跨度(span)并通过上下文传递:
package main
import (
"context"
"time"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
"go.opentelemetry.io/otel/trace"
)
func initTracer() (*sdktrace.TracerProvider, error) {
exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://localhost:14268/api/traces")))
if err != nil {
return nil, err
}
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exp),
sdktrace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String("demo-service"),
)),
)
otel.SetTracerProvider(tp)
return tp, nil
}
func processOrder(ctx context.Context) {
tracer := otel.Tracer("order-service")
ctx, span := tracer.Start(ctx, "process-order")
defer span.End()
// 模拟业务处理
time.Sleep(100 * time.Millisecond)
// 传递上下文到下游函数
validatePayment(ctx)
}
func validatePayment(ctx context.Context) {
tracer := otel.Tracer("payment-service")
_, span := tracer.Start(ctx, "validate-payment")
defer span.End()
// 从上下文中获取追踪信息
spanContext := trace.SpanContextFromContext(ctx)
if spanContext.IsValid() {
// 可以记录追踪ID等元数据
_ = spanContext.TraceID().String()
}
time.Sleep(50 * time.Millisecond)
}
func main() {
tp, err := initTracer()
if err != nil {
panic(err)
}
defer tp.Shutdown(context.Background())
ctx := context.Background()
processOrder(ctx)
}
这个示例展示了:
- 使用Jaeger作为追踪后端初始化OTel
- 通过
tracer.Start()创建嵌套的追踪跨度 - 上下文在函数间传递时自动携带追踪信息
- 从上下文中提取追踪上下文进行验证
在实际微服务架构中,OTel的上下文传播机制可以无缝集成到HTTP/gRPC调用中,通过otelgrpc和otelhttp中间件自动注入和提取追踪头部。例如在gRPC客户端调用时:
import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
conn, err := grpc.Dial(
"localhost:50051",
grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor()),
grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor()),
)
这种设计确保了分布式系统中完整的调用链可视化,同时保持了代码的简洁性。

