Basket.API instrumented with OpenTelemetry

This commit is contained in:
Alan West 2021-03-11 14:28:10 -08:00
parent 1a3c60b34b
commit 8d144372d3
No known key found for this signature in database
GPG Key ID: 10C64B6E349D00BC
5 changed files with 75 additions and 1 deletions

View File

@ -42,6 +42,16 @@
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="OpenTelemetry" Version="1.0.1" />
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.0.1" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.0.1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.0.0-rc2" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc2" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc2" />
<PackageReference Include="OpenTelemetry.Instrumentation.StackExchangeRedis" Version="1.0.0-rc2" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="Proto\basket.proto" GrpcServices="Server" Generator="MSBuild:Compile" />
<Content Include="@(Protobuf)" />

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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

View File

@ -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