using OpenTelemetry.Instrumentation.AspNetCore; using OpenTelemetry.Logs; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; using Microsoft.AspNetCore.Mvc; using System.Globalization; var appBuilder = WebApplication.CreateBuilder(args); // Build a resource configuration action to set service information. Action<ResourceBuilder> configureResource = r => r.AddService( serviceName: appBuilder.Configuration.GetValue("ServiceName", defaultValue: "otel-test")!, serviceVersion: typeof(Program).Assembly.GetName().Version?.ToString() ?? "unknown", serviceInstanceId: Environment.MachineName); // Configure OpenTelemetry tracing & metrics with auto-start using the // AddOpenTelemetry extension from OpenTelemetry.Extensions.Hosting. appBuilder.Services.AddOpenTelemetry() .ConfigureResource(configureResource) .WithTracing(builder => { builder .AddHttpClientInstrumentation() .AddAspNetCoreInstrumentation(); // Use IConfiguration binding for AspNetCore instrumentation options. appBuilder.Services.Configure<AspNetCoreTraceInstrumentationOptions>(appBuilder.Configuration.GetSection("AspNetCoreInstrumentation")); builder.AddOtlpExporter(otlpOptions => { // Use IConfiguration directly for Otlp exporter endpoint option. otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint", defaultValue: "http://localhost:4317")!); }); }) .WithMetrics(builder => { builder .AddHttpClientInstrumentation() .AddAspNetCoreInstrumentation(); builder.AddOtlpExporter(otlpOptions => { // Use IConfiguration directly for Otlp exporter endpoint option. otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint", defaultValue: "http://localhost:4317")!); }); }); // Clear default logging providers used by WebApplication host. appBuilder.Logging.ClearProviders(); // Configure OpenTelemetry Logging. appBuilder.Logging.AddOpenTelemetry(options => { // Note: See appsettings.json Logging:OpenTelemetry section for configuration. var resourceBuilder = ResourceBuilder.CreateDefault(); configureResource(resourceBuilder); options.SetResourceBuilder(resourceBuilder); options.AddOtlpExporter(otlpOptions => { // Use IConfiguration directly for Otlp exporter endpoint option. otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint", defaultValue: "http://localhost:4317")!); }); }); var app = appBuilder.Build(); string HandleRollDice([FromServices] ILogger<Program> logger, string? player) { var result = RollDice(); if (string.IsNullOrEmpty(player)) { logger.LogInformation("Anonymous player is rolling the dice: {result}", result); } else { logger.LogInformation("{player} is rolling the dice: {result}", player, result); } return result.ToString(CultureInfo.InvariantCulture); } int RollDice() { return Random.Shared.Next(1, 7); } app.MapGet("/rolldice/{player?}", HandleRollDice); app.Run();