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

.NET 6应用Trace无法被本地Docker部署的OTLP Collector采集问题

Troubleshooting OTLP Collector Trace Receipt from Local .NET 6 App (Dockerized Collector)

Let's break down your issue and walk through fixes step by step — I've run into similar network and config gotchas when setting up OTel locally, so this should help get things working.

First: Fix the OTLP Collector Configuration

Looking at your collector config, there's a critical issue that's almost certainly blocking trace processing: your trace pipeline references an otlp exporter that you haven't defined in the exporters section.

When the collector starts up, it tries to initialize the pipeline but can't find the otlp exporter config. This means the trace pipeline fails to load entirely — even if the container looks like it's running, it won't actually process any incoming traces.

Here's the corrected config: I removed the unconfigured otlp exporter from the pipeline and added an optional HTTP receiver endpoint (in case you ever need it for HTTP-based OTLP):

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318 # Optional, for HTTP-based OTLP
processors:
  batch:
exporters:
  logging:
    loglevel: debug
extensions:
  health_check:
  zpages:
    endpoint: 0.0.0.0:55679
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [logging] # Only use the configured logging exporter
  extensions: [health_check, zpages]

Second: Verify Network Connectivity (and Fix DNS/IP Quirks)

You mentioned curl can access http://localhost:4317, but note that 4317 is the OTLP gRPC port — curl sends HTTP requests by default, so that test doesn't validate gRPC traffic properly. Use grpcurl (a gRPC testing tool) to confirm the collector's gRPC endpoint is working:

grpcurl -plaintext localhost:4317 list

If this returns a list of OTel services, the gRPC port is functioning as expected.

Next, fix the localhost resolution issue between your local app and the Docker container:

  • On Windows/macOS, replace your app's endpoint with http://host.docker.internal:4317. Docker provides this special DNS name that maps to your host machine's IP, routing traffic directly to the container's mapped port.
  • On Linux, get the container's internal IP with this command:
    docker inspect otlp-collector | grep -A 2 "IPAddress"
    
    Then update your app's endpoint to http://<container-ip>:4317.
  • As a last-resort test (not recommended for production), run the collector in host network mode to use your host's network stack directly. Update your docker-compose config:
    otlp-collector:
      image: otel/opentelemetry-collector:0.55.0
      container_name: otlp-collector
      command: ["--config=/etc/otel-collector-config.yml"]
      volumes:
        - ./otel-collector-config.yml:/etc/otel-collector-config.yml
      network_mode: host # Add this line
      ports:
        - "4317:4317"
        - "55679:55679"
    

Third: Double-Check Your .NET App's OTLP Exporter Config

Your app code looks mostly correct, but let's make the protocol explicit to avoid any ambiguity:

services.AddOpenTelemetryTracing(builder => {
    builder.SetResourceBuilder(
        ResourceBuilder.CreateDefault()
            .AddService(serviceName: serviceName))
        .AddAspNetCoreInstrumentation()
        .AddOtlpExporter(config => {
            config.Endpoint = new Uri("http://localhost:4317"); // Replace with host.docker.internal/container IP if needed
            // Explicitly set gRPC protocol (default for .NET, but good to confirm)
            config.Protocol = OtlpExportProtocol.Grpc;
        });
});

Final Validation Steps

  1. Restart the collector container and check its logs to ensure no config errors:

    docker logs otlp-collector
    

    You should see no error messages, plus lines confirming the trace pipeline started successfully.

  2. Run your .NET app, trigger some requests to generate traces, then tail the collector logs:

    docker logs -f otlp-collector
    

    If everything works, you'll see debug-level logs with your trace details.

The missing exporter config was the main culprit here, and the network tweaks will ensure your local app can reach the containerized collector.

内容的提问来源于stack exchange,提问作者felixhir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 22:07:32