【问题标题】:How to integrate Sentry with .NET 6.0 Worker Service?如何将 Sentry 与 .NET 6.0 Worker Service 集成?
【发布时间】:2023-02-09 02:49:13
【问题描述】:

我将 Sentry 与 .NET Core 6.0 集成工人服务这边走:

核获取:哨兵 3.17.1

// Program.cs:

using Sentry;

var sentryDsn = Environment.GetEnvironmentVariable("SENTRY_DSN");
using (SentrySdk.Init(o =>
{
    o.Dsn = sentryDsn;
    o.Debug = true;
    o.TracesSampleRate = 1.0;
}))
{
    IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddHostedService<Worker>();
    })
    .Build();

    await host.RunAsync();
}
// Worker.cs:

namespace demo_heroku_sentry_worker;
using Sentry;

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);

            try
            {
                throw new ApplicationException("Exception inside of worker service");
            }
            catch (Exception e)
            {
                SentrySdk.CaptureException(e);
            }

            await Task.Delay(10000, stoppingToken);
        }
    }
}

这在某种程度上是有效的,因为我在我的 Sentry 仪表板上看到了手动捕获的错误。但是,我担心我在应用程序输出中收到的这些警告消息:

      Worker running at: 05/11/2022 15:51:06 +02:00
  Debug: Failed to report an error on a session because there is none active.
   Info: Capturing event.
  Debug: Running processor on exception: Exception inside of worker service
  Debug: Creating SentryStackTrace. isCurrentStackTrace: False.
  Debug: Running main event processor on: Event abb5b3e2ee3a4dbd***********
   Info: Envelope queued up: 'abb5b3e2ee3a4dbda50ef***********'
  Debug: Envelope abb5b3e2ee3a4dbda50e*********** handed off to transport. #1 in queue.
  Debug: Envelope 'abb5b3e2ee3a4dbda50efe7***********' sent successfully. Payload:

有什么我想念的吗?

【问题讨论】:

    标签: c# .net-6.0 sentry worker-service


    【解决方案1】:

    一些东西:

    • 您最初实施它的方式没有任何问题。您显示的调试日志只是 Sentry 正常工作。如果不想看到就不要设置o.Debug = true;

    • 您有代码手动读取 SENTRY_DSN 环境变量并在初始化期间将其设置为 o.Dsn。这是多余的,因为 SDK 会已经如果您不在代码中传递 DSN,请查找该环境变量。做一个或另一个,但不能同时做。

    • 如果您担心消息 "Failed to report an error on a session because there is none active." - 这只是说您还没有开始会话,所以 Sentry 的“Release Health”功能将不起作用。您可以通过在应用程序的适当位置手动调用 SentrySdk.StartSession();SentrySdk.EndSession(); 或通过设置 o.AutoSessionTracking = true; 来启用它,这更容易。后者会在Sentry SDK初始化的时候开启一个session,在释放的时候结束。

    • 虽然您展示的方法没有问题,但您可以从 logging integration 获得更好的功能。示例代码here 展示了如何将它与通用主机一起使用。使用 nuget 包Sentry.Extensions.Logging

    把它们放在一起:

    IHost host = Host.CreateDefaultBuilder(args)
        .ConfigureServices(services =>
        {
            services.AddHostedService<Worker>();
        })
        .ConfigureLogging(logging =>
        {
            logging.AddSentry(o =>
            {
                // o.Dsn = "(only if not using the env var)"; 
                o.TracesSampleRate = 1.0;
                o.AutoSessionTracking = true;
            });
        }
        .Build();
    
    await host.RunAsync();
    

    【讨论】:

      【解决方案2】:

      似乎根据 documentation,将 Sentry 与 .NET (Core) 6.0 集成的正确方法如下:(更改指示 &lt;--

      // Program.cs
      
      var builder = WebApplication.CreateBuilder(args);
      
      var sentryDsn = Environment.GetEnvironmentVariable("SENTRY_DSN");  // <--
      builder.WebHost.UseSentry(sentryDsn);                              // <--
      
      // 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();
      
      app.UseSentryTracing();                                            // <--
      
      // Configure the HTTP request pipeline.
      if (app.Environment.IsDevelopment())
      {
          app.UseSwagger();
          app.UseSwaggerUI();
      }
      
      app.UseHttpsRedirection();
      
      app.UseAuthorization();
      
      app.MapControllers();
      
      app.Run();
      
      

      它会捕获未处理的 API 调用错误,并且不会在输出控制台上打印任何警告。

      【讨论】:

      • 不相关的答案,工作人员没有 WebHost
      猜你喜欢
      • 2019-01-17
      • 2020-08-29
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2019-04-09
      • 1970-01-01
      • 2020-03-25
      相关资源
      最近更新 更多