< Summary

Information
Class: Program
Assembly: PaymentService
File(s): /home/runner/work/MicroservicesApp/MicroservicesApp/PaymentService/Program.cs
Tag: 23_15739319309
Line coverage
0%
Covered lines: 0
Uncovered lines: 75
Coverable lines: 75
Total lines: 109
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
<Main>$(...)100%10%

File(s)

/home/runner/work/MicroservicesApp/MicroservicesApp/PaymentService/Program.cs

#LineLine coverage
 1// PaymentService/Program.cs (ajustado com TraceId, Serilog, OpenTelemetry compatível)
 2using MassTransit;
 3using Microsoft.EntityFrameworkCore;
 4using PaymentService;
 5using Polly;
 6using Serilog;
 7using Contracts.Observability;
 8using OpenTelemetry;
 9using OpenTelemetry.Context.Propagation;
 10using OpenTelemetry.Exporter;
 11using OpenTelemetry.Resources;
 12using OpenTelemetry.Trace;
 13using System.Diagnostics;
 14
 015var builder = Host.CreateApplicationBuilder(args);
 16
 17// Inicializa Serilog com TraceId/SpanId
 018Log.Logger = new LoggerConfiguration()
 019    .MinimumLevel.Debug()
 020    .Enrich.FromLogContext()
 021    .Enrich.With<ActivityEnricher>()
 022    .WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} TraceId={TraceId} SpanId={SpanId}{N
 023    .CreateLogger();
 24
 025builder.Logging.ClearProviders();
 026builder.Logging.AddSerilog();
 27
 28// Configuração do OpenTelemetry com propagação e exportação para Jaeger (versão compatível)
 029Sdk.SetDefaultTextMapPropagator(new TraceContextPropagator());
 30
 031builder.Services.AddOpenTelemetry()
 032    .WithTracing(builder =>
 033    {
 034        builder
 035            .AddAspNetCoreInstrumentation()
 036            .AddHttpClientInstrumentation()
 037            .AddSource("PaymentService")
 038            .AddSource("MassTransit")
 039            .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("PaymentService"))
 040           .AddOtlpExporter(o =>
 041            {
 042                o.Endpoint = new Uri("http://jaeger:4317"); // Jaeger OTLP endpoint
 043                o.Protocol = OtlpExportProtocol.Grpc;
 044            });
 045    });
 46
 047builder.Services.AddDbContext<PaymentDbContext>((provider, options) =>
 048{
 049    var configuration = provider.GetRequiredService<IConfiguration>();
 050    options.UseNpgsql(configuration.GetConnectionString("DefaultConnection"));
 051});
 52
 53
 054builder.Services.AddMassTransit(x =>
 055{
 056    x.AddConsumer<OrderConsumer>();
 057
 058    x.UsingRabbitMq((ctx, cfg) =>
 059    {
 060        cfg.Host("rabbitmq", "/", h =>
 061        {
 062            h.Username("guest");
 063            h.Password("guest");
 064        });
 065
 066        cfg.ReceiveEndpoint("payment-service-queue", e =>
 067        {
 068            e.ConfigureConsumer<OrderConsumer>(ctx);
 069        });
 070    });
 071});
 72
 073builder.Services.AddHostedService<Worker>();
 074builder.Services.AddScoped<OrderConsumer>();
 75
 076var app = builder.Build();
 77
 78// Retry com Polly para garantir que o banco esteja pronto
 079var retryPolicy = Policy
 080    .Handle<Exception>()
 081    .WaitAndRetry(
 082        retryCount: 5,
 083        sleepDurationProvider: attempt => TimeSpan.FromSeconds(5),
 084        onRetry: (exception, time, retryCount, context) =>
 085        {
 086            Log.Warning("[Polly] Tentativa {RetryCount}: aguardando {Seconds}s - erro: {Message}",
 087                retryCount, time.TotalSeconds, exception.Message);
 088        });
 89
 090retryPolicy.Execute(() =>
 091{
 092    using var scope = app.Services.CreateScope();
 093    var db = scope.ServiceProvider.GetRequiredService<PaymentDbContext>();
 094    db.Database.Migrate();
 095});
 96
 97try
 98{
 099    Log.Information("🚀 PaymentService iniciado");
 0100    app.Run();
 0101}
 0102catch (Exception ex)
 103{
 0104    Log.Fatal(ex, "A aplicação terminou inesperadamente");
 0105}
 106finally
 107{
 0108    Log.CloseAndFlush();
 0109}

Methods/Properties

<Main>$(System.String[])