AWS RDS Monitoring: The Complete 2026 Guide
Monitor AWS RDS properly — CloudWatch vs Enhanced Monitoring vs Performance Insights, the metrics and alarms that matter, slow query setup, and cost traps.
Short answer: RDS monitoring has three native layers, and you need all three: CloudWatch metrics (60-second, free-ish, host-level basics), Enhanced Monitoring (1–60s granularity, OS-level, billed as CloudWatch Logs), and Performance Insights (query-level waits — the tool that answers "why is the database slow"). On top of those: enable slow query logs to CloudWatch, and set alarms on the seven metrics that predict outages — CPU, freeable memory, free storage, disk queue depth, replica lag, and connection counts. This guide maps each layer, gives the alarm set, and flags the cost traps (CloudWatch's per-metric pricing compounds).
The three layers and what each is for
| Layer | Granularity | Answers | Cost model |
|---|---|---|---|
| CloudWatch metrics | 60 s (standard) | Is the instance healthy? CPU/mem/storage/connections | Per-metric + alarms (see CloudWatch pricing) |
| Enhanced Monitoring (EM) | 1–60 s | Which process is eating the box? OS-level detail | Published to CloudWatch Logs → ingest+storage charges |
| Performance Insights (PI) | 1 s (dashboard), per-query | Why is the DB slow? Top SQL by wait | Free: 7-day retention; long-term retention billed |
The division of labor: CloudWatch alarms wake you up; Enhanced Monitoring tells you if it's the database or the OS; Performance Insights tells you which query. Teams that enable only the first layer get paged with no diagnosis path.
The 7 CloudWatch metrics that predict RDS outages
| Metric | Alarm at | Why |
|---|---|---|
CPUUtilization |
> 85% for 10 min | Saturation; check PI before resizing |
FreeableMemory |
< 20% of instance RAM | Swap incoming (SwapUsage confirms) |
FreeStorageSpace |
< 15% | Autoscaling storage off = outage; logs/temp tables grow silently |
DiskQueueDepth |
sustained > 10 | I/O bound; gp3 IOPS headroom check |
DatabaseConnections |
> 80% of max | Connection storm (app pool × replicas) |
ReadReplicaLag |
> 30 s | Stale reads in your app |
WriteLatency/ReadLatency p99 drift |
2× baseline | Early degradation signal |
Alarms cost $0.10 each (standard) in CloudWatch — a dozen alarms per instance is pocket change; the compounding cost lives in custom metrics and logs, not alarms.
Related guideMySQL Monitoring: The Complete 2026 Guide→
Performance Insights: your first stop for "database is slow"
PI samples pg_stat_activity/performance_schema continuously and renders average active sessions by wait event, SQL, host, and user. The workflow that solves 90% of RDS slowness:
- Dashboard shows load (AAS) spiking above the
Max CPUline → instance is saturated. - Slice by Waits:
IO:DataFileRead= cache miss storm;Lockwaits = blocking transactions;CPU= genuine compute ceiling. - Slice by SQL: the top statement by load is your culprit.
- Copy the digest, run
EXPLAIN (ANALYZE, BUFFERS)against a replica, fix index or query.
Enable PI at instance creation (one checkbox); the 7-day free retention covers incident windows. Long-term PI retention exists for trend analysis but is billed — decide deliberately.
Slow query logs to CloudWatch (or anywhere useful)
# Parameter group settings (PostgreSQL shown; MySQL analogous with slow_query_log=1, long_query_time=1)
log_min_duration_statement = 1000 # ms — start at 1s, tighten on hot paths
log_statement = 'none'
# Enable log export in the console: instance → Logs → PostgreSQL log → publish to CloudWatch
Now slow queries are searchable via Logs Insights — but remember the triple billing from our CloudWatch pricing guide: ingest + storage + scan. Set a retention policy on the log group (30 days for ops), and if log volume is heavy, evaluate exporting to S3 + Athena instead. Guance and other platforms can also collect RDS logs/metrics into the same console as your APM traces — the correlation from "slow endpoint" to "this exact SQL" is what turns a 2-hour incident into a 10-minute one.
Enhanced Monitoring: when to enable
EM's unique value is per-process OS metrics: when CPUUtilization is 90%, EM tells you whether it's Postgres backends, the WAL writer, or an OS process. That distinction decides whether you tune queries or resize. Costs: EM publishes JSON to CloudWatch Logs at your chosen interval — at 1s granularity this is meaningful ingest volume; 15–60s is the sane default. Alternative: skip EM and use PI's OS metrics tab, which covers the common cases without the log-volume bill.
Related guideMySQL Integration→
The 5 RDS failure paths (and their alarms)
- Storage exhaustion.
FreeStorageSpace→ 0 halts writes. Prevention: storage autoscaling enabled + alarm at 15%. The alarm without autoscaling buys you hours, not safety. - Connection storm. Deploy multiplies app instances; each pool opens N connections;
DatabaseConnectionshitsmax_connections; new connections refused. Alarm at 80%; fix with RDS Proxy or PgBouncer. - Replica lag surprise. Read-heavy feature launches against a lagging replica; users see stale data; no alarm fired because lag wasn't monitored per-replica. Alarm per-replica at 30 s.
- IOPS ceiling. gp3 baseline IOPS silently exceeded;
DiskQueueDepthclimbs; latency doubles. Alarm on queue depth + latency drift. - Log-volume bill shock. Slow log + EM at 1 s granularity on a busy instance → CloudWatch Logs ingest dwarfs the RDS bill. Review log-group bytes monthly.
FAQ
Q: How do I monitor AWS RDS?
Enable three layers: CloudWatch metrics with alarms on CPU, freeable memory, free storage, disk queue depth, connections, replica lag, and latency; Performance Insights (free 7-day tier) for query-level waits; and slow query logs exported to CloudWatch with a 30-day retention policy. Add Enhanced Monitoring at 15–60 s granularity when you need per-process OS detail.
Q: What is the difference between Enhanced Monitoring and Performance Insights?
Enhanced Monitoring shows the operating system (per-process CPU/memory) at up to 1-second granularity, delivered via CloudWatch Logs (billed as log volume). Performance Insights shows database load — which SQL statements and wait events consume capacity. "Which process is using the box" = EM; "which query is making it slow" = PI.
Q: Is Performance Insights free?
The 7-day retention tier is free and covers incident analysis. Long-term retention (up to 2 years) is billed monthly per vCPU. Enable PI on every production instance — there is no reason not to use the free tier.
Q: Which RDS alarms should every team set?
Seven: CPU > 85%, FreeableMemory < 20%, FreeStorageSpace < 15%, DiskQueueDepth > 10, DatabaseConnections > 80% of max, ReadReplicaLag > 30 s (per replica), and read/write latency at 2× your baseline. At $0.10 per standard alarm, this set costs under a dollar per instance per month.
Q: Can I monitor RDS with tools other than CloudWatch?
Yes. Datadog, New Relic, Grafana Cloud, and Guance all collect RDS metrics via the CloudWatch API (watch the $0.01/1,000 API request cost at high poll rates) and can additionally poll pg_stat_statements/performance_schema directly for query-level data. The advantage over native CloudWatch: correlation with your APM traces and a single console; the trade-off: another meter to govern.
Sources: AWS RDS and CloudWatch documentation (metric definitions, PI retention tiers, EM delivery), CloudWatch pricing (verified in our CloudWatch pricing guide). Verified 2026-08-07. Published by Guance.
Contact us
Join the community
to join the community
Try Guance
Start online and pay only for what you use.
Get startedChoose a Guance plan