using OpenTelemetry.Resources; using OpenTelemetry.Trace; using Serilog; using Serilog.Events; using Serilog.Sinks.OpenTelemetry; namespace Presentation { public class Program { public static void Main(string[] args) { // Configura Serilog como logger global antes de crear el builder Log.Logger = new LoggerConfiguration() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.OpenTelemetry(options => { options.Endpoint = "http://localhost:4317"; // OTLP endpoint options.Protocol = OtlpProtocol.Grpc; options.ResourceAttributes = new Dictionary { ["service.name"] = "mmorales.photo-backend" }; }) .CreateLogger(); try { Log.Information("Starting up"); var builder = WebApplication.CreateBuilder(args); builder.Host.UseSerilog(); // Usa Serilog como proveedor de logs por defecto builder.Services.AddProblemDetails(options => options.CustomizeProblemDetails = ctx => ctx.ProblemDetails.Extensions.Add("traceId", ctx.HttpContext.TraceIdentifier) ); builder.Services.AddOpenTelemetry() .WithTracing(tracerProviderBuilder => { tracerProviderBuilder .SetResourceBuilder(ResourceBuilder.CreateDefault() .AddService(builder.Environment.ApplicationName)) .AddAspNetCoreInstrumentation() // Traza todas las peticiones HTTP entrantes .AddHttpClientInstrumentation() // Traza las llamadas HttpClient salientes .AddOtlpExporter(opt => { opt.Endpoint = new Uri("http://localhost:4317"); // Dirección del colector OTel }) .AddConsoleExporter(); // Exporta trazas también a consola para desarrollo }); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddOpenApi(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler(); app.UseHsts(); } app.UseStatusCodePages(); app.UseAuthentication(); // Habilita autenticación app.UseAuthorization(); // Habilita autorización // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.MapOpenApi(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); } catch (Exception ex) { Log.Fatal(ex, "Application start-up failed"); throw; } finally { Log.CloseAndFlush(); } } } }