Adnan Abdullah
Software Engineer
- adnan.abdullah@axelerant.com
- Phone
- 7006236487
One operational guide for the nine production P1 monitors, exact Celery queue ownership, known monitor limitations, customer-path checks, and the L1 → L2 → L3 escalation chain.
Start with L1 and move through the levels unless confirmed customer impact requires the incident lead to engage multiple levels in parallel. Record each escalation and response in the incident timeline.
Software Engineer
Director of Digital Engineering
Client Engagement Manager II
| Monitor | Datadog | Runbook |
|---|---|---|
| Datadog Agent unavailable Monitor 309498370 | Open monitor ↗ | View runbook |
| Public site unavailable Monitor 309498375 | Open monitor ↗ | View runbook |
| Required systemd service inactive Monitor 309498376 | Open monitor ↗ | View runbook |
| AWS EC2 status check failed Monitor 309498409 | Open monitor ↗ | View runbook |
| Public API healthcheck unavailable Monitor 314025561 | Open monitor ↗ | View runbook |
| Primary database storage critical Monitor 314026305 | Open monitor ↗ | View runbook |
| Primary database unavailable Monitor 314026306 | Open monitor ↗ | View runbook |
| All application instances unavailable Monitor 314025563 | Open monitor ↗ | View runbook |
| Estate-wide telemetry unavailable Monitor 314025568 | Open monitor ↗ | View runbook |
These runbooks cover the nine P1 production monitors managed by server/datadog/monitors.json. Use the runbook named in the monitor index below. Start read-only, preserve evidence, and change only the failing boundary.
host, unit, instance_id, or instance), and incident lead.| Boundary | Production resource | Primary responsibility |
|---|---|---|
| Public edge | Cloudflare in front of travel.padi.com | TLS, CDN/WAF, edge routing |
| Web host | EC2 i-00c3563dac78c97cc | Nginx, padi.service, long.service, Travel SSR/Next |
| Celery host | EC2 i-00fa9eb40442ebf69 | Queue workers, Beat, Flower |
| Main database | Aurora cluster padi-travel-covid19-aurora-cluster | Django default and long; writer padi-travel-covid19-aurora |
| Partner reader | padi-travel-covid19-aurora-r1 | Django replica; /external-api/v2/ only |
| Celery transport | ElastiCache prod-padi-travel-elastic-cache | Redis DB 0 broker, DB 1 results |
| Web-local state | Docker Redis on web host | Sessions DB 2, cacheops DB 3, Django cache DB 5 |
The public /api/v2/healthcheck/ route is a shallow Django response. Its code returns {"status":"ok"} and does not query PostgreSQL, Redis, Elasticsearch, or an external service. Treat it as edge-to-Django liveness, not dependency readiness.
The call notes describe Celery on a separate production host. The checked-in systemd definitions provide the exact queue mapping:
| Unit | Consumes/schedules | Operational meaning |
|---|---|---|
padi_celery_high.service | high | Highest-priority asynchronous work |
padi_celery_mid.service | mid,high | Mid-priority work and high-queue cover |
padi_celery_low.service | low,mid | Low-priority work and mid-queue cover |
padi_celery_crowdin.service | crowdin | Translation synchronization |
padi_celery_beat.service | Scheduler | Periodic work, including availability/pricing jobs |
padi_celery_flower.service | Flower on port 5555 | Worker visibility; not a queue consumer |
Legacy unit names without the padi_ prefix may also exist. Use the exact unit tag from Datadog and systemctl list-units '*celery*' on the Celery host before acting. A stopped worker does not justify restarting every worker: the overlap above may keep a queue moving, and a poison/retry loop must be diagnosed before capacity is restored.
Set these in the operator shell; do not put credentials into command history:
export AWS_PROFILE=diviac
export AWS_REGION=us-west-2
Check the two production instances:
aws ec2 describe-instance-status \
--include-all-instances \
--instance-ids i-00c3563dac78c97cc i-00fa9eb40442ebf69 \
--query 'InstanceStatuses[].{id:InstanceId,state:InstanceState.Name,instance:InstanceStatus.Status,system:SystemStatus.Status,events:Events}'
Check the main database without changing it:
aws rds describe-db-clusters \
--db-cluster-identifier padi-travel-covid19-aurora-cluster \
--query 'DBClusters[0].{status:Status,members:DBClusterMembers,pending:PendingModifiedValues}'
Run host commands through the approved production access path. The first pass should be limited to systemctl status, systemctl is-active, journalctl, datadog-agent health, socket/listener checks, and bounded curl requests.
documents/infrastructure.md, documents/AWS.md, server/datadog-agent.sh, server/datadog-application.sh, and checked-in systemd templates.Monitor: Datadog Agent unavailable
One production host has stopped reporting datadog.agent.up. Host metrics, logs, traces, process data, and systemd checks from that host may be missing. The application may still be serving customers normally.
host group and determine whether it is the web host (i-00c3563dac78c97cc) or Celery host (i-00fa9eb40442ebf69).On only the affected host, capture:
systemctl is-active datadog-agent.service
systemctl status datadog-agent.service --no-pager
datadog-agent health
journalctl -u datadog-agent.service --since '-30 minutes' --no-pager
ss -lntp | grep -E ':(8126|8125)\b'
df -h
df -i
Check for a recent Agent/package/config deployment, invalid YAML, intake/DNS errors, exhausted disk/inodes, or an EC2/network event. Do not expose Agent keys or dump the complete rendered configuration into the incident channel.
datadog-agent.service.server/datadog-agent.sh and the managed deployment path; do not hand-edit /etc/datadog-agent as the fix.Verify Agent health, port 8126, current host metrics, a new journal event or trace, systemd checks, and monitor recovery. Keep the incident open if customer checks fail after telemetry returns.
Monitor: Public site unavailable
The host-based HTTPS check cannot complete an end-to-end request to https://travel.padi.com/. The failing boundary may be DNS/TLS, Cloudflare, Nginx, Django/SSR, or the static asset path.
/api/v2/healthcheck/. If the API succeeds, focus on frontend/SSR/static delivery. If both fail, continue edge-to-origin.curl -sS -o /dev/null -D - -w 'status=%{http_code} total=%{time_total}\n' https://travel.padi.com/
curl -sS -o /dev/null -D - -w 'status=%{http_code} total=%{time_total}\n' https://travel.padi.com/api/v2/healthcheck/
systemctl status nginx, nginx -t, the recent Nginx journal, and bounded access/error-log evidence.padi.service, Travel SSR/Next units, listeners 7000 and the deployed version. Do not restart every service together.collectstatic or artifact publication. Restarting Django will not repair it.Verify homepage and healthcheck through edge, representative static chunks, SSR/navigation, current deployment version, Nginx/application stability, and no new 5xx spike. Record whether the fault was edge, origin, app, or static assets.
Monitor: Required systemd service inactive
A monitored production unit has repeatedly reported a non-active state. Impact depends on the Datadog host and unit group. Do not treat Flower, a queue worker, Nginx, and padi.service as equivalent failures.
host and unit tags from the alert.padi_celery_high consumes high; padi_celery_mid consumes mid,high; padi_celery_low consumes low,mid; padi_celery_crowdin consumes crowdin; padi_celery_beat schedules periodic work; and padi_celery_flower provides visibility on port 5555 but does not consume a queue.systemctl is-active UNIT.service
systemctl status UNIT.service --no-pager
journalctl -u UNIT.service --since '-45 minutes' --no-pager
systemctl show UNIT.service -p ActiveState -p SubState -p Result -p ExecMainStatus -p NRestarts
systemctl list-units '*celery*' --all
Check the unit's last deployment/config change, dependency availability, exit status, restart loop, listener, disk/inodes, memory pressure, and EC2 events. For Celery, use Flower/APM/logs to inspect queue throughput, failing task names, retries, and oldest work. Do not infer a safe restart from queue depth alone.
restart '*celery*' or restart web and Celery together.Verify active/running, listener or queue throughput, no restart loop, recovered customer/operator flow, and Datadog recovery for the original host,unit group.
Monitor: AWS EC2 status check failed
AWS reports an instance-level or system-level status-check failure on a tagged PADI Travel instance. The web host and Celery host have different customer impact; identify the instance before application remediation.
instance_id from Datadog. The production web host is i-00c3563dac78c97cc; the production Celery host is i-00fa9eb40442ebf69.aws ec2 describe-instance-status \
--include-all-instances \
--instance-ids INSTANCE_ID \
--query 'InstanceStatuses[0].{state:InstanceState.Name,instance:InstanceStatus,system:SystemStatus,events:Events}'
Require both AWS checks healthy, instance reachability, required units stable, Datadog telemetry restored, customer/queue smoke checks, and no scheduled event.
Monitor: Public API healthcheck unavailable
The external check cannot receive a successful response from https://travel.padi.com/api/v2/healthcheck/. The endpoint is shallow Django liveness only; its implementation returns {"status":"ok"} without touching PostgreSQL, Redis, Elasticsearch, or external APIs.
padi.service, EC2, Agent, and estate telemetry monitors. Do not declare a database incident from this signal alone.curl -sS -D - https://travel.padi.com/api/v2/healthcheck/ -o /tmp/travel-healthcheck-body
padi.service, port 7000, recent journal errors, deployed version, and a bounded local request through Nginx with the production host header.padi.service alone is stopped, preserve evidence and restart only that unit after approval and dependency checks.Require the exact JSON response through edge and origin, stable padi.service, representative read-only API/browser requests, no related 5xx spike, and monitor recovery. Record that this proves liveness, not full dependency readiness.
Monitor: Primary database storage critical
The monitor currently queries aws.rds.free_storage_space for dbinstanceidentifier:diviac-logbook. Live AWS inventory confirms that this is a separate 100 GiB PostgreSQL instance. The Django production configuration and infrastructure notes identify Aurora cluster padi-travel-covid19-aurora-cluster as the primary application database.
Therefore this alert does not currently prove that primary application database storage is critical. Correct the monitor separately; do not perform an Aurora storage change solely because this monitor fires.
dbinstanceidentifier and distinguish No Data from an actual threshold breach.diviac-logbook instance.aws rds describe-db-instances \
--db-instance-identifier diviac-logbook \
--query 'DBInstances[0].{status:DBInstanceStatus,storage:AllocatedStorage,pending:PendingModifiedValues}'
aws rds describe-db-clusters \
--db-cluster-identifier padi-travel-covid19-aurora-cluster \
--query 'DBClusters[0].{status:Status,members:DBClusterMembers}'
diviac-logbook genuinely needs capacity, obtain its owner and DBA approval for the supported RDS storage change and rollback/risk plan.Verify the exact instance metric recovers with safe headroom, pending changes finish, owning workload is healthy, and the monitor is corrected or renamed so future responders are not directed to the wrong database.
Monitor: Primary database unavailable
The monitor targets dbinstanceidentifier:diviac-logbook, not the Aurora cluster used by Django default and long. It also treats fewer than one connection for 15 minutes as unavailability; an idle database can legitimately have zero connections. This signal alone is insufficient for a P1 primary-database outage.
diviac-logbook separately and determine its owning workload.aws rds describe-db-instances \
--db-instance-identifier diviac-logbook \
--query 'DBInstances[0].{status:DBInstanceStatus,pending:PendingModifiedValues}'
aws rds describe-db-clusters \
--db-cluster-identifier padi-travel-covid19-aurora-cluster \
--query 'DBClusters[0].{status:Status,writer:DBClusterMembers[?IsClusterWriter==`true`].DBInstanceIdentifier,events:PendingModifiedValues}'
Inspect RDS events, failover state, writer/reader roles, connections, latency, locks, CPU/memory, storage/I/O, security-group/network changes, and recent schema or deployment changes. Correlate with padi.service logs and representative read-only application requests. Do not use the shallow healthcheck as proof of database health.
Verify Aurora writer/reader status, application queries, error/latency trend, booking-safe read paths, and monitor correction. Do not close merely because diviac-logbook reports a connection.
Monitor: All application instances unavailable
No production host is reporting systemd uptime for padi.service, the main Django Gunicorn application on the web host. This may mean the unit is down or the metric is missing; correlate with Agent/telemetry before declaring outage.
systemctl is-active padi.service
systemctl status padi.service --no-pager
systemctl show padi.service -p ActiveState -p SubState -p Result -p ExecMainStatus -p NRestarts
journalctl -u padi.service --since '-45 minutes' --no-pager
ss -lntp | grep -E ':7000\b'
Check memory pressure/OOM, configuration or secret lookup failures, database connectivity, port conflicts, migrations, disk/inodes, and release mismatch. The call notes document a partial OOM deployment; compare code, static assets, and service version rather than assuming a clean release.
padi.service is stopped, preserve evidence and confirm dependencies. Then obtain incident-lead approval to restart only padi.service.Require stable unit state and restart count, listener 7000, local and edge healthcheck, representative customer/API flows, current telemetry, and no new Gunicorn/Nginx/database error spike.
Monitor: Estate-wide telemetry unavailable
Neither production host is reporting datadog.agent.running. Datadog may be blind across the web and Celery estates. This can be two host failures, a shared Agent/config/intake/network failure, or a tag/query problem. Customer traffic and queues may still be healthy.
On each host:
systemctl is-active datadog-agent.service
systemctl status datadog-agent.service --no-pager
datadog-agent health
journalctl -u datadog-agent.service --since '-45 minutes' --no-pager
datadog.agent.running absent while other telemetry is present: treat as a monitor/query/instrumentation defect, not an estate outage.Require current Agent-running metrics from both hosts, logs/traces/systemd data, healthy public checks, observable Celery workers/queues, and monitor recovery. Record the telemetry gap so later incident analysis does not treat it as zero traffic or zero errors.