# 🔭 Cheatsheet: Observability cho người mới: log, metric và cảnh báo

By Better Wise

> This cheatsheet is premium content. Sign in and purchase the course to view the full content.

Tra cứu nhanh cho on-call: log, metric, dashboard, alert, tracing, và cách nhờ AI thêm log.

---

## Module 1: Log có cấu trúc và log level

### 1.1 Structured logging

Log truyền thống là chuỗi văn bản khó parse. Structured log là **một object JSON với các field cố định**.

**So sánh:**

| Kiểu | Ví dụ | Khi nào dùng |
| --- | --- | --- |
| Unstructured | `User 42 failed login from 1.2.3.4` | Chỉ đọc bằng mắt, không filter được |
| Structured | `{"level":"warn","event":"login_failed","user_id":42,"ip":"1.2.3.4"}` | Query, filter, alert, dashboard |

**Các field tối thiểu nên có:**

| Field | Ý nghĩa | Ví dụ |
| --- | --- | --- |
| `timestamp` | Thời điểm (ISO 8601, có timezone) | `2024-05-01T03:12:45Z` |
| `level` | Mức log | `info`, `error` |
| `event` | Tên sự kiện ngắn, cố định | `order_created` |
| `service` | Tên service phát sinh log | `checkout-api` |
| `request_id` | ID gắn cả request để nối các log | `req_8f3a...` |
| `user_id` | Ai gây ra (nếu có) | `42` |
| `duration_ms` | Thời gian xử lý (nếu đo được) | `128` |
| `error` | Thông tin lỗi (message, type) | `"timeout"` |

**Quy tắc vàng:**
- `event` là **tên cố định**, không phải câu văn tự do. Dùng `order_created`, không dùng `"Đã tạo đơn hàng thành công"`.
- Mọi field động (ID, giá trị) phải nằm trong field riêng, không nhét vào `event`.
- Luôn kèm `request_id` để nối log giữa các service.

```json
{"timestamp":"2024-05-01T03:12:45Z","level":"error","event":"payment_failed","service":"checkout-api","request_id":"req_8f3a","user_id":42,"duration_ms":1280,"error":{"type":"timeout","message":"gateway timeout"}}
```

> **Tip:** 
> Nếu log của bạn bắt đầu bằng một câu tiếng Việt có dấu phẩy, đó chưa phải structured log.

### 1.2 Log level
