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!