📌 Tổng quan
Trong Prometheus, các hàm up
, absent()
, increase()
và changes()
đóng vai trò quan trọng trong việc giám sát, phát hiện lỗi, theo dõi sự thay đổi và tốc độ phát triển của metric.

up
: Kiểm tra trạng thái sống của các target (instance).absent()
: Kiểm tra xem metric có tồn tại hay không.increase()
: Tính tổng lượng tăng của một metric trong khoảng thời gian nhất định.changes()
: Đếm số lần metric thay đổi giá trị trong một khoảng thời gian.
🔍 1️⃣ up
– Kiểm tra trạng thái sống của instance
✅ Mục đích: Kiểm tra xem một instance có đang gửi dữ liệu về Prometheus không.
🔹 Cách hoạt động:
- Nếu instance hoạt động bình thường,
up
trả về1
. - Nếu instance không phản hồi,
up
trả về0
. - Thường được sử dụng để giám sát tình trạng của exporter hoặc ứng dụng.
🔹 Ví dụ:
up{job="k8s"}
➡️ Kiểm tra trạng thái của tất cả các instance trong job k8s
.
🔹 Alert khi một node bị down hơn 5 phút:
avg_over_time(up[5m]) == 0
➡️ Nếu trong 5 phút qua up
luôn bằng 0
, nghĩa là node đã bị down.
🔍 2️⃣ absent()
– Kiểm tra sự tồn tại của metric
✅ Mục đích: Phát hiện nếu một metric không tồn tại trong hệ thống.
🔹 Cách hoạt động:
- Nếu metric không tồn tại,
absent()
trả về một giá trị1
. - Nếu metric tồn tại,
absent()
không trả về gì.
🔹 Ví dụ:
absent(http_requests_total)
➡️ Trả về 1
nếu không có dữ liệu từ http_requests_total
.
🔹 Dùng OR vector(0)
để luôn có kết quả:
absent(http_requests_total) OR vector(0)
➡️ Nếu metric không tồn tại, vẫn trả về 0
thay vì không có dữ liệu.
🔍 3️⃣ increase()
– Tính tổng lượng tăng của metric theo thời gian
✅ Mục đích: Xác định mức tăng của metric trong một khoảng thời gian nhất định.
🔹 Cách hoạt động:
- Tính tổng số lần tăng của một counter (số chỉ tăng, không giảm).
- Hữu ích khi giám sát tốc độ yêu cầu, lỗi, băng thông, v.v.
🚀 Minh họa dữ liệu Counter:
Timestamp | Giá trị http_requests_total | increase(http_requests_total[5m]) |
---|---|---|
00:00 | 100 | |
00:01 | 110 | 10 |
00:02 | 120 | 10 |
00:03 | 140 | 20 |
00:04 | 160 | 20 |
00:05 | 170 | 10 |
👉 Kết quả increase(http_requests_total[5m]) = 70
(chỉ tính tổng lần tăng).
🔹 Ví dụ:
increase(http_requests_total[5m])
➡️ Trả về số lượng request tăng trong 5 phút qua.
🔹 Kiểm tra số lỗi 500 trong 1 giờ:
increase(http_requests_total{status="500"}[1h])
🚀 Cách hoạt động của increase(http_requests_total[1h])
- Metric
http_requests_total{status="500"}
là một Counter, nghĩa là nó chỉ tăng theo thời gian (không giảm). - Khi bạn dùng
increase(http_requests_total{status="500"}[1h])
, PromQL sẽ tính tổng lượng tăng của metric này trong 1 giờ qua.
Giả sử bạn có log request với các lỗi 500 như sau:
Thời điểm | Tổng lỗi http_requests_total{status="500"} |
---|---|
12:00 | 1000 |
12:15 | 1020 |
12:30 | 1100 |
12:45 | 1300 |
13:00 | 1500 |
Giờ bạn chạy:
increase(http_requests_total{status="500"}[1h])
➡️ Kết quả sẽ là 500
, vì trong vòng 1 giờ từ 12:00 → 13:00, tổng số lỗi 500 đã tăng từ 1000 lên 1500.
⚠️ Lưu ý quan trọng
increase(http_requests_total{status="500"}[1h])
không đếm số lần chuyển từ200 → 500
.- Nó chỉ tính tổng số request có status
500
đã xảy ra trong khoảng thời gian 1 giờ. - Nếu bạn muốn kiểm tra số lần trạng thái thay đổi (từ 200 → 500), bạn cần dùng
changes()
.
🛠 Nếu muốn kiểm tra số lần trạng thái thay đổi?
changes(http_requests_total{status="500"}[1h])
➡️ Đếm số lần http_requests_total{status="500"}
thay đổi giá trị trong 1 giờ (tức là số lần có request lỗi 500 mới xuất hiện).
➡️ Giúp phát hiện lỗi HTTP theo thời gian. Nếu muốn kiểm tra số lần trạng thái thay đổi? Sử dụng changes ví dụ changes(http_requests_total{status="500"}[1h])
. Nó đếm số lần http_requests_total{status="500"}
thay đổi giá trị trong 1 giờ (tức là số lần có request lỗi 500 mới xuất hiện).
🔍 4️⃣ changes()
– Đếm số lần metric thay đổi
✅ Mục đích: Kiểm tra một metric có thay đổi trong khoảng thời gian hay không.
🔹 Cách hoạt động:
- Hoạt động với cả gauge và counter.
- Đếm số lần giá trị của metric thay đổi.
- Hữu ích để kiểm tra xem metric có bị “đóng băng” hay không.
🚀 Minh họa dữ liệu Gauge:
Timestamp | Giá trị kube_node_cpu_usage | changes( |
---|---|---|
00:00 | 8 | |
00:01 | 8 | 0 |
00:02 | 9 | 1 |
00:03 | 7 | 1 |
00:04 | 7 | 0 |
00:05 | 8 | 1 |
👉 Kết quả changes(kube_node_cpu_limit[5m]) = 3
(tại 00:05, vì có 3 lần thay đổi: 8→9, 9→7, 7→8).
🔹 Ví dụ:
changes(kube_node_cpu_usage[5m])
➡️ Nếu kết quả là 0
, nghĩa là CPU metric không thay đổi trong 5 phút qua.
🔹 Cảnh báo nếu metric bị “đóng băng” (không thay đổi trong 5 phút):
changes(kube_node_cpu_usage[5m]) == 0
➡️ Nếu không có thay đổi trong 5 phút, metric có thể đã bị mất dữ liệu.
📊 So sánh up
, absent()
, increase()
, và changes()
Hàm | Chức năng | Áp dụng cho | Khi nào dùng? | Ví dụ |
---|---|---|---|---|
up | Kiểm tra trạng thái sống của instance | Mọi instance | Xác định instance có đang hoạt động không | up{job="k8s"} |
absent() | Kiểm tra xem metric có tồn tại không | Mọi metric | Khi muốn phát hiện metric bị mất | absent(http_requests_total) |
increase() | Tính tổng lượng tăng của metric trong một khoảng thời gian | Counter | Khi muốn đo tốc độ tăng trưởng | increase(http_requests_total[5m]) |
changes() | Đếm số lần giá trị metric thay đổi trong khoảng thời gian | Gauge, Counter | Khi muốn kiểm tra metric có thay đổi không | changes(node_cpu_seconds_total[5m]) |
🛠 Ứng dụng thực tế & cách kết hợp
🔸 1. Kiểm tra instance có hoạt động không và phát hiện mất dữ liệu
up{job="k8s"} == 0 OR absent(up{job="k8s"})
➡️ Kiểm tra xem instance có bị mất hoặc không hoạt động.
🔸 2. Kết hợp absent()
với vector(0)
để đảm bảo luôn có dữ liệu
absent(node_cpu_seconds_total) OR vector(0)
➡️ Tránh trường hợp PromQL không trả về gì khi metric bị mất.
🔸 3. Phát hiện metric bị mất hoặc bị đóng băng
(absent(kube_node_cpu_usage) OR changes(kube_node_cpu_usage[5m]) == 0)
➡️ Nếu metric bị mất hoặc không thay đổi trong 5 phút, sẽ báo động.
🔸 4. Cảnh báo khi metric ngừng tăng (có thể hệ thống đang gặp sự cố)
increase(node_network_receive_bytes_total[5m]) == 0
➡️ Nếu không có dữ liệu trong 5 phút, có thể hệ thống đang gặp lỗi.
📌 Kết luận
up
giúp kiểm tra trạng thái sống của một instance.absent()
giúp kiểm tra sự tồn tại của metric, tránh mất dữ liệu mà không nhận ra.increase()
giúp theo dõi tốc độ phát triển của một counter theo thời gian.changes()
giúp phát hiện metric bị đóng băng, không thay đổi theo thời gian.
✅ Hiểu và kết hợp cả bốn hàm này sẽ giúp bạn giám sát hệ thống một cách chính xác và hiệu quả hơn! 🚀