Prometheus Monitoring and Alerting in 2026: PromQL, Alertmanager, and SLO-Driven Observability
Why Prometheus Is Still the Standard for Cloud-Native Monitoring
In 2026, with OpenTelemetry surging, Prometheus still dominates the Metrics pillar. It is known for its pull model, multi-dimensional data model, and powerful PromQL, and pairs with Alertmanager to form a closed alerting loop. Understanding its design tradeoffs is the first step to reliable observability.
| Dimension | Prometheus | Push-based方案 |
|---|---|---|
| Collection | Pulls /metrics | Client pushes |
| Query | PromQL, flexible & multi-dim | Depends on external store |
| Service discovery | Native K8s/Consul | Self-implemented |
| Best for | Machine/service metrics | Short-lived jobs (via Pushgateway) |
Architecture and Core Components
- Prometheus Server: scrape, store (local TSDB), execute PromQL.
- Exporter: exposes third-party metrics as
/metrics(node_exporter, blackbox_exporter, etc.). - Alertmanager: dedupe, group, route, silence alerts.
- Pushgateway: accepts pushed metrics from batch/short jobs.
# prometheus.yml minimal config
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: "node"
static_configs:
- targets: ["node-1:9100", "node-2:9100"]
- job_name: "api"
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_name]
regex: "order-api"
action: keep
When debugging scrape failures, cross-check the Exporter's response code (e.g., 200/503) with the HTTP Status Codes tool to quickly tell whether the problem is on the scrape or the expose side.
Core PromQL Functions
rate / irate: compute rates
# requests per second (5m window, smooths spikes)
rate(http_requests_total[5m])
# instantaneous rate (last two samples), more sensitive, more jittery
irate(http_requests_total[5m])
histogram_quantile: quantile latency
http_request_duration_seconds_bucket is a histogram metric; use the quantile function for P99 latency:
# P99 request latency
histogram_quantile(0.99,
sum by (le) (rate(http_request_duration_seconds_bucket[5m]))
)
Aggregating by labels
# QPS grouped by service and code
sum by (service, code) (rate(http_requests_total[5m]))
Recording Rules: Precompute to Cut Cost
Precompute frequent, expensive queries into new time series so dashboards read the result directly.
# rules/recording.yml
groups:
- name: http_slo
rules:
- record: job:http_requests:rate5m
expr: sum by (job) (rate(http_requests_total[5m]))
- record: job:request_latency:p99
expr: |
histogram_quantile(0.99,
sum by (job, le) (rate(http_request_duration_seconds_bucket[5m])))
Alerting Rules and Alertmanager
Alerting rules
# rules/alerts.yml
groups:
- name: availability
rules:
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{code=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m])) > 0.05
for: 10m # fire only after 10m to avoid flapping
labels:
severity: critical
annotations:
summary: "Error rate above 5%"
description: "Service {{ $labels.job }} 5xx rate {{ $value | humanizePercentage }}"
Alertmanager routing and grouping
# alertmanager.yml
route:
receiver: "slack-default"
group_by: ["alertname", "job"]
group_wait: 30s # first wait to aggregate multiple alerts
group_interval: 5m
repeat_interval: 4h
routes:
- matchers: ["severity=critical"]
receiver: "pagerduty"
continue: true
- matchers: ["job=~"batch.*"]
receiver: "slack-batch"
receivers:
- name: "slack-default"
slack_configs:
- api_url: ${SLACK_URL}
channel: "#alerts"
Inhibition and Silence
- Inhibition: when a "host down" alert exists, suppress the "service unavailable" alert on that host to cut noise.
- Silence: temporarily mute specific alerts during a maintenance window (e.g., a release). Plan the window with the Cron tool.
SLO and Error-Budget Burn Rates
Replace "gut-feeling thresholds" with SLOs (Service Level Objectives) — the core of modern alerting. For 99.9% availability:
# compliance ratio over a 30d window (good / total)
(
sum(rate(http_requests_total{code!~"5.."}[30d]))
/
sum(rate(http_requests_total[30d]))
) > 0.999
Burn-rate alerting warns early when the error budget is consumed fast:
- alert: ErrorBudgetBurnFast
expr: |
(
sum(rate(http_requests_total{code=~"5.."}[1h]))
/ sum(rate(http_requests_total[1h]))
) > (14.4 * (1 - 0.999)) # 14.4x the rate that exhausts 30d budget in 1h
for: 5m
labels: { severity: critical }
Application Instrumentation: Don't Rely Only on Exporters
Business metrics need active instrumentation. Python example:
from prometheus_client import Counter, Histogram, start_http_server
REQUESTS = Counter("http_requests_total", "Total requests", ["method", "code"])
LATENCY = Histogram("http_request_duration_seconds", "Request latency")
start_http_server(8000) # exposes /metrics
@LATENCY.time()
def handle(req):
REQUESTS.labels(req.method, "200").inc()
return "ok"
On the frontend or gateway side, validate structured metrics with the JSON Formatter tool before writing to the monitoring pipeline, avoiding dirty data polluting queries.
Production Best-Practice Checklist
- Set
forsensibly: avoid alert storms from transient flapping. - Control cardinality: don't use high-cardinality columns (e.g., user_id) as labels — they blow up the TSDB.
- Tiered alerts: Warning → chat group; Critical → on-call pager.
- Precompute with recording rules: dashboards read precomputed series.
- Long-term storage: pair local TSDB with Thanos / Mimir for remote write, breaking the single-node retention ceiling.
FAQ
Q1: rate or irate?
Use rate for trends (smooth); irate for instantaneous spikes (sensitive). Dashboards generally use rate.
Q2: Histogram or Summary?
Need cross-instance quantile aggregation (e.g., global P99) → Histogram. Single instance with unknown quantiles → Summary. Histogram is more flexible; recommended by default.
Q3: Alerts keep flapping?
Add for: 10m to the rule, or use a longer rate window on the metric to absorb short-term fluctuation.
Q4: What if there are too many labels?
Each unique label combination is a separate time series. Abusing high-cardinality columns causes memory and write explosions — the most common Prometheus performance pitfall.
Q5: Can Prometheus replace logs and traces?
No. Metrics show "totals and trends", Logs show "single-event detail", Traces show "call paths". They are complementary, forming complete observability.
Recommended Tools
For Prometheus operations, these ToolsKu tools help:
- HTTP Status Codes — Cross-check Exporter/Alertmanager endpoint responses
- Cron — Plan maintenance silence windows and scrape periods
- JSON Formatter — Validate alert webhook and metric payloads
Prometheus's power isn't "drawing charts" — it's "translating business health into quantifiable SLOs with PromQL, then filtering noise into actionable alerts with Alertmanager." Link metrics, alerting, and SLO together, and monitoring finally delivers real value.
Try these browser-local tools — no sign-up required →