Golang应用无法向Otel Collector发送追踪数据求助
问题:本地Go服务无法向Docker运行的Otel Collector发送追踪数据
我正在用OpenTelemetry和Datadog配置项目追踪功能,本地通过Docker运行Otel Collector并将数据导出至Datadog后端,但本地Go Web服务器无法向Otel Collector发送追踪数据,报错连接被拒绝。
Otel Collector配置文件
receivers: otlp: protocols: grpc: endpoint: "localhost:4317" processors: batch: timeout: 10s exporters: datadog: api: key: <API-KEY> site: <SITE> extensions: health_check: pprof: zpages: service: pipelines: traces: receivers: [ otlp ] processors: [ batch ] exporters: [ datadog ] metrics: receivers: [ otlp ] processors: [ batch ] exporters: [ datadog ]
Otel Collector运行日志
API key validation successful..... Everything is ready. Begin running and processing data.
Go代码追踪配置实现
func SetupTracer(ctx context.Context) (func() error, trace.Tracer) { grpcClient := otlptracegrpc.NewClient( otlptracegrpc.WithInsecure(), otlptracegrpc.WithEndpoint("127.0.0.1:4317")) exporter, err:= otlptrace.New(ctx, grpcClient) if err != nil { log.Fatalf("failed to initialize exporter: %v", err) } openTelResource, err := resource.New( ctx, resource.WithAttributes(semconv.ServiceNameKey.String(ServiceName)), ) if err != nil { fmt.Println("error resource ", err) } traceProvider:= sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.AlwaysSample())), sdktrace.WithSpanProcessor(sdktrace.NewBatchSpanProcessor(exporter)), sdktrace.WithResource(openTelResource), ) otel.SetTracerProvider(traceProvider) otel.SetTextMapPropagator( propagation.NewCompositeTextMapPropagator( propagation.TraceContext{}, propagation.Baggage{}, ), ) return func() error { return traceProvider.Shutdown(ctx) }, traceProvider.Tracer(ServiceName, trace.WithInstrumentationVersion(ServiceVersion)) }
追踪功能初始化与使用方式
shutdown, tracer := instrumentation.SetupTracer(ctx) defer shutdown() _, span := tracer.Start(r.Context(), "do-something") // 业务逻辑处理 span.End()
报错信息
max retry time elapsed: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:4317: connect: connection refused"
解决步骤
1. 修改Otel Collector监听地址
Docker容器内的localhost仅指向容器自身,原配置中endpoint: "localhost:4317"会导致Collector只监听容器内部端口,宿主机无法访问。将监听地址改为0.0.0.0:4317,让Collector监听容器所有网络接口:
receivers: otlp: protocols: grpc: endpoint: "0.0.0.0:4317"
2. 启动Docker时映射端口
运行Otel Collector容器时,必须将容器的4317端口映射到宿主机对应端口,否则宿主机无法访问容器内服务。示例启动命令:
docker run -p 4317:4317 -v $(pwd)/otel-config.yaml:/etc/otelcol/config.yaml otel/opentelemetry-collector-contrib:latest
其中-p 4317:4317实现宿主机与容器的端口映射,-v用于挂载本地配置文件到容器内部。
3. 验证连接有效性
修改配置并重启容器后,用以下命令测试宿主机到4317端口的连通性:
nc -zv 127.0.0.1 4317
如果连接成功,重启Go服务即可正常发送追踪数据。
内容的提问来源于stack exchange,提问作者Tosh
相关产品推荐
相关产品推荐

