Golang项目如何将生成的Traces发送至OpenTelemetry Collector
Golang应用通过OpenTelemetry Collector上报Trace到NewRelic配置流程
你已经完成代码埋点且能在终端打印Trace,说明核心埋点逻辑无问题,仅需调整导出配置、部署配置Collector即可完成链路打通,具体步骤如下:
1. 调整Golang应用侧的Trace导出配置
将当前使用的控制台Trace导出器替换为OTLP导出器,把Trace数据发送到Collector服务:
- 安装OTLP导出相关依赖
go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc@latest go get go.opentelemetry.io/otel/sdk@latest go get go.opentelemetry.io/otel/semconv/v1.24.0@latest
- 调整Tracer初始化逻辑,替换原有控制台导出器为OTLP导出器,核心初始化代码参考:
func initTracer() func(context.Context) error { // 初始化OTLP gRPC导出器,指向Collector的监听地址 exporter, err := otlptracegrpc.New(context.Background(), otlptracegrpc.WithEndpoint("127.0.0.1:4317"), otlptracegrpc.WithInsecure(), // 本地测试无TLS时开启,生产环境请配置证书并移除该选项 ) if err != nil { log.Fatalf("OTLP导出器初始化失败: %v", err) } // 配置服务资源属性,必须指定服务名,否则NewRelic侧无法识别服务 res, err := resource.New(context.Background(), resource.WithAttributes( semconv.ServiceNameKey.String("替换为你的实际服务名"), ), ) if err != nil { log.Fatalf("资源配置初始化失败: %v", err) } // 注册全局TracerProvider tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), // 用批量处理器提高上报效率 sdktrace.WithResource(res), ) otel.SetTracerProvider(tp) return tp.Shutdown }
- 在服务启动入口调用初始化方法,例如在
main函数开头添加:
shutdownTracer := initTracer() defer shutdownTracer(context.Background()) // 服务退出时兜底把剩余Trace上报完
2. 配置并启动OpenTelemetry Collector
Collector负责接收应用上报的Trace,处理后转发到NewRelic平台,配置分为三个核心模块:接收器、处理器、导出器。
- 新建配置文件
otel-collector-config.yaml,内容参考:
receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 # 接收应用gRPC协议上报的Trace http: endpoint: 0.0.0.0:4318 # 接收应用HTTP协议上报的Trace processors: batch: timeout: 1s send_batch_size: 1024 # 批量聚合Trace后上报,降低请求开销 exporters: otlp: endpoint: otlp.nr-data.net:4317 # NewRelic官方OTLP接入端点 headers: api-key: 替换为你NewRelic账号的Ingest License Key logging: loglevel: debug # 调试阶段开启,打印Collector接收到的Trace,验证通过后可移除 service: pipelines: traces: receivers: [otlp] processors: [batch] exporters: [logging, otlp]
- 用Docker快速启动Collector(推荐使用contrib版本,自带所有官方组件无需额外安装):
docker run -d \ -p 4317:4317 \ -p 4318:4318 \ -v $(pwd)/otel-collector-config.yaml:/etc/otelcol/config.yaml \ --name otel-collector \ otel/opentelemetry-collector-contrib:latest
3. 连通性验证
- 查看Collector运行日志,确认无端口监听、配置加载错误。
- 启动Golang应用,触发若干带Trace的业务请求,查看Collector日志,如果能看到接收到的Trace内容,说明应用到Collector的链路正常。
- 等待1-2分钟后登录NewRelic后台,进入Trace查询页面即可看到上报的链路数据。
常见问题排查
- 如果Collector收不到Trace:检查应用配置的Collector地址是否正确、防火墙是否放通对应端口、Collector是否正常监听0.0.0.0而非仅127.0.0.1。
- 如果Collector收到Trace但NewRelic看不到数据:检查配置的
api-key是否为NewRelic的Ingest类型密钥、Collector所在服务器是否能正常访问NewRelic接入端点、是否开启了网络代理拦截请求。 - 生产环境部署时记得移除导出器配置里的
WithInsecure()选项,配置TLS证书加密传输链路数据。
内容的提问来源于stack exchange,提问作者Akshat Goyal
相关产品推荐
相关产品推荐

