获取更多动态,关注公众号:黑客下午茶

Scopes and Hubs

捕获事件并将其发送到 Sentry 后,SDK 会将事件数据与当前作用域(scope)中的额外信息合并。SDK 通常会在框架集成中为您自动管理 scopes,而您无需考虑它们。但是,您应该知道什么是 scope 以及如何利用它来发挥自己的优势。

What's a Scope, what's a Hub

您可以将 hub 视为我们的 SDK 用于将事件路由到 Sentry 的中心点。调用 init() 时,将创建一个 hub,并在其上创建一个 client 和一个 blank scope。然后,该 hub 与当前线程相关联,并将在内部保存一堆 scopes。

scope 将包含应与事件一起发送的有用信息。例如,contextsbreadcrumbs 存储在 scope 上。当推入作用域时,它将继承父作用域的所有数据,并且当其弹出时,所有修改都将还原。

默认的 SDK 集成将智能地推送和弹出作用域。例如,Web 框架集成将在您的路由(routes)或控制器(controllers)周围创建和销毁作用域。

How do the Scope and Hub Work

当您开始使用 SDK 时,将自动为您创建一个 scope 和 hub。hub 不太可能直接与之交互,除非您正在编写集成或希望创建或销毁作用域。另一方面,作用域更多地面向用户。您可以随时调用 configure-scope 修改存储在 scope 上的数据。例如,这用于 modify the context

当您在内部调用诸如 capture_event 之类的全局函数时,Sentry 会发现当前的 hub 并要求其捕获事件。然后,hub 将在内部将事件与最高 scope 的数据合并。

Configuring the Scope

使用范围时,最有用的操作是 configure-scope 函数。它可用于重新配置当前 scope。例如,这可用于添加自定义标签或向 sentry 告知当前已通过身份验证的用户。

Copied
Sentry.configureScope(function(scope) {
  scope.setTag("my-tag", "my value");
  scope.setUser({
    id: 42,
    email: "john.doe@example.com",
  });
});

这也可以在注销时取消用户设置时应用:

Copied
Sentry.configureScope(scope => scope.setUser(null));

要了解可以将哪些有用的信息与范围相关联,请参阅 the context documentation

Local Scopes

我们还支持一键式推送和配置 scope。通常将其称为 with-scopepush-scope,如果您只想发送一个特定事件的数据,这也非常有用。在下面的示例中,我们使用该函数将 leveltag 附加到仅一个特定错误:

Copied
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 实际上会更改当前的 active scope,所有对 configure-scope 的后续调用都将保留所做的更改。

另一方面,使用 with-scope 会创建当前作用域的副本,并保持隔离状态,直到函数调用完成。因此,您可以在此处不想设置其他位置的上下文信息,也可以通过在作用域上调用 clear 来根本不附加任何上下文信息,而“全局”范围保持不变。

You can edit this page on GitHub.