簡介
針對.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;
};