【.NET Core】Sentry-異常監控


簡介

針對.NET Core的兩種集成方式

基於 Microsoft.Extensions.Logging 的集成方式:Sentry.Extensions.Logging
基於 asp.net core 框架的集成方式:Sentry.AspNetCore

源碼:https://github.com/getsentry/sentry-dotnet
官方文檔:https://docs.sentry.io/platforms/dotnet/guides/aspnetcore/

使用

1、安裝nuget:

Sentry.AspNetCore

2、UseSentry

hostBuilder.ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseSentry((options) =>
        {
            options.Dsn = "xxxxxxxxxx";
        });
        webBuilder.UseStartup<Startup>();
    });

可以通過UseSentry添加配置,也可以通過配置文件添加配置,如下:

{
  "Logging": {},
  "Sentry": {
    "Dsn": "xxxxxx"
  }
}

配置

  • Dsn
    DSN告訴 SDK 將事件發送到哪里。如果未提供此值,SDK 將嘗試從SENTRY_DSN環境變量中讀取它。如果該變量也不存在,SDK 將不會發送任何事件。
  • MaxBreadcrumbs
    此變量控制應捕獲的面包屑的總量。這默認為100.
  • AttachStacktrace
    啟用后,堆棧跟蹤會自動附加到所有記錄的消息。堆棧跟蹤總是附加到異常上;但是,當設置此選項時,堆棧跟蹤也會隨消息一起發送。
    對於有堆棧跟蹤和沒有堆棧跟蹤的事件,Sentry 中的分組是不同的。因此,當您為某些事件啟用或禁用此標志時,您將獲得新組。
  • Environment
    設置環境,默認取環境變量ASPNETCORE_ENVIRONMENT
  • Debug
    打開或關閉調試模式。如果啟用調試,如果發送事件出現問題,SDK 將嘗試打印有用的調試信息。默認值為始終false。通常不建議在生產中打開它,盡管打開debug模式不會引起任何安全問題。
  • BeforeSend鈎子
    發生的錯誤異常可以在發送到 sentry 服務器端之前做修改,對於要忽略的異常也可以在這個事件中做
options.BeforeSend = (sentryEvent) =>
{
    // ignore TaskCanceledException/OperationCanceledException
    if (sentryEvent.Exception is TaskCanceledException ||
        sentryEvent.Exception is OperationCanceledException)
    {
        return null;
    }

    return sentryEvent;
};
  • BeforeBreadcrumb鈎子
options.BeforeBreadcrumb = breadcrumb
    // 將類型是“Spammy.Logger”的面包屑丟棄
    => breadcrumb.Category == "Spammy.Logger"
        ? null
        : breadcrumb;
  • MaxBreadcrumbs
    應捕獲的面包屑的最大數。這默認為100.
  • MaxRequestBodySize
    是否應捕獲 HTTP 請求正文。
    • never:從不發送請求正文。
    • small:只會捕獲小的請求主體。small 的截止值取決於 SDK(通常為 4KB)。
    • medium:會捕獲中小請求(一般為10KB)。
    • always:只要 Sentry 可以理解,SDK 將始終捕獲請求正文。
      掛鈎
  • SampleRate
    采樣率,范圍為0.0至1.0。默認值1.0表示發送 100% 的錯誤事件。如果設置為0.1僅發送 10% 的錯誤事件。事件是隨機挑選的。
  • StackTraceMode
    • Original(原始 )- 默認 .NET 堆棧跟蹤格式。
    • Enhanced(增強 )- 包括async、返回類型、參數等。
  • DiagnosticLevel
  • Release
  • SendDefaultPii
  • MaxCacheItems

issue(問題)

sentry 里每一個錯誤/異常被視為一個 issue,在 sentry 的后台可以看到對應項目的錯誤信息
事件是向 Sentry 發送數據的一個實例。通常,此數據是錯誤或異常。問題是一組類似事件。

tags(標簽)

標簽可用於索引、搜索事件
有些標簽是由 Sentry 自動設置的。我們強烈建議不要覆蓋這些標簽。標簽的常見用途包括主機名、平台版本和用戶語言。

當前范圍定義標簽:
范圍內的所有未來事件都包含相同的標簽。

SentrySdk.ConfigureScope(scope =>
{
    scope.SetTag("page.locale", "de-at");
});

定義默認標簽:
所有范圍都顯示

webBuilder.UseSentry(config =>{
    config.DefaultTags.Add("aa", CONST.A);
    config.DefaultTags.Add("bb", CONST.B);});

breadcrumbs(面包屑)

Sentry 使用面包屑創建在問題之前發生的事件跟蹤。可記錄更豐富的數據。
面包屑與事件不同:它們不會在 Sentry 中創建事件,而是會被緩存直到發送下一個事件。

手動添加面包屑

SentrySdk.AddBreadcrumb(
    message: "Authenticated user " + user.Email,
    category: "auth",
    level: BreadcrumbLevel.Info);

自動面包屑

SDK 及其相關集成將自動記錄多種類型的面包屑。比如:記錄的日志也會添加到面包屑中

自定義面包屑

SDK 允許您通過BeforeBreadcrumb鈎子自定義面包屑。該函數可以修改面包屑或決定通過返回完全丟棄它null:
這個鈎子傳遞了一個已經組裝好的面包屑。

options.BeforeBreadcrumb = breadcrumb
    // 將類型是“Spammy.Logger”的面包屑丟棄
    => breadcrumb.Category == "Spammy.Logger"
        ? null
        : breadcrumb;

Identify User(識別用戶)

將登錄用戶信息綁定到Scope

SentrySdk.ConfigureScope(scope =>
{
    scope.User = new User
    {
        Email = "john.doe@example.com"
    };
});

添加上下文

自定義上下文允許您將任意數據附加到事件。通常,此上下文在其生命周期中捕獲的任何問題之間共享。您無法搜索這些,但可以在問題頁面上查看它們
上下文名稱沒有限制。在上下文對象中,除了在type內部使用的 之外,所有鍵都是允許的。

SentrySdk.ConfigureScope(scope =>
{
    scope.Contexts["character111111"] = new
    {
        Name = "Mighty Fighter",
        Age = 19,
        AttackType = "melee"
    };
});

添加用戶

SentrySdk.ConfigureScope(scope =>
{
    scope.User = new User
    {
        Id = "1",
        Username = "fan",
        Email = "410577910@qq.com"
    };
});

User Feedback(用戶反饋)?

var eventId = SentrySdk.CaptureMessage("An event that will receive user feedback.");
SentrySdk.CaptureUserFeedback(eventId, "user@example.com", "It broke.", "The User");

手動發送消息

SentrySdk.CaptureMessage("Something went wrong");

手動發送異常

如果你捕獲了異常,將不會向Sentry發送事件,可以手動發送:

try
{
    AFunctionThatMightFail();
}
catch (Exception err)
{
    SentrySdk.CaptureException(err);
}

指紋識別

所有事件都有指紋。具有相同指紋的事件被組合成一個問題。默認情況下,Sentry 將運行我們的一種內置分組算法,以根據事件中可用的信息(例如stacktrace、exception和)生成指紋

options.BeforeSend = @event =>
{
    if (@event.Exception is SqlConnectionException ex)
    {
        @event.SetFingerprint(new [] { "database-connection-error" });
    }

    return @event;
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM