This document is the operational runbook for responding to production incidents in TeachLink.
- Prometheus alerts (see
indexer/observability/prometheus/alerts.yml) - Grafana dashboards (see
indexer/observability/grafana/dashboards/) - Indexer health endpoint:
GET /health - Contract telemetry via Soroban events (indexed off-chain)
- SEV1: user-impacting outage or data integrity risk (payments/escrow/bridge stuck, indexer down)
- SEV2: degraded performance, partial feature outage, or elevated error rate
- SEV3: minor degradation, noisy alerts, or non-urgent bugs
- Identify which alert fired and the affected component (indexer, DB, Horizon, etc.).
- Confirm blast radius in Grafana: error rate, latency, event-processing lag.
- Check indexer
GET /healthfor readiness and dependency status. - If indexer is down: restart the service and verify alerts resolve.
- If DB is down: validate DB connectivity and failover/restart per infra playbook.
- If Horizon is unreachable: validate network/DNS and consider switching endpoints.
- Reduce load: disable non-critical cron/jobs, increase backoff, shed traffic at edge.
- Restore service: restart the failing service, roll back last deploy, or deploy a hotfix.
- Protect integrity: pause/disable risky flows if supported (circuit breakers / admin gates).
- Announce incident start (SEV + short symptom).
- Provide updates every 15-30 minutes for SEV1/SEV2 until resolved.
- Announce resolution + customer impact summary.
- Write a postmortem within 48 hours.
- Add/adjust alerts to catch recurrence earlier.
- Add regression tests for the root cause where applicable.