OpenTelemetry Provider链路跟踪示例
Code Source: https://github.com/gogf/examples/tree/main/observability/trace/provider
简介
本目录包含了在GoFrame应用程序中使用不同OpenTelemetry链路跟踪Provider配置的示例。包括:
-
gRPC Provider (
grpc/
)- 使用gRPC协议传输链路跟踪数据
- 配置带gRPC导出器的链路跟踪Provider
- 演示资源和采样器配置
-
HTTP Provider (
http/
)- 使用HTTP协议传输链路跟踪数据
- 配置带HTTP导出器的链路跟踪Provider
- 展示资源和采样器配置
-
内部组件 (
internal/
)- 通用Provider初始化代码
- 共享常量和配置
- 链路跟踪设置工具函数
目录结构
.
├── grpc/ # gRPC provider示例
│ └── main.go # gRPC provider实现
├── http/ # HTTP provider示例
│ └── main.go # HTTP provider实现
├── internal/ # 共享组件
│ ├── consts.go # 常量定义
│ ├── provider.go # Provider初始化
│ └── request.go # 请求工具
├── go.mod # Go模块文件
└── go.sum # Go模块校验和
环境要求
- Go 1.22 或更高版本
- GoFrame框架
- OpenTelemetry支持
功能特性
本示例展示了以下功能:
-
Provider配置
// 资源配置
res, err = resource.New(ctx,
resource.WithFromEnv(),
resource.WithProcess(),
resource.WithTelemetrySDK(),
resource.WithHost(),
resource.WithAttributes(
semconv.ServiceNameKey.String(internal.GRPCServiceName),
semconv.HostNameKey.String(serverIP),
),
)
// 采样器配置
trace.WithSampler(trace.TraceIDRatioBased(0.1)) -
资源属性
- 服务名称
- 主机信息
- 进程详情
- 自定义属性
-
采样策略
// 可用的采样策略
trace.WithSampler(trace.AlwaysSample()) // 总是采样
trace.WithSampler(trace.NeverSample()) // 从不采样
trace.WithSampler(trace.ParentBased(...)) // 基于父级的采样
trace.WithSampler(trace.TraceIDRatioBased()) // 基于跟踪ID的采样 -
Span处理
// 简单Span处理器
trace.WithSpanProcessor(trace.NewSimpleSpanProcessor(exporter))
// 批量Span处理器
trace.WithSpanProcessor(trace.NewBatchSpanProcessor(exporter))
Provider对比
gRPC Provider (grpc/)
-
特点:
- 高性能流式传输
- 双向通信
- 连接复用
- 压缩支持
-
配置:
otlptracegrpc.NewClient(
otlptracegrpc.WithInsecure(),
otlptracegrpc.WithEndpoint(internal.Endpoint),
otlptracegrpc.WithHeaders(map[string]string{
"Authentication": internal.TraceToken,
}),
otlptracegrpc.WithCompressor(gzip.Name),
) -
使用场景:
- 大规模链路跟踪
- 性能关键系统
- 流式跟踪数据
HTTP Provider (http/)
-
特点:
- 标准HTTP协议
- 配置简单
- 防火墙友好
- 压缩支持
-
配置:
otlptracehttp.NewClient(
otlptracehttp.WithEndpoint(internal.HTTPEndpoint),
otlptracehttp.WithURLPath(internal.HTTPPath),
otlptracehttp.WithInsecure(),
otlptracehttp.WithCompression(1),
) -
使用场景:
- 基本链路跟踪需求
- HTTP代理环境
- 简单部署
使用说明
gRPC Provider示例
-
进入gRPC示例目录:
cd grpc
-
运行示例:
go run main.go
HTTP Provider示例
-
进入HTTP示例目录:
cd http
-
运行示例:
go run main.go
实现说明
两个示例都演示了:
-
Provider设置
// 初始化链路跟踪Provider
func InitTracer(opts ...trace.TracerProviderOption) (func(ctx context.Context), error) {
tracerProvider := trace.NewTracerProvider(opts...)
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{},
propagation.Baggage{},
))
otel.SetTracerProvider(tracerProvider)
return func(ctx context.Context) {
// 优雅关闭
ctx, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
if err := tracerProvider.Shutdown(ctx); err != nil {
g.Log().Errorf(ctx, "关闭tracerProvider失败 err:%+v", err)
}
}, nil
} -
资源配置
- 服务标识
- 主机信息
- 进程属性
- 自定义标签
-
采样配置
- 采样策略选择
- 采样率配置
- 父级上下文处理
-
错误处理
- 连接错误
- 导出错误
- 关闭处理