You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:11:29