首页/云/可观测性速查/Go SDK 初始化示例

Go SDK 初始化示例

Go 接入:构建 OTLP gRPC 导出器、注册 TracerProvider 并 defer Shutdown 保证缓冲数据发出;服务名通过环境变量或 Resource 注入。

可观测性速查云更新于 2026-10-13

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 会不断累积导出连接与内存,短时间内就会出现资源问题。
初始化失败要打日志并让进程显式感知:把错误忽略掉会造成「服务正常、链路全无」的状态,排查时先怀疑网络而不是代码。

易错点

  • 进程退出前不关闭 provider 会丢掉缓冲中的 span,短生命周期任务尤其明显
  • 每次请求新建 provider 或导出器会造成连接与内存泄漏,全局只应有一个实例
  • 只在自己写的组件埋点而没有接入框架中间件,跨服务上下文无法串联,链路断成多段
  • 初始化错误被忽略时服务照常运行但链路数据为零,排障容易误判为采集端故障

数据来源与参考

  • OpenTelemetry Go · Getting started
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌