Incident Management — Správa incidentov
Incident management je proces detekcie, reakcie, riešenia a učenia sa z výpadkov a degradácií produkčných systémov. Dobre nastavený proces je rozdiel medzi 5-minútovým fixom a celodenným chaosom.
Čo je incident?
Incident je neplánované prerušenie alebo degradácia služby, ktorá ovplyvňuje používateľov. Nie každý bug je incident — incident vyžaduje okamžitú reakciu.
Klasifikácia incidentov
| Severita | Popis | Response time | Príklad |
|---|---|---|---|
| P1 (Critical) | Služba úplne nefunkčná | < 5 min | Production down, data loss |
| P2 (Major) | Výrazná degradácia | < 15 min | 50% error rate, checkout nefunguje |
| P3 (Minor) | Čiastočná degradácia | < 1 hodina | Pomalé odpovede, minor feature down |
| P4 (Low) | Minimálny dopad | Najbližší business day | Kozmetický bug, edge case |
SLA, SLO a SLI
Tieto tri koncepty tvoria základ spoľahlivosti služieb:
SLI — Service Level Indicator
Čo meriame. Konkrétna metrika, ktorá vyjadruje kvalitu služby:
SLI = (úspešné requesty / celkové requesty) × 100
Príklady SLI:
• Dostupnosť: % úspešných HTTP responses (non-5xx)
• Latencia: % requestov pod 200ms
• Throughput: requesty za sekundu
• Error rate: % chybových odpovedí
SLO — Service Level Objective
Čo chceme dosiahnuť. Interný cieľ pre SLI:
SLO príklady:
• Dostupnosť: 99.9% za 30 dní (max 43.8 min downtime/mesiac)
• Latencia: 95% requestov pod 200ms, 99% pod 500ms
• Error rate: < 0.1% za 7 dní
SLA — Service Level Agreement
Čo sľubujeme zákazníkovi. Právne záväzný dokument s následkami:
SLA: 99.9% monthly uptime
Breach: < 99.9% → 10% kredit
< 99.0% → 25% kredit
< 95.0% → 50% kredit
Error Budget
Error budget je rozdiel medzi 100 % a SLO. Ak je SLO 99.9 %, error budget je 0.1 % (43.8 min/mesiac).
Error budget = 1 - SLO
99.9% SLO = 43.8 min downtime/mesiac
99.95% SLO = 21.9 min downtime/mesiac
99.99% SLO = 4.3 min downtime/mesiac
Keď je error budget vyčerpaný:
→ STOP deploymenty
→ Fokus na stabilitu
→ Žiadne nové features kým sa budget neobnoví
On-Call
On-call je rotácia, kde člen tímu je zodpovedný za reakciu na incidenty mimo pracovnej doby.
On-call best practices
# PagerDuty schedule príklad
schedule:
name: "Backend On-Call"
rotation:
type: weekly
start: Monday 09:00
participants:
- peter
- jana
- martin
- lucia
escalation_policy:
- level: 1
timeout: 5min
targets: [current_on_call]
- level: 2
timeout: 10min
targets: [team_lead]
- level: 3
timeout: 15min
targets: [engineering_manager]
On-call kompenzácia a zdravie
- Kompenzácia — on-call musí byť kompenzovaný (peniaze alebo voľno)
- Max. frekvencia — nie viac ako 1 z 4 týždňov
- Follow-the-sun — pri globálnych tímoch rotácia podľa časových zón
- Handoff — štrukturovaný odovzdávaní zmeny s kontextom
- No-blame — nikdy netrestajte on-call za eskaláciu
Runbooks
Runbook je dokumentovaný postup pre riešenie známych problémov. Znižuje MTTR a umožňuje aj juniorným členom riešiť incidenty.
Štruktúra runbook-u
# Runbook: High Database CPU
## Symptómy
- Alert: `DatabaseCPUHigh` (CPU > 80% po 5 minút)
- Pomalé API odpovede (p99 > 2s)
- Grafana dashboard: Database Performance
## Diagnostika
1. Skontroluj slow queries:
```sql
SELECT pid, now() - pg_stat_activity.query_start AS duration,
query, state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 seconds'
ORDER BY duration DESC;
Skontroluj počet spojení:
SELECT count(*) FROM pg_stat_activity;Skontroluj running migrations:
kubectl logs -l app=migration-job --tail=50
Riešenie
Quick fix
- Zabite dlhé queries:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE duration > interval '30 seconds' AND state = 'active';
Ak nepomôže
- Škálujte read replicas:
kubectl scale deploy/db-reader --replicas=3 - Eskalujte na DBA team (#dba-team)
Eskalácia
- Ak problém trvá > 15 min → eskalujte na P2
- Ak database je úplne nereachable → P1
## **Incident Response Process**
### 1. Detekcia
Monitoring → Alert → PagerDuty → On-call notifikácia │ ┌─────┴──────┐ │ Acknowledge │ │ (< 5 min) │ └─────┬──────┘ ▼ Začni response
### 2. Triage a komunikácia
```bash
# Vytvorenie incident channelu
/incident create "Payment processing failures" --severity P1
# V incident channeli:
# - Incident Commander (IC) — koordinuje
# - Tech Lead — diagnostikuje a opravuje
# - Communications Lead — informuje stakeholderov
3. Mitigation
Priorita je obnoviť službu, nie nájsť root cause:
- Rollback posledného deploymentu
- Reštart služby
- Škálovanie zdrojov
- Failover na backup
4. Resolution a follow-up
Po obnovení služby:
- ✅ Potvrdiť že služba je stabilná (monitorovať 30 min)
- 📝 Zapísať timeline do incident dokumentu
- 📅 Naplánovať postmortem (do 48 hodín)
- 🔔 Informovať stakeholderov o resolution
Postmortems
Postmortem (tiež retrospektíva) je blameless analýza incidentu. Cieľ nie je nájsť vinníka, ale zlepšiť systém.
Postmortem šablóna
# Postmortem: Payment Service Outage
**Dátum:** 2026-03-14
**Severita:** P1
**Trvanie:** 47 minút (14:23 - 15:10 UTC)
**Impact:** 100% payment failures, ~2300 affected transactions
## Sumár
Deployment novej verzie payment-service obsahoval bug v connection
pooling, ktorý spôsobil exhaustion DB spojení po 15 min.
## Timeline
- 14:08 — Deploy payment-service v2.3.1
- 14:23 — Alert: Payment error rate > 5%
- 14:25 — On-call acknowledged, začal diagnostiku
- 14:32 — Identifikovaný connection pool exhaustion
- 14:35 — Rozhodnutie: rollback na v2.3.0
- 14:38 — Rollback spustený
- 14:42 — Rollback dokončený, error rate klesá
- 15:10 — Služba stabilná, incident resolved
## Root Cause
Connection pool v novej verzii nemal nastavený `maxLifetime`,
čo spôsobilo leak spojení pri DB failover.
## Čo fungovalo
- Alert sa spustil do 15 min
- Rollback bol rýchly (< 10 min)
- Incident communication bola jasná
## Čo nefungovalo
- Chýbal integration test pre connection pooling
- Canary deployment by zachytil problém skôr
- Runbook pre DB connection issues neexistoval
## Action Items
| # | Akcia | Vlastník | Deadline |
|---|-------|----------|----------|
| 1 | Pridať integration test pre connection pool | Peter | 2026-03-21 |
| 2 | Nastaviť canary deployment pre payment-service | Jana | 2026-03-28 |
| 3 | Napísať runbook pre DB connection issues | Martin | 2026-03-21 |
| 4 | Pridať maxLifetime do všetkých connection pools | Lucia | 2026-03-18 |
## Lessons Learned
- Connection pool konfigurácia je kritická a musí byť testovaná
- Canary deploymenty by zachytili problém pri 5% trafficu
Blameless kultúra
- Nikdy nepýtajte "kto to pokazil?"
- Vždy pýtajte "čo zlyhalo v systéme?"
- Ľudia robia chyby — systém by ich mal zachytiť
- Trest za chyby vedie k skrývaniu problémov
Nástroje
| Kategória | Nástroje |
|---|---|
| On-call management | PagerDuty, OpsGenie, VictorOps |
| Incident tracking | Rootly, Incident.io, FireHydrant |
| Status pages | Statuspage, Cachet, Instatus |
| Communication | Slack, Microsoft Teams |
| Postmortems | Blameless, Jeli |
| Runbooks | Rundeck, Notion, Confluence |
KPI pre incident management
| Metrika | Popis | Cieľ |
|---|---|---|
| MTTA | Mean Time to Acknowledge | < 5 min |
| MTTD | Mean Time to Detect | < 5 min |
| MTTR | Mean Time to Resolve | < 1 hodina (P1) |
| MTBF | Mean Time Between Failures | Rastúci trend |
| Incident count | Počet incidentov/mesiac | Klesajúci trend |
| Action item completion | % splnených action items | > 90 % |
Best Practices
- Definujte severity levels — jasná klasifikácia od P1 po P4
- Automatizujte alerting — PagerDuty/OpsGenie pre on-call
- Píšte runbooks — pre každý opakujúci sa incident
- Blameless postmortems — po každom P1/P2 incidente
- Sledujte action items — postmortem bez akcie je zbytočný
- Precvičujte — Game Days a tabletop exercises
- Merajte a zlepšujte — MTTR, MTTA trending
Incident management nie je len o hasení požiarov — je o budovaní systémov a procesov, ktoré minimalizujú dopad výpadkov a zabezpečujú, že sa tie isté chyby neopakujú.