From 8d144372d35a82c3d72d1f67376c431cc8bc9027 Mon Sep 17 00:00:00 2001 From: Alan West <3676547+alanwest@users.noreply.github.com> Date: Thu, 11 Mar 2021 14:28:10 -0800 Subject: [PATCH] Basket.API instrumented with OpenTelemetry --- .../Basket/Basket.API/Basket.API.csproj | 10 ++++ .../Basket/Basket.API/OpenTelemetry.cs | 53 +++++++++++++++++++ src/Services/Basket/Basket.API/Startup.cs | 3 +- src/docker-compose.opentelemetry.console.yml | 4 ++ src/docker-compose.opentelemetry.otlp.yml | 6 +++ 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/Services/Basket/Basket.API/OpenTelemetry.cs diff --git a/src/Services/Basket/Basket.API/Basket.API.csproj b/src/Services/Basket/Basket.API/Basket.API.csproj index 741407c10..8f4f3ce51 100644 --- a/src/Services/Basket/Basket.API/Basket.API.csproj +++ b/src/Services/Basket/Basket.API/Basket.API.csproj @@ -42,6 +42,16 @@ + + + + + + + + + + diff --git a/src/Services/Basket/Basket.API/OpenTelemetry.cs b/src/Services/Basket/Basket.API/OpenTelemetry.cs new file mode 100644 index 000000000..74944607f --- /dev/null +++ b/src/Services/Basket/Basket.API/OpenTelemetry.cs @@ -0,0 +1,53 @@ +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) + { + if (connectionMultiplexer == null) throw new ArgumentException("!!!!conn is null!"); + 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 "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; + default: + tracerProviderBuilder.AddConsoleExporter(); + break; + } + + tracerProviderBuilder.Build(); + } +} diff --git a/src/Services/Basket/Basket.API/Startup.cs b/src/Services/Basket/Basket.API/Startup.cs index 2f53cbcb0..ef6c37e83 100644 --- a/src/Services/Basket/Basket.API/Startup.cs +++ b/src/Services/Basket/Basket.API/Startup.cs @@ -185,8 +185,9 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory, ConnectionMultiplexer connectionMultiplexer) { + OpenTelemetryExtensions.AddOpenTelemetry(connectionMultiplexer); //loggerFactory.AddAzureWebAppDiagnostics(); //loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace); diff --git a/src/docker-compose.opentelemetry.console.yml b/src/docker-compose.opentelemetry.console.yml index 89fa30069..a894d1fef 100644 --- a/src/docker-compose.opentelemetry.console.yml +++ b/src/docker-compose.opentelemetry.console.yml @@ -6,6 +6,10 @@ version: '3.4' # 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 diff --git a/src/docker-compose.opentelemetry.otlp.yml b/src/docker-compose.opentelemetry.otlp.yml index 63e13be7d..f9015ac65 100644 --- a/src/docker-compose.opentelemetry.otlp.yml +++ b/src/docker-compose.opentelemetry.otlp.yml @@ -14,6 +14,12 @@ services: 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