How to monitor anything in your stack
Each guide covers one technology: the specific ways it fails, the four to eight signals worth alerting on with sensible thresholds, the commands to check it by hand, and how to watch it with Vigil step by step. Pick the database, server, job runner, framework or endpoint you need to keep an eye on.
Databases and search
How to monitor PostgreSQLConnections vs max_connections, replication lag, wraparound, WAL and backups.
How to monitor MySQL and MariaDBThreads_connected, replica threads and lag, InnoDB buffer pool, binlogs on disk.
How to monitor RedisMemory vs maxmemory, evictions, failed RDB saves, replica link, hit rate.
How to monitor Elasticsearch and OpenSearchCluster status, unassigned shards, disk watermarks, JVM heap.
Web servers
Containers and Kubernetes
How to monitor Docker containersExited and restart-looping containers, OOM kills, unhealthy healthchecks, disk.
How to monitor Kubernetes nodes and podsCrashLoopBackOff, OOMKilled, NotReady nodes, memory/disk/PID pressure.
How to monitor Kubernetes CronJobsJobs that never start, hit backoffLimit, run too long or are suspended.
How to monitor systemd services and timersFailed units, hidden restart loops, start-limit-hit, timers that stop firing.
Scheduled jobs, backups and queues
How to monitor cron jobsDead man's switch for jobs that silently stop, fail, overlap or hang.
How to monitor backups (restic, borg, pg_dump)Backups that stop, fail halfway, come out empty or never get restored.
How to monitor CeleryDead or stuck workers, queue backlog, beat not running, swallowed task errors.
How to monitor SidekiqQueue size, retry and dead sets, stopped processes, failing scheduled jobs.
How to monitor RabbitMQMemory and disk alarms, ready and unacked messages, consumers, partitions.
Application frameworks
How to monitor Node.js appsEvent loop blocking, heap growth, unhandled rejections, slow routes.
How to monitor DjangoHealth view, unapplied migrations, Gunicorn timeouts, 500s, Celery.
How to monitor LaravelLaravel Health JSON, queue workers, failed_jobs, the scheduler, /up.
How to monitor Ruby on Rails/up, pending migrations, Puma, connection pool timeouts, Sidekiq.
How to monitor FastAPIBlocking calls in async endpoints, pool exhaustion, slow routes, errors.
How to monitor Next.js and Vercel sitesPages that return 200 but render broken, Web Vitals, client errors, Vercel status.
Certificates, domains and APIs
How to monitor SSL/TLS certificatesExpiry, broken chains, wrong hostnames, renewed-but-not-reloaded, weak TLS.
How to monitor domains and DNSRegistration expiry, nameserver and MX changes, SPF/DMARC, hijacks.
How to monitor REST APIs with authenticationToken flows, 200s with error bodies, schema drift, latency SLAs, rate limits.
Three rules that apply to everything
- Check from where users are. An internal metric can be green while DNS, a certificate or a proxy keeps everyone out. Pair every inside signal with an outside HTTP, TCP or browser check.
- Alert on the absence of success. Jobs, backups and queues fail by not happening. A heartbeat that expects a ping catches every cause at once; an error alert only catches the ones that raise.
- Page on symptoms, log the causes. Wake someone for “users get errors” or “backups stopped”; keep CPU spikes and single slow queries on a dashboard until they turn into a symptom.