WebMVC instrumented with OpenTelemetry

This commit is contained in:
Alan West 2021-03-10 20:35:34 -08:00
parent 873cdf8cef
commit 1a3c60b34b
No known key found for this signature in database
GPG Key ID: 10C64B6E349D00BC
6 changed files with 108 additions and 0 deletions

View File

@ -0,0 +1,18 @@
receivers:
otlp:
protocols:
grpc:
exporters:
logging:
loglevel: debug
processors:
batch:
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [logging]

View File

@ -0,0 +1,48 @@
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 "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;
}
});
}
}

View File

@ -36,6 +36,7 @@ namespace Microsoft.eShopOnContainers.WebMVC
services.AddControllersWithViews()
.Services
.AddAppInsight(Configuration)
.AddOpenTelemetry()
.AddHealthChecks(Configuration)
.AddCustomMvc(Configuration)
.AddDevspaces()

View File

@ -44,6 +44,15 @@
<PackageReference Include="Serilog.Sinks.Seq" Version="4.1.0-dev-00166" />
</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" />
</ItemGroup>
<ItemGroup>
<None Include="ViewModels\CampaignItem.cs" />
</ItemGroup>

View File

@ -0,0 +1,11 @@
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:
webmvc:
environment:
- OTEL_USE_EXPORTER=console

View File

@ -0,0 +1,21 @@
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
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}