using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Resources; using OpenTelemetry.Trace; using System.Reflection; namespace MyNewProjectName.Infrastructure.Extensions; /// /// Extension methods for configuring OpenTelemetry /// public static class OpenTelemetryExtensions { /// /// Add OpenTelemetry distributed tracing /// public static IServiceCollection AddOpenTelemetryTracing( this IServiceCollection services, string serviceName = "MyNewProjectName") { services.AddOpenTelemetry() .WithTracing(builder => { builder .SetResourceBuilder(ResourceBuilder .CreateDefault() .AddService(serviceName) .AddAttributes(new Dictionary { ["service.version"] = Assembly.GetExecutingAssembly() .GetCustomAttribute()? .InformationalVersion ?? "1.0.0" })) .AddAspNetCoreInstrumentation(options => { // Capture HTTP request/response details options.RecordException = true; options.EnrichWithHttpRequest = (activity, request) => { activity.SetTag("http.request.method", request.Method); activity.SetTag("http.request.path", request.Path); activity.SetTag("http.request.query_string", request.QueryString); }; options.EnrichWithHttpResponse = (activity, response) => { activity.SetTag("http.response.status_code", response.StatusCode); }; }) .AddHttpClientInstrumentation(options => { options.RecordException = true; options.EnrichWithHttpRequestMessage = (activity, request) => { activity.SetTag("http.client.request.method", request.Method?.ToString()); activity.SetTag("http.client.request.uri", request.RequestUri?.ToString()); }; }) .AddEntityFrameworkCoreInstrumentation(options => { options.SetDbStatementForText = true; options.EnrichWithIDbCommand = (activity, command) => { activity.SetTag("db.command.text", command.CommandText); }; }) .AddSource(serviceName) // Export to console (for development) .AddConsoleExporter() // Export to OTLP (for production - requires OTLP collector) .AddOtlpExporter(options => { // Configure OTLP endpoint if needed // options.Endpoint = new Uri("http://localhost:4317"); }); }); return services; } }