1. 程式人生 > >.net core 整合 sentry 進行異常報警

.net core 整合 sentry 進行異常報警

.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 的郵件推送

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

  • https://github.com/getsentry/sentry
  • https://docs.sentry.io/platforms/dotnet/microsoft-extensions-logging/
  • https://docs.sentry.io/platforms/dotnet/aspnetcore/