當一個事件被捕獲併傳送到 Sentry
時,SDK
會將該事件資料與來自當前 scope
的額外資訊合併。SDK
通常會在框架整合中為您自動管理 scope
,您無需考慮它們。但是,您應該知道 scope
是什麼以及如何利用它來獲取優勢。
什麼是 Scope, 什麼是 Hub?
您可以將 hub
視為我們的 SDK
用於將事件
路由到 Sentry
的中心點。當您呼叫 init()
時,會建立一個 hub
,並在其上建立一個 client
和一個空白 scope
。然後該 hub
與當前執行緒相關聯,並將在內部儲存 scope
堆疊。
scope
將儲存應與事件一起傳送的有用資訊。例如context(上下文)
或breadcrumbs(麵包屑)
儲存在 scope
內。當一個 scope
被 push
時,它從父 scope
繼承所有資料,當它 pop
時,所有修改都被還原
。
- https://docs.sentry.io/platforms/javascript/enriching-events/context/
- https://docs.sentry.io/platforms/javascript/enriching-events/breadcrumbs/
預設的 SDK
整合將智慧地 push
和 pop
scope。例如,Web 框架整合
將圍繞您的路由
或控制器
建立和銷燬 scope
。
Scope 和 Hub 的工作原理
當您開始使用 SDK
時,會自動為您建立一個開箱即用的 scope
和 hub
。除非您正在編寫integration(整合)
或想要建立或銷燬 scope
,否則您不太可能直接與 hub
互動。另一方面,scope
更面向使用者。您可以隨時呼叫 configure-scope
來修改儲存在 scope
上的資料。例如,這用於修改上下文。
配置 Scope
使用 scope
時最有用的操作是 configure-scope
函式。它可用於重新配置當前 scope
。
您首先需要像往常一樣匯入 SDK
:
import * as Sentry from "@sentry/browser";
例如,您可以新增自定義 tag
或通知 Sentry
當前已通過身份驗證的使用者。
Sentry.configureScope(function(scope) {
scope.setTag("my-tag", "my value");
scope.setUser({
id: 42,
email: "john.doe@example.com",
});
});
在登出使用者時取消設定,也可以應用此配置:
Sentry.configureScope(scope => scope.setUser(null));
要了解哪些有用資訊可以與 scope
關聯,請參閱上下文文件。
區域性 Scope
我們還支援一次性推送和配置 scope
。這通常稱為 with-scope
或 push-scope
,如果您只想傳送具有一個特定事件
的資料,這也非常有用。 在以下示例中,我們使用該函式將 level
和 tag
附加到僅一個特定錯誤
:
Sentry.withScope(function(scope) {
scope.setTag("my-tag", "my value");
scope.setLevel("warning");
// will be tagged with my-tag="my value"
Sentry.captureException(new Error("my error"));
});
// will not be tagged with my-tag
Sentry.captureException(new Error("my other error"));
雖然這個例子看起來與 configure-scope
很相似,但它有很大的不同,因為 configure-scope
實際上改變了當前的活動 scope
,所有對 configure-scope
的後續呼叫都會保留這些變化。
另一方面,使用 with-scope
會建立當前 scope
的克隆,並將保持隔離
,直到函式呼叫完成。 因此,您可以在其中設定您不
想在其他地方的上下文
資訊,或者通過在 scope
上呼叫 clear
來完全不附加任何上下文資訊,而“global(全域性)”
scope 保持不變。
請記住,with-scope
不會捕獲在其回撥函式中發生的任何異常,並且在那裡發生的每個錯誤都將被靜默忽略而不報告。