Skip to main content

PromQL — The Monitoring Language

PromQL (Prometheus Query Language) is how you ask questions about your metrics. Think of it as the nurse's diagnostic toolkit — you use it to check vitals, spot trends, and trigger alarms.

Basic Queries​

Instant vector — the current reading​

Current CPU usage
node_cpu_seconds_total

This returns the latest value for every time series matching that name.

Range vector — the last hour of readings​

Last 5 minutes of data
http_requests_total[5m]

Returns all data points from the last 5 minutes.

Only GET requests
http_requests_total{method="GET"}
Multiple conditions
http_requests_total{method="GET", status="200"}
Regex matching
http_requests_total{path=~"/api/.*"}
Remember

= means exact match. =~ means regex match. != means not equal.

Core Functions​

rate() — Speed of the Counter​

Converts a counter (total requests) into a rate (requests per second):

Requests per second over 5 minutes
rate(http_requests_total[5m])
Errors per second
rate(http_requests_total{status=~"5.."}[5m])
Remember

Always use rate() with counters. Without it, you see the total count, not the current speed.

increase() — Growth Over a Period​

Requests in the last hour
increase(http_requests_total[1h])

histogram_quantile() — Percentiles​

95th percentile latency
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
Median latency (50th percentile)
histogram_quantile(0.50, rate(http_request_duration_seconds_bucket[5m]))

sum() — Aggregate Across Labels​

Total requests across all instances
sum(rate(http_requests_total[5m]))
Requests per path
sum by (path) (rate(http_requests_total[5m]))

avg(), min(), max()​

Average CPU usage
avg(node_cpu_seconds_total)
Maximum memory usage
max(node_memory_MemAvailable_bytes)

Common Patterns​

Error rate​

Percentage of 5xx errors
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
* 100

Availability (uptime)​

Percentage of non-5xx responses
100 - (
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
* 100
)

Saturation (resource usage)​

Memory usage percentage
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
Disk usage percentage
(1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100
Remember

The four golden signals (Google SRE): Latency (how slow), Traffic (how much), Errors (how broken), Saturation (how full). PromQL queries for all four.

Aggregation Operators​

OperatorMeaningExample
sumAdd all valuesTotal requests across all pods
avgAverage of all valuesAverage CPU per node
minSmallest valueMinimum available memory
maxLargest valueMaximum request latency
countNumber of seriesHow many targets are up
topkTop K valuesTop 5 busiest servers
bottomkBottom K valuesBottom 3 servers by memory
Top 5 servers by CPU usage
topk(5, rate(node_cpu_seconds_total[5m]))
How many targets are up?
count(up == 1)
Remember

sum by (label) groups by a label. without (label) removes a label from grouping.