Prometheus Query Language (PromQL) là ngôn ngữ truy vấn đặc thù được thiết kế riêng cho hệ thống giám sát Prometheus. Nó cho phép người dùng khai thác dữ liệu chuỗi thời gian (time-series) một cách linh hoạt, từ việc hiển thị biểu đồ cơ bản đến xây dựng các quy tắc cảnh báo phức tạp và phân tích xu hướng hiệu năng của hệ thống cloud-native.
1. Tổng quan về kiến trúc và tư duy thiết kế của PromQL
PromQL không giống như SQL truyền thống; nó được tối ưu hóa để xử lý các phép toán trên dữ liệu phân bố theo thời gian. Triết lý thiết kế của ngôn ngữ này tập trung vào ba yếu tố cốt lõi: khả năng lọc dữ liệu dựa trên nhãn (labels), tính toán vector hóa và hiệu suất truy vấn thời gian thực.
- Tính linh hoạt: Khả năng chọn lọc dữ liệu cực kỳ chi tiết thông qua các bộ chọn nhãn (Label Selectors), cho phép truy vấn chính xác một instance hoặc một nhóm dịch vụ cụ thể.
- Hiệu năng: Công cụ thực thi của PromQL được tối ưu để xử lý hàng triệu điểm dữ liệu mà vẫn đảm bảo độ trễ thấp, yếu tố then chốt trong các hệ thống giám sát thời gian thực.
2. Các kiểu dữ liệu nền tảng trong PromQL
Để làm chủ PromQL, việc hiểu rõ các kiểu dữ liệu mà ngôn ngữ này thao tác là điều bắt buộc. Có bốn loại dữ liệu chính:
Instant Vector (Vector tức thời)
Là một tập hợp các chuỗi thời gian mà tại đó mỗi chuỗi chỉ chứa một mẫu duy nhất (giá trị đơn) tại cùng một thời điểm truy vấn.
node_memory_MemFree_bytes{instance="192.168.1.10:9100"}
Truy vấn trên sẽ trả về dung lượng bộ nhớ trống hiện tại của một node cụ thể.
Range Vector (Vector dải thời gian)
Là một tập hợp các chuỗi thời gian chứa một mảng các điểm dữ liệu trong một khoảng thời gian xác định trong quá khứ.
container_network_receive_bytes_total{pod="api-gateway-xyz"}[10m]
Ví dụ này trả về toàn bộ dữ liệu lưu lượng mạng nhận được của một Pod trong vòng 10 phút qua.
Scalar và String
Scalar là một giá trị số thực đơn thuần không có nhãn, thường dùng trong các phép tính toán học. String là kiểu chuỗi ký tự, ít được dùng trong tính toán nhưng quan trọng trong cấu hình hiển thị.
3. Cú pháp và bộ lọc nhãn nâng cao
Bộ lọc nhãn là sức mạnh lớn nhất của PromQL, cho phép kết hợp các điều kiện logic để khoanh vùng dữ liệu.
=: So khớp chính xác.!=: Loại trừ các giá trị khớp.=~: So khớp dựa trên biểu thức chính quy (Regex).!~: Loại trừ dựa trên Regex.
service_requests_total{app=~"auth-.*", status!="500"}
Truy vấn này lấy tổng số yêu cầu từ tất cả các dịch vụ bắt đầu bằng "auth-" và loại bỏ các lỗi Internal Server Error (500).
4. Các toán tử và hàm xử lý dữ liệu
Toán tử số học và so sánh
PromQL hỗ trợ các phép toán cơ bản như +, -, *, / giữa các vector hoặc giữa vector và scalar. Các toán tử so sánh (>, <, ==) thường được dùng để lọc các instance vượt ngưỡng.
# Tìm các instance có tỷ lệ sử dụng CPU vượt quá 85%
(node_cpu_seconds_total{mode="idle"} / node_cpu_seconds_total) * 100 < 15
Hàm tổng hợp (Aggregation)
Các hàm như sum, avg, min, max, count giúp gộp dữ liệu từ nhiều nguồn thành một kết quả duy nhất theo các chiều (dimension) cụ thể.
# Tính trung bình số lượng request mỗi giây theo từng phương thức HTTP
sum by (method) (rate(http_requests_total[5m]))
5. Kỹ thuật phân tích hiệu năng chuyên sâu
Sử dụng hàm rate() và irate()
rate() tính toán tốc độ tăng trưởng trung bình mỗi giây trong một khoảng thời gian. Trong khi đó, irate() chỉ tập trung vào hai điểm dữ liệu cuối cùng, phù hợp để quan sát các biến động tức thời (spikes).
# Tính tốc độ request trung bình trong 15 phút
rate(gateway_api_responses_total[15m])
Phân tích Percentile với Histogram
Để đánh giá trải nghiệm người dùng, việc sử dụng giá trị trung bình là không đủ. Hàm histogram_quantile cho phép tính toán các bách phân vị (percentiles) để xác định độ trễ của hệ thống.
# Tính P99 (99th percentile) của độ trễ API trong 10 phút qua
histogram_quantile(0.99, sum by (le) (rate(api_latency_seconds_bucket{service="order-svc"}[10m])))
Dự báo xu hướng với predict_linear
Hàm predict_linear sử dụng hồi quy tuyến tính để dự đoán giá trị của một chuỗi thời gian trong tương lai, cực kỳ hữu ích cho việc cảnh báo sắp hết dung lượng lưu trữ.
# Dự đoán xem ổ cứng có đầy trong 6 giờ tới hay không
predict_linear(node_filesystem_free_bytes{mountpoint="/"}[2h], 6 * 3600) < 0
6. Chiến lược thiết lập cảnh báo động
Thay vì sử dụng các ngưỡng cố định (static thresholds), PromQL cho phép xây dựng các cảnh báo dựa trên độ lệch chuẩn hoặc so sánh với dữ liệu lịch sử thông qua toán tử offset.
# Cảnh báo nếu lưu lượng hiện tại giảm 50% so với cùng thời điểm tuần trước
rate(http_requests_total[5m]) < (rate(http_requests_total[5m] offset 1w) * 0.5)
Phương pháp này giúp giảm thiểu các cảnh báo giả (false positives) trong những khung giờ thấp điểm hoặc khi hệ thống có tính chu kỳ.