* WebMVC instrumented with OpenTelemetry * Basket.API instrumented with OpenTelemetry * Add Zipkin export * Add Jaeger export * Remove line for debugging purposesfeature/open-telemetry
@ -0,0 +1,18 @@ | |||
receivers: | |||
otlp: | |||
protocols: | |||
grpc: | |||
exporters: | |||
logging: | |||
loglevel: debug | |||
processors: | |||
batch: | |||
service: | |||
pipelines: | |||
traces: | |||
receivers: [otlp] | |||
processors: [batch] | |||
exporters: [logging] |
@ -0,0 +1,66 @@ | |||
using Microsoft.Extensions.DependencyInjection; | |||
using OpenTelemetry; | |||
using OpenTelemetry.Resources; | |||
using OpenTelemetry.Trace; | |||
using StackExchange.Redis; | |||
using System; | |||
static class OpenTelemetryExtensions | |||
{ | |||
public static void AddOpenTelemetry(ConnectionMultiplexer connectionMultiplexer) | |||
{ | |||
var exportType = Environment.GetEnvironmentVariable("OTEL_USE_EXPORTER")?.ToLower(); | |||
if (exportType == null) | |||
{ | |||
return; | |||
} | |||
var tracerProviderBuilder = Sdk.CreateTracerProviderBuilder(); | |||
// Configure resource | |||
tracerProviderBuilder | |||
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("Basket.API")); | |||
// Configure instrumentation | |||
tracerProviderBuilder | |||
.AddAspNetCoreInstrumentation() | |||
.AddHttpClientInstrumentation() | |||
.AddRedisInstrumentation(connectionMultiplexer); | |||
// Configure exporter | |||
switch (exportType) | |||
{ | |||
case "jaeger": | |||
tracerProviderBuilder.AddJaegerExporter(options => | |||
{ | |||
var agentHost = Environment.GetEnvironmentVariable("OTEL_EXPORTER_JAEGER_AGENTHOST"); | |||
options.AgentHost = agentHost; | |||
}); | |||
break; | |||
case "otlp": | |||
tracerProviderBuilder.AddOtlpExporter(options => | |||
{ | |||
var endpoint = Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT") | |||
?? Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_ENDPOINT"); | |||
options.Endpoint = new Uri(endpoint); | |||
var headers = Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_TRACES_HEADERS") | |||
?? Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_HEADERS"); | |||
options.Headers = headers; | |||
}); | |||
break; | |||
case "zipkin": | |||
tracerProviderBuilder.AddZipkinExporter(options => | |||
{ | |||
var endpoint = Environment.GetEnvironmentVariable("OTEL_EXPORTER_ZIPKIN_ENDPOINT"); | |||
options.Endpoint = new Uri(endpoint); | |||
}); | |||
break; | |||
default: | |||
tracerProviderBuilder.AddConsoleExporter(); | |||
break; | |||
} | |||
tracerProviderBuilder.Build(); | |||
} | |||
} |
@ -0,0 +1,62 @@ | |||
using Microsoft.Extensions.DependencyInjection; | |||
using OpenTelemetry.Resources; | |||
using OpenTelemetry.Trace; | |||
using System; | |||
static class OpenTelemetryExtensions | |||
{ | |||
public static IServiceCollection AddOpenTelemetry(this IServiceCollection services) | |||
{ | |||
var exportType = Environment.GetEnvironmentVariable("OTEL_USE_EXPORTER")?.ToLower(); | |||
if (exportType == null) | |||
{ | |||
return services; | |||
} | |||
return services.AddOpenTelemetryTracing((serviceProvider, tracerProviderBuilder) => | |||
{ | |||
// Configure resource | |||
tracerProviderBuilder | |||
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("WebMVC")); | |||
// Configure instrumentation | |||
tracerProviderBuilder | |||
.AddAspNetCoreInstrumentation() | |||
.AddHttpClientInstrumentation(); | |||
// Configure exporter | |||
switch (exportType) | |||
{ | |||
case "jaeger": | |||
tracerProviderBuilder.AddJaegerExporter(options => | |||
{ | |||
var agentHost = Environment.GetEnvironmentVariable("OTEL_EXPORTER_JAEGER_AGENTHOST"); | |||
options.AgentHost = agentHost; | |||
}); | |||
break; | |||
case "otlp": | |||
tracerProviderBuilder.AddOtlpExporter(options => | |||
{ | |||
var endpoint = Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT") | |||
?? Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_ENDPOINT"); | |||
options.Endpoint = new Uri(endpoint); | |||
var headers = Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_TRACES_HEADERS") | |||
?? Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_HEADERS"); | |||
options.Headers = headers; | |||
}); | |||
break; | |||
case "zipkin": | |||
tracerProviderBuilder.AddZipkinExporter(options => | |||
{ | |||
var endpoint = Environment.GetEnvironmentVariable("OTEL_EXPORTER_ZIPKIN_ENDPOINT"); | |||
options.Endpoint = new Uri(endpoint); | |||
}); | |||
break; | |||
default: | |||
tracerProviderBuilder.AddConsoleExporter(); | |||
break; | |||
} | |||
}); | |||
} | |||
} |
@ -0,0 +1,15 @@ | |||
version: '3.4' | |||
# The OpenTelemetry docker-compose file is used to configure OpenTelemetry for the services | |||
# | |||
# You need to start it with the following CLI command: | |||
# docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.opentelemetry.console.yml up | |||
services: | |||
basket-api: | |||
environment: | |||
- OTEL_USE_EXPORTER=console | |||
webmvc: | |||
environment: | |||
- OTEL_USE_EXPORTER=console |
@ -0,0 +1,29 @@ | |||
version: '3.4' | |||
# The OpenTelemetry docker-compose file is used to configure OpenTelemetry for the services | |||
# | |||
# You need to start it with the following CLI command: | |||
# docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.opentelemetry.zipkin.yml up | |||
services: | |||
jaeger-all-in-one: | |||
image: jaegertracing/all-in-one:latest | |||
ports: | |||
- "5775:5775/udp" | |||
- "6831:6831/udp" | |||
- "6832:6832/udp" | |||
- "5778:5778" | |||
- "16686:16686" | |||
- "14268:14268" | |||
- "14250:14250" | |||
- "9411:9411" | |||
basket-api: | |||
environment: | |||
- OTEL_USE_EXPORTER=jaeger | |||
- OTEL_EXPORTER_JAEGER_AGENTHOST=${OTEL_EXPORTER_JAEGER_AGENTHOST:-jaeger-all-in-one} | |||
webmvc: | |||
environment: | |||
- OTEL_USE_EXPORTER=jaeger | |||
- OTEL_EXPORTER_JAEGER_AGENTHOST=${OTEL_EXPORTER_JAEGER_AGENTHOST:-jaeger-all-in-one} |
@ -0,0 +1,27 @@ | |||
version: '3.4' | |||
# The OpenTelemetry docker-compose file is used to configure OpenTelemetry for the services | |||
# | |||
# You need to start it with the following CLI command: | |||
# docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.opentelemetry.otlp.yml up | |||
services: | |||
otel-collector: | |||
image: otel/opentelemetry-collector:latest | |||
command: ["--config=/etc/otel-collector-config.yaml"] | |||
volumes: | |||
- ./OpenTelemetry/otel-collector-config.yaml:/etc/otel-collector-config.yaml | |||
ports: | |||
- "4317" # OTLP gRPC receiver | |||
basket-api: | |||
environment: | |||
- OTEL_USE_EXPORTER=otlp | |||
- OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=${OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:-http://otel-collector:4317} | |||
- OTEL_EXPORTER_OTLP_HEADERS=${OTEL_EXPORTER_OTLP_HEADERS} | |||
webmvc: | |||
environment: | |||
- OTEL_USE_EXPORTER=otlp | |||
- OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=${OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:-http://otel-collector:4317} | |||
- OTEL_EXPORTER_OTLP_HEADERS=${OTEL_EXPORTER_OTLP_HEADERS} |
@ -0,0 +1,22 @@ | |||
version: '3.4' | |||
# The OpenTelemetry docker-compose file is used to configure OpenTelemetry for the services | |||
# | |||
# You need to start it with the following CLI command: | |||
# docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.opentelemetry.zipkin.yml up | |||
services: | |||
zipkin: | |||
image: openzipkin/zipkin:latest | |||
ports: | |||
- "9411:9411" | |||
basket-api: | |||
environment: | |||
- OTEL_USE_EXPORTER=zipkin | |||
- OTEL_EXPORTER_ZIPKIN_ENDPOINT=${OTEL_EXPORTER_ZIPKIN_ENDPOINT:-http://zipkin:9411/api/v2/spans} | |||
webmvc: | |||
environment: | |||
- OTEL_USE_EXPORTER=zipkin | |||
- OTEL_EXPORTER_ZIPKIN_ENDPOINT=${OTEL_EXPORTER_ZIPKIN_ENDPOINT:-http://zipkin:9411/api/v2/spans} |