.net core 集成 sentry 進行異常報警

  • 2020 年 4 月 11 日
  • 筆記

.net core 集成 sentry 進行異常報警

Intro

Sentry 是一個實時事件日誌記錄和彙集的平台。其專註於錯誤監控以及提取一切事後處理所需信息而不依賴於麻煩的用戶反饋。它分為客戶端和服務端,客戶端(目前客戶端有 C#, Python, PHP, JavaScript, Ruby等多種語言)就嵌入在你的應用程序中間,程序出現異常就向服務端發送消息,服務端將消息記錄到數據庫中並提供一個web頁方便查看。

Sentry 是 Python 寫的一個開源的項目 https://github.com/getsentry/sentry 而且可以滿足私有部署的需求

官方介紹:

Sentry is cross-platform application monitoring, with a focus on error reporting.

Sentry fundamentally is a service that helps you monitor and fix crashes in realtime. The server is in Python, but it contains a full API for sending events from any language, in any application

使用效果

sentry 里每一個錯誤/異常被視為一個 issue,在 sentry 的後台可以看到對應項目的錯誤信息,並且會受到 sentry 的郵件推送

sentry-issues

sentry-issue-detail

dotnetcore 集成

針對 asp.net core 的集成,分為兩種方式,sentry 提供了一個底層一點的基於 Microsoft.Extensions.Logging 的集成方式(Sentry.Extensions.Logging)和基於 asp.net core 框架的集成方式(Sentry.AspNetCore),我目前在用基於 logging 方式的集成方式(基於 asp.net core 的集成是後來才有的,後面也沒有再修改),如果要集成 asp.net core 項目可以直接使用 Sentry.AspNetCore

我目前用的是 Sentry.Extensions.Logging 基本配置如下:

loggerFactory      .AddSentry(options =>          {              options.Dsn = Configuration.GetAppSetting("SentryClientKey");          });  

Dsn 是創建項目之後在項目的配置里可以看得到

More Config

loggerFactory      .AddSerilog()      .AddSentry(options =>      {          options.Dsn = Configuration.GetAppSetting("SentryClientKey");          options.Environment = env.EnvironmentName; // 設置環境          options.MinimumEventLevel = LogLevel.Error; // 設置 sentry event 級別      });  

修改 sentry event 信息,對於發生的錯誤異常可以在發送到 sentry 服務器端之前做修改,對於要忽略的異常也可以在這個事件中做,比如系統中的 TaskCanceledException ,我在使用異步查詢方法的時候會傳遞一個 CancellationToken ,客戶端中斷了請求就會導致這個 Token 的 Cancel 事件被觸發,EF 就會報一個 TaskCanceledException 前段時間,sentry 經常會給我發一些異常郵件,全都是 TaskCanceledException,我們可以在這個事件里判斷如果異常時 TaskCanceledException 就返回一個 null, 這樣這個異常就不會被提交到 sentry 服務器端了

options.BeforeSend = (sentryEvent) =>  {      // ignore TaskCanceledException/OperationCanceledException      if (sentryEvent.Exception is TaskCanceledException ||          sentryEvent.Exception is OperationCanceledException)      {          return null;      }        return sentryEvent;  };  

More

除了基本的異常信息的展示和推送,sentry 還會做異常信息的聚合,相同的異常信息只會展示為一個,還可以做 issue 的分髮指派,還可以和 Github、Gitlab 等第三方服務集成,在 Github 中創建 issue 等,更多用法等待着你去發現

Reference