Logo

Personal Ops Runbook

Personal runbook covering infrastructure operations for Cloud, Kubernetes, OpenStack, and Ceph environments. Includes deployment and teardown procedures, node management, cluster monitoring setup, and incident response workflows compiled from day-to-day operational work. Intended strictly for personal reference — configurations and scripts are environment-specific and not guaranteed to work as-is elsewhere.

Metrics up, absent(), increase() và changes() trong PromQL


📌 Tổng quan

Trong Prometheus, các hàm up, absent(), increase()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ả gaugecounter.
  • Đế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(kube_node_cpu_usage[5m])
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! 🚀