Go微服务中使用OpenTelemetry进行链路追踪
1. 基础设置
go get go.opentelemetry.io/otel
go get go.opentelemetry.io/otel/sdk
go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
go get go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp2. 初始化追踪器
package main
import (
"context"
"log"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
)
func initTracer(serviceName string) func() {
ctx := context.Background()
exporter, err := otlptracegrpc.New(ctx)
if err != nil {
log.Fatalf("创建OTLP导出器失败: %v", err)
}
res, err := resource.New(ctx,
resource.WithAttributes(
semconv.ServiceNameKey.String(serviceName),
),
)
if err != nil {
log.Fatalf("创建资源失败: %v", err)
}
tp := sdktrace.NewTracerProvider(
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(res),
)
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
return func() {
if err := tp.Shutdown(ctx); err != nil {
log.Printf("关闭追踪器提供者时出错: %v", err)
}
}
}
func main() {
cleanup := initTracer("service-name")
defer cleanup()
// 你的服务代码
}3. 在HTTP处理程序中使用追踪
4. 在HTTP客户端中使用追踪
5. 手动创建跨度
6. 在gRPC中使用追踪
7. 上下文传播
8. 配置采样
9. 使用Baggage传递自定义数据
最后更新于