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