On-Call Playbook#
"Sağlıklı on-call: 7 gün boyunca rotation'da olduğunda 2 kez bile uyanmadıysan, ve uyandığın zaman runbook 5 dk'da çözüm verdiyse — sistemi mühendislik etmişsin demektir."
🎯 On-Call'un amacı (gerçekten)#
- Customer-impacting sorunları hızlı kapat
- "Hero culture" değil — sürdürülebilir rotation
- Sürekli iyileştirme: her uyandığın alert post-mortem'e ya da runbook'a
- Kıdem/seniority test alanı değil — herkes katılır
👥 Roller#
Primary On-Call (1 kişi)#
- Tüm alert'leri ilk yanıtlar
- 7 gün rotation, weekend dahil
- Telefon + Slack erişilebilir
- 15 dk içinde acknowledge
Secondary On-Call (1 kişi)#
- Primary cevaplamazsa devreye girer
- Primary süreklenirse paylaş
- Eskalasyon sahibinin yedeği
Incident Commander (gerektiğinde)#
- SEV-1 / SEV-2'de Primary IC olur
- Komut zincirini kontrol eder
- Comms lead'i atar
- Decision-maker (rollback / failover / wait)
Comms Lead (gerektiğinde)#
- Status page güncelleme
- Customer-facing channel
- Internal stakeholder update
📅 Rotation tasarımı#
Boyut#
- 4-8 kişi ideal (6 önerilen)
- < 4: burnout riski
-
8: rotation çok seyrek, beceri körelir
Süre#
- 7 gün rotation (Pazartesi-Pazartesi)
- Bazı ekipler 3-4 gün böler — hafta sonu ayrı
- Daily rotation çok yorucu (context yok)
Adil dağıtım#
- PagerDuty / Opsgenie ile auto-rotation
- Tatil/izin override
- Senior + junior pair (ilk ay)
Compensation#
- Standby pay (bazı ülkelerde yasal)
- Page-time pay (uyandırılınca extra)
- Comp-day (uykusuz geçen gece için ertesi gün izin)
- 🚫 "Kahramanlığın ödülü" değil — herkesin hakkı
🔔 Alert hijyeni#
Sağlıklı alert tabi#
- Actionable — "şu komutla düzelt"
- Customer-impacting — gerçek bir kullanıcı sorun yaşıyor
- Urgent — ertesi sabaha kadar bekleyemez
"Ticket" yapmalı, "page" yapmamalı#
- "Disk %75 dolu" — page değil, ticket
- "1 pod restart oldu" — log, ne page ne ticket
- "Cron job yarın çalışmadı" — ticket
Severity tier#
| Sev | Tanım | Bildirim |
|---|---|---|
| SEV-1 | Customer impact, revenue down | PagerDuty (call + push) |
| SEV-2 | Major feature broken, subset etkilenir | PagerDuty (push) |
| SEV-3 | Minor, workaround var | Slack #alerts |
| SEV-4 | Cosmetic | Ticket queue |
Alert audit (haftalık)#
Her hafta on-call shift sonunda: - Hangi alert'ler tetiklendi? - Kaçı gerçek incident'tı? Kaçı false positive? - Her false positive → eşik ayarlanmalı veya alert silinmeli - Yeni alert eklendi mi? Niye?
🎯 Hedef: rotation'da < 5 page ortalama. Üzeri → reliability yatırımı.
📞 Pager response protokolü#
0-2 dakika: Acknowledge#
2-5 dakika: Triage#
5-15 dakika: Mitigate#
7. Önce mitigate (rollback / failover / circuit-break)
8. Sonra investigate
9. SEV-1 ise: incident commander rolü, comms lead ata
10. Sec/yapı genişliyorsa: senior'ı paged et
15+ dakika: Communicate#
11. Status page güncelle
12. Internal update her 30 dk
13. Customer impact varsa marketing/CS'i bilgilendir
Resolution#
14. Mitigation doğrulandı (metrics yeşil)
15. Customer-facing all-clear
16. Incident channel kapatma
17. Postmortem ticket aç (24 saat içinde draft)
📚 Runbook standardı#
Tam template:
17-Templates/runbooks/runbook-template.md
Her alert'in mutlaka runbook'u olmalı: - Alert tetiklendiğinde ilk 60 saniyede ne kontrol edilir - Olası sebepler + her birinin çözüm komutu - Eskalasyon: ne zaman kim'e
Runbook olmadan gelen alert = sebepsiz uyandırma.
🔄 Devir-teslim (handoff)#
Shift sonu / başı önemli ritüel.
Outgoing on-call yazar:#
## Geçen hafta özet — payment-api on-call
- 3 page (1 SEV-2, 2 SEV-3)
- 1 incident (INC-1234) — postmortem yarın
- Açık issue'lar:
- DB replica lag yüksek (ticket #5678) — gözlemde
- Memory leak şüphesi (ticket #5689) — staging'de repro çalışılıyor
- Bu hafta deploy planlanan: v3.5.0 (Çar)
## Incoming için notlar
- v3.5.0 deploy'u canary için 30 dk gözleyin (PR'da issue var)
- payment-db-replica-2 hâlâ kararsız, fail olursa bunu kullanın: <runbook>
30 dk overlap (ideal)#
- Incoming + outgoing 30 dk birlikte
- Açık konular sözle anlatılır
- Slack özet kanaldan paylaşılır
🧠 Burnout işaretleri (ekibinde gör)#
- ❗ Aynı kişi sürekli "extra" shift alıyor
- ❗ Page geliyor ama acknowledge yavaş ya da skip
- ❗ Postmortem yazma istemiyorlar
- ❗ "Bu alert'i mute edelim" dediler ama kapatmadılar
- ❗ Senior ekipten ayrılma talebi
Bunlardan herhangi biri = acil platform yatırımı veya rotation büyütme sinyali.
⚙️ Tooling#
- PagerDuty — endüstri standart, en zengin
- Opsgenie — Atlassian, ucuz alternatif
- Grafana OnCall — open source, K8s-native
- incident.io / FireHydrant / Rootly — incident management (Slack-bot integration)
- Statuspage.io / Cachet — public status page
🎓 Onboarding (yeni mühendisler için)#
Bir mühendisin "production-ready on-call" olması için:
| Hafta | Aktivite |
|---|---|
| 1 | Architecture overview, runbook'ları oku |
| 2 | Senior'la shadow shift (yanında dur, sorumluluk yok) |
| 3 | Reverse shadow (kendisi tutar, senior izler) |
| 4 | Solo primary (secondary tecrübeli) |
Mock incident drill (game day) yapmak da değerli — gerçek olmayan ama gerçekçi senaryolarla pratik.
✅ Sağlıklı on-call kültür sinyalleri#
- 🟢 Junior yeni mühendis 4 hafta sonra rahat solo gidiyor
- 🟢 Page sayısı stabil veya azalıyor (her postmortem fix'i ile)
- 🟢 Postmortem aksiyon item'larının > %70'i kapatılıyor
- 🟢 "Bu alert'i kapatalım, gerçek değil" dediğinde kabul edilir
- 🟢 On-call shift sonunda comp-day veriliyor
📚 Devamı#
- Google SRE Book — Chapter 11: Being On-Call
- Seeking SRE — David N. Blank-Edelman (kitap)
- PagerDuty Incident Response docs
17-Templates/runbooks/— runbook + postmortem template