SLOs & alerts
Turn "everyone knows payments matters most" into configuration: classify
services into criticality tiers, give each tier an error budget and a latency
objective, and route down to the pager while degraded goes to a Slack
channel. This guide is Helm-first — the production path.
Prerequisites
- avuru obs installed via Helm with the
service-healthandalertingmodules on (they're on by default). - Traffic flowing, so services have RED data to judge.
Steps
-
Classify services into tiers. Name the groups that matter and let everything else auto-group by namespace at the default tier:
serviceGroups:defaultTier: T2groups:- name: paymentstier: T0selector: { namespaces: [payments] }- name: storefronttier: T1selector: { services: [web, catalog, search] } -
Set objectives per tier. Thresholds resolve by precedence — services > tiers > defaults — so tighten T0 without touching the long tail:
serviceGroups:thresholds:defaults:errorRateWarn: 0.01 # 1% → degradederrorRateCrit: 0.05 # 5% → downlatencyP95ObjectiveMs: 500minSampleCount: 5tiers:T0: { errorRateWarn: 0.005, errorRateCrit: 0.02, latencyP95ObjectiveMs: 300 }services:reports: { latencyP95ObjectiveMs: 2000 } # slow by designEvery judgement shows its work on the
/healthboard:error rate 4.2% ≥ 1% budget,p95 780ms ≥ 500ms objective. -
Route by audience, not just severity. Two rules, two channels — the pager only hears about sustained T0 trouble:
alerting:channels:- name: pagertype: webhookurl: https://events.pagerduty.com/integration/xxx/enqueuesecret: "hmac-signing-secret"- name: team-slacktype: webhookurl: https://hooks.slack.com/services/xxxrules:- name: t0-downwhen: not-healthy # degraded OR downfor: 5m # sustained — a blip never pagesselector: { tiers: [T0] }channel: pager- name: t1-early-warningwhen: degradedfor: 10mselector: { tiers: [T1] }channel: team-slack -
Apply, or edit live.
helm upgrade— orkubectl editthe rendered ConfigMaps: the hub hot-reloads both files within ~15 s, no restart. Bad config (unknown tier, undeclared channel, empty selector) is rejected loudly, not silently ignored.
Verify
# Thresholds visibly applied — statuses carry their reasons:
curl -s 'http://<hub>/api/v1/health/groups' | jq '.groups[] | {name, status, reason}'
# Rules loaded (channel secrets are never serialized):
curl -s 'http://<hub>/api/v1/alerts/rules' | jq
Honest scope
The rules above alert on sustained health status — a target staying
down/degraded for a duration — not on multi-window error-budget burn
rate. Burn-rate alerting is on the roadmap; until then, the
tier objectives give you the SLO language while status transitions give you
the mechanism.
Next
- Service health — how statuses and rollups are computed.
- Alerting — lifecycle, payload, HMAC signing, SSRF guard.
- Know when checkout is down — the same chain, live on a laptop in fifteen minutes.