* 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} |