Friday, February 21, 2025

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:

TimestampGiá trị http_requests_totalincrease(http_requests_total[5m])
00:00100
00:0111010
00:0212010
00:0314020
00:0416020
00:0517010

👉 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ểmTổng lỗi http_requests_total{status="500"}
12:001000
12:151020
12:301100
12:451300
13:001500

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:

TimestampGiá trị kube_node_cpu_usagechanges(kube_node_cpu_usage[5m])
00:008
00:0180
00:0291
00:0371
00:0470
00:0581

👉 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àmChức năngÁp dụng choKhi nào dùng?Ví dụ
upKiểm tra trạng thái sống của instanceMọi instanceXác định instance có đang hoạt động khôngup{job="k8s"}
absent()Kiểm tra xem metric có tồn tại khôngMọi metricKhi muốn phát hiện metric bị mấtabsent(http_requests_total)
increase()Tính tổng lượng tăng của metric trong một khoảng thời gianCounterKhi muốn đo tốc độ tăng trưởngincrease(http_requests_total[5m])
changes()Đếm số lần giá trị metric thay đổi trong khoảng thời gianGauge, CounterKhi muốn kiểm tra metric có thay đổi khôngchanges(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! 🚀

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories