# Điều kiện đạt của check uptime

> Mã trạng thái, nội dung chứa, giá trị JSON, header, thời gian phản hồi và chứng chỉ TLS: cách viết, thứ tự đánh giá và lý do báo lỗi.

Check uptime HTTP chỉ đạt khi **mọi** điều kiện đều đúng. Thêm chúng ở mục **Điều kiện đạt** khi tạo hoặc sửa check — tối đa 10 điều kiện mỗi check. Không có biểu thức chính quy hay script: mỗi điều kiện là một phép so sánh đơn giản, nên một check có cùng ý nghĩa ở mọi vùng.

Check TCP không có điều kiện: đạt khi mở được kết nối trong thời gian chờ.

## Mặc định

- **Mã trạng thái** — khi không có điều kiện mã trạng thái, `2xx` là đạt. Khi tắt **Đi theo chuyển hướng**, `3xx` cũng đạt, vì chính lệnh chuyển hướng là câu trả lời.
- **Chứng chỉ TLS hợp lệ** — được thêm sẵn cho mọi check mới. Với URL `https://`, chứng chỉ phải được tin cậy và khớp tên host; chứng chỉ hết hạn, tự ký hoặc sai host làm lượt đó hỏng. Chỉ bỏ điều kiện này nếu bạn thật sự dùng chứng chỉ như vậy. Không ảnh hưởng tới URL `http://`.

## Các điều kiện

| Điều kiện | Đạt khi | Ví dụ |
|---|---|---|
| **Mã trạng thái** | Mã cuối cùng nằm trong danh sách mã hoặc dải (tính cả hai đầu) | `200-299, 304` |
| **Nội dung chứa** | Nội dung có đoạn chữ đó | `"status":"ok"` |
| **Nội dung không chứa** | Nội dung không có đoạn chữ đó | `Maintenance` |
| **Giá trị JSON** | Giá trị tại đường dẫn JSON có mặt, bằng một giá trị, hoặc đúng kiểu | `/db/healthy` bằng `true` |
| **Header** | Header phản hồi có mặt, bằng một giá trị, hoặc chứa một đoạn chữ | `content-type` chứa `json` |
| **Thời gian phản hồi** | Tổng thời gian dưới ngưỡng, tính bằng mili giây | dưới `2000` |
| **Chứng chỉ TLS hợp lệ** | Chứng chỉ được tin cậy và khớp tên host | — |

Chi tiết:

- Điều kiện **nội dung** đọc 64 KB đầu của nội dung sau khi giải nén (`gzip`, `deflate`, `br`; tối đa 1 MB sau giải nén). Phần sau đó không được xét. So khớp phân biệt hoa thường, trừ khi bạn chọn **không phân biệt hoa thường**. Yêu cầu `HEAD` không có nội dung, nên điều kiện nội dung và JSON cần `GET`.
- **Giá trị JSON** dùng đường dẫn JSON pointer ([RFC 6901](https://www.rfc-editor.org/rfc/rfc6901)): `/data/items/0/id` là `id` của phần tử đầu tiên; viết `~1` thay cho `/` và `~0` thay cho `~` trong tên khoá. **Bằng** so chuỗi đúng như viết, còn mọi giá trị khác so theo dạng chữ JSON — `true`, `3`, `null`. **Kiểu** là một trong `string`, `number`, `boolean`, `object`, `array`, `null`. Nội dung không phải JSON hợp lệ làm mọi điều kiện JSON hỏng.
- Tên **header** không phân biệt hoa thường; giá trị so đúng như máy chủ gửi.
- **Thời gian phản hồi** là tổng DNS, kết nối, TLS, byte đầu và tải về, đo trên máy kiểm. Sau chuyển hướng là thời gian của bước cuối.
- Đoạn chữ và giá trị dài tối đa 256 ký tự.

## Thứ tự và lý do hỏng

Điều kiện được kiểm theo thứ tự cố định; điều kiện hỏng đầu tiên quyết định lý do hiện ở trang check và trong cảnh báo. Lượt không nhận được câu trả lời thì hỏng sớm hơn, với lý do mạng.

| Thứ tự | Phần hỏng | Lý do hiển thị |
|---|---|---|
| — | Không có câu trả lời: DNS, kết nối, bắt tay TLS hoặc quá thời gian | **không phân giải được DNS**, **không kết nối được**, **lỗi TLS**, **quá thời gian chờ** |
| 1 | Mã trạng thái | **mã trạng thái không như mong đợi** |
| 2 | Chứng chỉ TLS hợp lệ | **lỗi TLS** |
| 3 | Header | **kiểm tra header không đạt** |
| 4 | Nội dung chứa / không chứa | **nội dung không khớp** |
| 5 | Giá trị JSON | **kiểm tra JSON không đạt** |
| 6 | Thời gian phản hồi | **phản hồi quá chậm** |

Vài kết quả là **không rõ**, không bao giờ là hỏng, vì chúng không nói gì về dịch vụ của bạn: **chưa chạy — quá nhiều check cùng lúc tới một máy chủ**, **địa chỉ bị chặn** (tên miền nay phân giải ra địa chỉ bị từ chối — hãy sửa đích) và **lỗi máy kiểm tra**. Xem [Belvador quyết định thế nào](https://belvador.dev/vi/docs/uptime/quickstart#2-belvador-quyet-dinh-the-nao).

## Header của yêu cầu

Bạn có thể gửi tối đa 10 header, ví dụ `x-health-token` mà endpoint của bạn cần. Không được đặt `authorization`, `cookie`, `host`, `content-length`, `transfer-encoding`, `connection`, `te`, `upgrade` và mọi header `proxy-*` hay `sec-*`. Giá trị header là một phần cấu hình check, mọi thành viên workspace đều đọc được — hãy dùng token chỉ dành cho kiểm tra sức khoẻ, không bao giờ dùng thông tin đăng nhập của người dùng. Khi chuyển hướng sang origin khác, header của bạn không được gửi tới đó.

Mọi yêu cầu đều có `User-Agent: BelvadorUptime/<version> (+https://belvador.dev/docs/uptime/probes)`; xem [Máy kiểm và IP](https://belvador.dev/vi/docs/uptime/probes).

## Công thức mẫu

| Mục tiêu | Điều kiện |
|---|---|
| Endpoint sức khoẻ tự báo trạng thái | Mã `200`; giá trị JSON `/status` bằng `ok` |
| Trang không được hiện mẫu lỗi | Mã `200-299`; nội dung không chứa `Something went wrong` |
| API phải luôn nhanh | Mã `200`; thời gian phản hồi dưới `800` |
| Lệnh chuyển hướng phải giữ nguyên | Tắt đi theo chuyển hướng; mã `301`; header `location` chứa `https://www.example.com/` |
