Incident Response
Procedure for responding to production incidents.
Severity Levels
| Level | Description | Response Time | Examples |
|---|---|---|---|
| SEV1 | Complete outage | Immediate | Site down, data loss, prod DB unreachable |
| SEV2 | Major degradation | 30 minutes | Core feature broken, visit submission failing, login broken |
| SEV3 | Minor impact | 4 hours | Slow queries, intermittent errors |
| SEV4 | Minimal impact | Next business day | Cosmetic issue, non-blocking warning |
Initial Response
Step 1: Assess and Classify
- Determine severity level
- Identify affected users/districts
- Identify affected components (HISD, mobile-api, mobile-ui, mgmt)
- Check for ongoing deployments
- Note incident start time
Step 2: Communicate
For SEV1/SEV2:
- Notify on-call team via Teams
- Create incident channel
- Post initial status update
INCIDENT: [Brief description]SEVERITY: [SEV1/2/3/4]STATUS: InvestigatingIMPACT: [Who is affected]STARTED: [Time]Step 3: Begin Investigation
- Check Application Insights for error spikes
- Review Azure Service Health for platform issues
- Check recent deployments
- Review infrastructure metrics
Investigation Checklists
Application Issues
- Check Application Insights exceptions
- Review recent code deployments
- Check application logs
- Verify configuration settings (Key Vault, app settings)
Database Issues
- Check Azure SQL metrics (DTU, connections)
- Review Query Performance Insight
- Check for blocking queries
- Verify connectivity via DNS alias
Infrastructure Issues
- Check Azure Service Health
- Review App Service metrics
- Check network connectivity / private endpoints
- Verify DNS resolution
Quick Diagnostics
# App Service statusaz webapp show --name <app> --resource-group <rg> --query "state"
# Recent App Insights exceptionsaz monitor app-insights query --app <app-insights-name> --resource-group <rg> \ --analytics-query "exceptions | where timestamp > ago(1h) | summarize count() by type"
# SQL Server connectivityaz sql db show --resource-group <rg> --server <server> --name <db> --query "status"Database Performance Diagnostics
When the database is slow or DTUs are spiking, run these queries from database/monitoring/ in order:
active-sessions.sql— What’s running right now? Shows CPU, elapsed time, current statement, blocking infodtu-resource-breakdown.sql— Is it CPU, IO, or log writes driving the DTU spike?session-details.sql— Who’s running the heavy query? Shows login name, host, programquery-store-top-consumers.sql— What’s been heaviest over the last 2 hours?blocking-chains.sql— Are sessions blocking each other?
To kill a runaway session (safe for read-only queries):
KILL <session_id>;To audit database access:
entra-access-audit.sql— Lists all Entra ID users/groups and their database roles
Mitigation
- If app issue: rollback deployment (see Rollback Procedures)
- If DB issue: swap DNS alias (see Database Failover)
- If infrastructure issue: check Azure portal /
azCLI
Resolution
Step 1: Implement Fix
- Identify root cause
- Develop fix or workaround
- Test in lower environment if possible
- Apply to production
Step 2: Verify
- Confirm fix resolved issue
- Monitor for 30 minutes after resolution
- Check related functionality
Step 3: Communicate Resolution
INCIDENT RESOLVEDDURATION: [X hours/minutes]ROOT CAUSE: [Brief explanation]FIX: [What was done]FOLLOWUP: [Any remaining actions]Post-Incident
Within 24 Hours
- Document timeline
- Identify root cause
- Create post-mortem document (see Incidents)
Within 1 Week
- Conduct post-mortem meeting
- Identify preventive measures
- Create action items
- Update runbooks if needed
Escalation Path
- On-call Engineer
- Engineering Lead
- VP Engineering
- Executive Team (SEV1 only)
Key Contacts
| Role | Contact |
|---|---|
| On-call engineer | TBD |
| Team lead | TBD |
| DBA | TBD |
See Incidents for all documented incidents and post-mortems.