Sentry 開發者貢獻指南 - 什么是 Scope, 什么是 Hub?


當一個事件被捕獲並發送到 Sentry 時,SDK 會將該事件數據與來自當前 scope 的額外信息合並。SDK 通常會在框架集成中為您自動管理 scope,您無需考慮它們。但是,您應該知道 scope 是什么以及如何利用它來獲取優勢。

什么是 Scope, 什么是 Hub?

您可以將 hub 視為我們的 SDK 用於將事件路由到 Sentry 的中心點。當您調用 init() 時,會創建一個 hub,並在其上創建一個 client 和一個空白 scope。然后該 hub 與當前線程相關聯,並將在內部保存 scope 堆棧。

scope 將保存應與事件一起發送的有用信息。例如context(上下文)breadcrumbs(面包屑)存儲在 scope 內。當一個 scopepush 時,它從父 scope 繼承所有數據,當它 pop 時,所有修改都被還原

默認的 SDK 集成將智能地 pushpop scope。例如,Web 框架集成將圍繞您的路由控制器創建和銷毀 scope

Scope 和 Hub 的工作原理

當您開始使用 SDK 時,會自動為您創建一個開箱即用的 scopehub。除非您正在編寫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-scopepush-scope,如果您只想發送具有一個特定事件的數據,這也非常有用。 在以下示例中,我們使用該函數將 leveltag 附加到僅一個特定錯誤

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 不會捕獲在其回調函數中發生的任何異常,並且在那里發生的每個錯誤都將被靜默忽略而不報告。

更多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM