Go SDK 初始化是什么
Go 应用接入 OpenTelemetry 的骨架与其它语言类似:创建 OTLP 导出器、装配带采样器的 TracerProvider、注册为全局实例,并在进程退出前关闭 provider。关掉 provider 这一步在 Go 里尤其容易漏——批处理导出器在内存里缓冲 span,进程结束时若不刷新,最后一批数据直接消失,而服务本身看不出任何异常。
基本信息
| 适用平台 | Go 1.20 及以上,OpenTelemetry Go SDK 各版本 |
|---|---|
| 关键依赖 | SDK trace 包、OTLP trace 导出器包 |
| 服务名注入 | OTEL_SERVICE_NAME 环境变量或 Resource 参数 |
| 资源释放 | 进程退出前关闭 provider,刷新缓冲 |
典型使用场景
- Web 框架接入:用官方中间件自动为每个请求创建 span
- gRPC 服务:统一拦截器埋点并传递追踪上下文
- 后台任务:长驻进程初始化一次 provider,全程复用
- 短任务脚本:任务结束前显式刷新,避免数据丢失
- 批量迁移:从自研埋点切到标准 SDK,统一上报格式
初始化骨架
初始化骨架
exp, err := otlptracegrpc.New(ctx,
otlptracegrpc.WithEndpoint("otel-collector:4317"),
otlptracegrpc.WithInsecure()) // 内网无 TLS 时的写法
if err != nil {
log.Fatal(err) // 初始化失败要尽早暴露
}
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exp), // 批处理导出
sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(0.1))))
otel.SetTracerProvider(tp)
defer tp.Shutdown(context.Background()) // 退出前刷新缓冲
// 服务名可用 OTEL_SERVICE_NAME 注入;Web 接入优先用中间件组件与作用
| 组件 | 作用 | 常见问题 |
|---|---|---|
| OTLP 导出器 | 按协议把 span 发往采集端 | 端点或 TLS 配置错误导致导出失败 |
| TracerProvider | 统一的埋点入口与配置中心 | 局部新建会造成连接泄漏 |
| 批处理导出器 | 批量发送降低开销 | 不关闭会丢失缓冲数据 |
| 采样器 | 决定链路保留比例 | 采样率全局不一致导致断链 |
| 中间件 | 自动为请求建 span | 未接入时手写埋点遗漏多 |
provider 只创建一次并在全局复用:每个请求或每次调用新建 provider 会不断累积导出连接与内存,短时间内就会出现资源问题。
初始化失败要打日志并让进程显式感知:把错误忽略掉会造成「服务正常、链路全无」的状态,排查时先怀疑网络而不是代码。