Hiểu về Scope và Hub trong Sentry SDK cho JavaScript

Khi một lỗi hoặc sự kiện được gửi đến Sentry, SDK sẽ kết hợp dữ liệu sự kiện với thông tin bổ sung từ scope hiện tại. Mặc dù các tích hợp framework (React, Express, v.v.) thường tự động quản lý scope, việc nắm rõ khái niệm scopehub giúp bạn kiểm soát chính xác cách dữ liệu được đính kèm vào báo cáo lỗi.

Hub: Trung tâm điều phối sự kiện

Hub là thành phần cốt lõi chịu trách nhiệm định tuyến sự kiện qua client và gửi tới máy chủ Sentry. Khi gọi Sentry.init(), một hub được khởi tạo cùng với một client và một scope rỗng. Mỗi luồng (thread) hoặc context thực thi (ví dụ: request trong Node.js, component trong React) được gắn với một hub riêng — nơi duy trì ngăn xếp scope đang hoạt động.

Scope: Bối cảnh dữ liệu đi kèm sự kiện

Scope chứa các metadata như người dùng, thẻ (tags), mức độ nghiêm trọng (level), breadcrumbs, hoặc custom context — tất cả đều được tự động đính kèm khi gửi sự kiện. Mỗi lần push một scope, bản sao của scope cha được tạo ra; mọi thay đổi (thêm tag, cập nhật user…) chỉ tồn tại trong phạm vi đó. Khi pop, trạng thái trước đó được khôi phục — đảm bảo tính cô lập giữa các yêu cầu hoặc phiên làm việc.

Cấu hình scope toàn cục

Hàm configureScope cho phép chỉnh sửa scope mặc định — hữu ích khi cần thiết lập thông tin chung cho toàn bộ ứng dụng, ví dụ như nhận diện người dùng đã đăng nhập:
import * as Sentry from '@sentry/browser';

Sentry.configureScope((scope) => {
  scope.setTag('environment', 'production');
  scope.setUser({
    id: 'usr_9a8b7c',
    username: 'alice_dev',
    email: 'alice@example.org'
  });
});
Để xóa thông tin người dùng sau khi đăng xuất:
Sentry.configureScope((scope) => scope.setUser(null));

Tạo scope tạm thời cho từng sự kiện

Hàm withScope tạo một bản sao độc lập của scope hiện tại, áp dụng các thay đổi chỉ trong phạm vi callback — không ảnh hưởng đến scope gốc. Đây là cách an toàn để đính kèm metadata đặc thù cho một lỗi duy nhất:
// Chỉ lỗi này có tag 'priority' và level 'error'
Sentry.withScope((scope) => {
  scope.setTag('priority', 'urgent');
  scope.setLevel('error');
  Sentry.captureMessage('Failed to load payment gateway');
});

// Lỗi sau đây không mang bất kỳ tag nào từ khối trên
Sentry.captureMessage('Cache miss');
Lưu ý: withScope không bắt lỗi bên trong callback — nếu xảy ra ngoại lệ trong hàm truyền vào, nó sẽ bị bỏ qua mà không được báo cáo.

So sánh nhanh

  • configureScope: Thay đổi scope toàn cục — tác động kéo dài đến các sự kiện tiếp theo.
  • withScope: Tạo scope tạm, cô lập hoàn toàn — chỉ ảnh hưởng đến sự kiện được gửi bên trong.

Thẻ: sentry JavaScript frontend-monitoring

Đăng vào ngày 2 tháng 6 lúc 17:42