// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // using System.Reflection; using OpenTelemetry.Exporter; using OpenTelemetry.Instrumentation.AspNetCore; using OpenTelemetry.Logs; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; var builder = WebApplication.CreateBuilder(args); // OpenTelemetry var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "unknown"; // Switch between Zipkin/Jaeger/OTLP/Console by setting UseTracingExporter in appsettings.json. var tracingExporter = builder.Configuration.GetValue("UseTracingExporter").ToLowerInvariant(); var serviceName = tracingExporter switch { "jaeger" => builder.Configuration.GetValue("Jaeger:ServiceName"), "zipkin" => builder.Configuration.GetValue("Zipkin:ServiceName"), "otlp" => builder.Configuration.GetValue("Otlp:ServiceName"), _ => "AspNetCoreExampleService", }; Action configureResource = r => r.AddService( serviceName, serviceVersion: assemblyVersion, serviceInstanceId: Environment.MachineName); // Traces builder.Services.AddOpenTelemetryTracing(options => { options .ConfigureResource(configureResource) .SetSampler(new AlwaysOnSampler()) .AddHttpClientInstrumentation() .AddAspNetCoreInstrumentation(); switch (tracingExporter) { case "jaeger": options.AddJaegerExporter(); builder.Services.Configure(builder.Configuration.GetSection("Jaeger")); // Customize the HttpClient that will be used when JaegerExporter is configured for HTTP transport. builder.Services.AddHttpClient("JaegerExporter", configureClient: (client) => client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value")); break; case "zipkin": options.AddZipkinExporter(); builder.Services.Configure(builder.Configuration.GetSection("Zipkin")); break; case "otlp": options.AddOtlpExporter(otlpOptions => { otlpOptions.Endpoint = new Uri(builder.Configuration.GetValue("Otlp:Endpoint")); }); break; default: options.AddConsoleExporter(); break; } }); // For options which can be bound from IConfiguration. builder.Services.Configure(builder.Configuration.GetSection("AspNetCoreInstrumentation")); // Logging builder.Logging.ClearProviders(); builder.Logging.AddOpenTelemetry(options => { options.ConfigureResource(configureResource); // Switch between Console/OTLP by setting UseLogExporter in appsettings.json. var logExporter = builder.Configuration.GetValue("UseLogExporter").ToLowerInvariant(); switch (logExporter) { case "otlp": options.AddOtlpExporter(otlpOptions => { otlpOptions.Endpoint = new Uri(builder.Configuration.GetValue("Otlp:Endpoint")); }); break; default: options.AddConsoleExporter(); break; } }); builder.Services.Configure(opt => { opt.IncludeScopes = true; opt.ParseStateValues = true; opt.IncludeFormattedMessage = true; }); // Metrics // Switch between Prometheus/OTLP/Console by setting UseMetricsExporter in appsettings.json. var metricsExporter = builder.Configuration.GetValue("UseMetricsExporter").ToLowerInvariant(); builder.Services.AddOpenTelemetryMetrics(options => { options.ConfigureResource(configureResource) .AddRuntimeInstrumentation() .AddHttpClientInstrumentation() .AddAspNetCoreInstrumentation(); switch (metricsExporter) { case "prometheus": options.AddPrometheusExporter(); break; case "otlp": options.AddOtlpExporter(otlpOptions => { otlpOptions.Endpoint = new Uri(builder.Configuration.GetValue("Otlp:Endpoint")); }); break; default: options.AddConsoleExporter(); break; } }); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); if (metricsExporter.Equals("prometheus", StringComparison.OrdinalIgnoreCase)) { app.UseOpenTelemetryPrometheusScrapingEndpoint(); } app.Run();