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.