Docker OpenTelemetry Collector contrib instrumentation issue with .NET

110 Views Asked by At

I am trying to setup OpenTelemetry Tracing with exports traces to Jaeger and Datadog Here is extracted example that I used. All containers is running and no errors in console.

For jaeger url directly it is working and I see my traces but when I trying to change URL to otel-collector it is not sending traces. I don't see it on otel-collector container logs and in my jaeger

My docker-compose.yml

services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.95.0
    ports:
      - 1888:1888 # pprof extension
      - 8888:8888 # Prometheus metrics exposed by the Collector
      - 8889:8889 # Prometheus exporter metrics
      - 13133:13133 # health_check extension
      - 4317:4317 # OTLP gRPC receiver
      - 4318:4318 # OTLP http receiver
      - 55679:55679 # zpages extension
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    environment:
      DD_SITE: <url>
      DD_API_KEY: <key>
        
  jaeger:
    container_name: jaeger
    ports:
      - 16686:16686
      - 43017:4317
    image: jaegertracing/opentelemetry-all-in-one
    environment:
      COLLECTOR_ZIPKIN_HOST_PORT: 9411
      COLLECTOR_OTLP_ENABLED: true
      
  my-api:
    image: myapi
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:80
      - 8081:443
    depends_on:
      - jaeger
    environment:
      OtelUrl: http://jaeger:4317
      ASPNETCORE_ENVIRONMENT: Production
      DD_LOGS_INJECTION: true
      DD_SERVICE: MyAPI

My otel-collector-config.yaml

receivers:
  otlp:
    protocols:
      http:
        endpoint: "localhost:4318"
      grpc:
        endpoint: "localhost:4317"

processors:

exporters:
  otlp/jaeger: # Jaeger supports OTLP directly. The default port for OTLP/gRPC is 4317
    endpoint: http://jaeger:4317
    tls:
      insecure: true
  datadog:
    api:
      site: ${env:DD_SITE}
      key: ${env:DD_API_KEY}
    traces:
      trace_buffer: 500

service:
  pipelines:
    metrics:
      receivers: [otlp]
      processors: []
      exporters: [datadog]
    traces:
      receivers: [otlp]
      processors: []
      exporters: [datadog, otlp/jaeger]
    logs:
      receivers: [otlp]
      processors: []
      exporters: [datadog]

Program.cs setup

services.AddOpenTelemetry()
                .ConfigureResource(resource => resource.AddService(AppTracing.TelemetryServiceName))
                .WithTracing(tracing => tracing
                    .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(AppTracing.TelemetryServiceName))
                    .AddSource(AppTracing.SourceName)
                    .AddAspNetCoreInstrumentation()
                    .AddHttpClientInstrumentation()
                    .SetSampler(new AlwaysOnSampler())
                    .AddOtlpExporter(otlp =>
                    {
                        otlp.Endpoint = otlpEndpoint;
                    })
                    //.AddConsoleExporter()
                );

My controller action that I use for test

[HttpPost("test-datadog")]
        public void SendBatchTraces()
        {
            var session = Random.Shared.Next(0, 100);
            foreach (var index in Enumerable.Range(0, 1000))
            {
                using var activity = AppTracing.Source.StartActivity($"Sending trace number: {index}");
                activity?.SetTag("Session", session);
            }
        }

I want to send it to collector and then distribute it to jaeger and datadog.

Maybe I can somehow see detailed log for collector or for my .NET app to check any connection issues? For now in console of each app there is no any errors.

Thank you very much for any suggestion!

0

There are 0 best solutions below