什么是 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
不会捕获在其回调函数中发生的任何异常,并且在那里发生的每个错误都将被静默忽略而不报告。