# Event, issue và cách xử lý

> Lỗi được gom thành issue thế nào, các trạng thái, tìm kiếm, lọc, gán người và lưu trữ.

Một **event** là một lần báo lỗi từ ứng dụng. Một **issue** là mọi event có cùng nguyên nhân, được gom lại — một bug xảy ra 3.000 lần là một issue với 3.000 event. Bạn xử lý issue, không xử lý từng event.

## Lỗi được gom nhóm thế nào

Node tính một fingerprint cho mỗi event:

- **Có stack trace:** loại exception cộng tối đa 30 frame trong app mới nhất — mỗi frame lấy tên module hoặc file và tên hàm. Không dùng số dòng và cột, nên issue không bị tách khi code thay đổi nhỏ.
- **Không có stack trace:** loại exception và message của nó, hoặc chỉ message.
- Trước khi so sánh, các phần hay thay đổi được chuẩn hoá: UUID, email, địa chỉ IP, số và chuỗi hex dài, đường dẫn tạm và query string trong URL. `User 123 not found` và `User 456 not found` thành một issue.

Phiên bản thuật toán gom nhóm (hiện là `belvador:2026-10`) được lưu trên mỗi issue. Phiên bản sau chỉ áp dụng cho event mới; issue đã có không bao giờ bị gom lại.

### Tự đặt cách gom nhóm

Đặt fingerprint khi cách gom mặc định gộp quá nhiều hoặc tách quá nhỏ:

```ts
import { captureException, withScope } from "@belvador/browser";

withScope((scope) => {
  // Mọi lỗi của một cổng thanh toán thành một issue.
  scope.setFingerprint(["payment-provider-down", provider]);
  captureException(error);
});
```

Thêm `"{{ default }}"` vào danh sách để tinh chỉnh cách gom mặc định thay vì thay thế nó.

## Trạng thái

| Trạng thái | Ý nghĩa |
|---|---|
| **Chưa xử lý** | Cần xem. Trạng thái con: **Mới**, **Đang diễn ra**, **Đang tăng**, **Tái phát** |
| **Đã xử lý** | Đã sửa. Event mới hơn sẽ đưa issue trở lại với trạng thái **Tái phát** |
| **Lưu trữ** | Chủ động ẩn đi, tới khi đạt điều kiện bạn chọn — hoặc vĩnh viễn |

Issue **Đang tăng** khi có ít nhất 10 event trong 60 phút qua và ít nhất gấp năm lần trung bình mỗi giờ của 7 ngày trước đó. Event được đếm khi tới, nên một job báo mọi lần thử lại sẽ chạm ngưỡng này sớm hơn job chỉ báo lần hỏng cuối ([thử lại](https://belvador.dev/vi/docs/monitors/setup#thu-lai)).

Issue cũng có **Ưu tiên**: Cao, Vừa hoặc Thấp.

## Thao tác

Mở menu thao tác trên một issue, hoặc chọn nhiều issue trong danh sách (tối đa 100 cùng lúc):

| Thao tác | Tác dụng |
|---|---|
| **Xử lý xong ngay** | Đánh dấu đã sửa. Event sau đó sẽ mở lại issue với trạng thái Tái phát. |
| **Xong ở release tiếp theo** | Chỉ mở lại khi lỗi xuất hiện ở release mới hơn release lúc bạn đánh dấu — dùng khi bản sửa sẽ triển khai sau. Cần đặt `release` trong SDK. |
| **Mở lại** | Trở về Chưa xử lý. |
| **Lưu trữ** | **Tới khi tăng mạnh**, **Tới khi có thêm 100 event**, **Tới khi thêm 10 người bị ảnh hưởng**, **Trong 24 giờ**, **Trong 7 ngày** hoặc **Vĩnh viễn**. Khi đạt điều kiện, issue quay lại. |
| **Gán cho tôi** / gán cho thành viên / **Bỏ gán** | Ai đang xem issue này. Không gán được cho viewer. |
| **Ưu tiên** | Cao, Vừa hoặc Thấp. |

Member, admin và owner đổi được issue; viewer chỉ xem.

## Tìm issue

Ô tìm kiếm (bấm **/** để chuyển tới) tìm chữ trong tiêu đề, culprit, message, giá trị exception và stack trace, không phân biệt hoa thường. Mã ngắn của issue — ví dụ `WEB-1Z` — mở thẳng issue đó.

Không có ngôn ngữ truy vấn: những từ như `is:unresolved` hay `tag:browser` được tìm như chữ thường. Hãy dùng bộ lọc:

| Bộ lọc | Giá trị |
|---|---|
| Project | Một, nhiều hoặc mọi project |
| Trạng thái | Chưa xử lý (mặc định), Đã xử lý, Lưu trữ |
| Mức độ | Nghiêm trọng, Lỗi, Cảnh báo, Thông tin, Gỡ lỗi |
| Ưu tiên | Cao, Vừa, Thấp |
| Môi trường | Mọi môi trường node đã thấy |
| Người xử lý | Bất kỳ ai, Tôi, Chưa gán, một thành viên |
| Khoảng thời gian | 1 giờ, 24 giờ (mặc định), 7, 14 hoặc 30 ngày |
| Sắp xếp | Gần đây nhất (mặc định), Xuất hiện đầu, Số event, Số người, Ưu tiên |

Bộ lọc nằm trong địa chỉ trang, nên bạn đánh dấu hoặc chia sẻ được một góc nhìn. Với khoảng thời gian dài, việc tìm trong nội dung event có thể dừng sớm để giữ tốc độ; tiêu đề luôn được tìm đầy đủ, và trang sẽ báo khi điều đó xảy ra.

## Chi tiết issue

- **Stack trace** — chọn **Trong app**, **Mọi khung** hoặc **Thô**. Frame từ code đã thu nhỏ có nhãn **Bản thu nhỏ** cho tới khi [source map](https://belvador.dev/vi/docs/source-maps) khôi phục được.
- **Breadcrumb** — các bước trước khi lỗi xảy ra, nếu SDK có ghi.
- **Tag** và **Ngữ cảnh** — những gì ứng dụng và SDK gắn vào, sau khi đã lọc.
- **Tệp đính kèm** — luôn tải về được. Tệp PNG, JPEG, GIF và WebP, nhận diện theo nội dung byte, còn xem trước được; SVG và mọi loại khác chỉ tải về, không bao giờ mở trong trang.

Mọi thứ trong event đều do một ứng dụng gửi lên và được hiển thị dạng chữ thuần — liên kết từ dữ liệu event mở qua một trang cảnh báo.
