Sentry 開(kāi)發(fā)者貢獻(xiàn)指南 - 什么是 Scope, 什么是 Hub?
當(dāng)一個(gè)事件被捕獲并發(fā)送到 Sentry 時(shí),SDK 會(huì)將該事件數(shù)據(jù)與來(lái)自當(dāng)前 scope 的額外信息合并。SDK 通常會(huì)在框架集成中為您自動(dòng)管理 scope,您無(wú)需考慮它們。但是,您應(yīng)該知道 scope 是什么以及如何利用它來(lái)獲取優(yōu)勢(shì)。
什么是 Scope, 什么是 Hub?
您可以將 hub 視為我們的 SDK 用于將事件路由到 Sentry 的中心點(diǎn)。當(dāng)您調(diào)用 init() 時(shí),會(huì)創(chuàng)建一個(gè) hub,并在其上創(chuàng)建一個(gè) client 和一個(gè)空白 scope。然后該 hub 與當(dāng)前線程相關(guān)聯(lián),并將在內(nèi)部保存 scope 堆棧。
scope 將保存應(yīng)與事件一起發(fā)送的有用信息。例如context(上下文)或breadcrumbs(面包屑)存儲(chǔ)在 scope 內(nèi)。當(dāng)一個(gè) scope 被 push 時(shí),它從父 scope 繼承所有數(shù)據(jù),當(dāng)它 pop 時(shí),所有修改都被還原。
https://docs.sentry.io/platforms/javascript/enriching-events/context/
https://docs.sentry.io/platforms/javascript/enriching-events/breadcrumbs/
默認(rèn)的 SDK 集成將智能地 push 和 pop scope。例如,Web 框架集成將圍繞您的路由或控制器創(chuàng)建和銷毀 scope。
Scope 和 Hub 的工作原理
當(dāng)您開(kāi)始使用 SDK 時(shí),會(huì)自動(dòng)為您創(chuàng)建一個(gè)開(kāi)箱即用的 scope 和 hub。除非您正在編寫(xiě)integration(集成)或想要?jiǎng)?chuàng)建或銷毀 scope,否則您不太可能直接與 hub 交互。另一方面,scope 更面向用戶。您可以隨時(shí)調(diào)用 configure-scope 來(lái)修改存儲(chǔ)在 scope 上的數(shù)據(jù)。例如,這用于修改上下文。
https://docs.sentry.io/platforms/javascript/enriching-events/context/
配置 Scope
使用 scope 時(shí)最有用的操作是 configure-scope 函數(shù)。它可用于重新配置當(dāng)前 scope。
您首先需要像往常一樣導(dǎo)入 SDK:
import * as Sentry from "@sentry/browser";
例如,您可以添加自定義 tag 或通知 Sentry 當(dāng)前已通過(guò)身份驗(yàn)證的用戶。
Sentry.configureScope(function(scope) {
scope.setTag("my-tag", "my value");
scope.setUser({
id: 42,
email: "john.doe@example.com",
});
});
在注銷用戶時(shí)取消設(shè)置,也可以應(yīng)用此配置:
Sentry.configureScope(scope => scope.setUser(null));
要了解哪些有用信息可以與 scope 關(guān)聯(lián),請(qǐng)參閱上下文文檔。
https://docs.sentry.io/platforms/javascript/enriching-events/context/
局部 Scope
我們還支持一次性推送和配置 scope。這通常稱為 with-scope 或 push-scope,如果您只想發(fā)送具有一個(gè)特定事件的數(shù)據(jù),這也非常有用。在以下示例中,我們使用該函數(shù)將 level 和 tag 附加到僅一個(gè)特定錯(cuò)誤:
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"));
雖然這個(gè)例子看起來(lái)與 configure-scope 很相似,但它有很大的不同,因?yàn)?configure-scope 實(shí)際上改變了當(dāng)前的活動(dòng) scope,所有對(duì) configure-scope 的后續(xù)調(diào)用都會(huì)保留這些變化。
另一方面,使用 with-scope 會(huì)創(chuàng)建當(dāng)前 scope 的克隆,并將保持隔離,直到函數(shù)調(diào)用完成。因此,您可以在其中設(shè)置您不想在其他地方的上下文信息,或者通過(guò)在 scope 上調(diào)用 clear 來(lái)完全不附加任何上下文信息,而“global(全局)” scope 保持不變。
請(qǐng)記住,with-scope 不會(huì)捕獲在其回調(diào)函數(shù)中發(fā)生的任何異常,并且在那里發(fā)生的每個(gè)錯(cuò)誤都將被靜默忽略而不報(bào)告。