Skip to content

RDS Metrics Reference ​

DB Optimizer collects the following CloudWatch metrics for every registered RDS instance, at a 60-second period aligned to minute boundaries.

Common metrics (all engines) ​

MetricStatisticUnitDescription
CPUUtilizationAveragePercentCPU usage of the DB instance
FreeableMemoryMinimumBytesAvailable RAM including reclaimable page cache
DatabaseConnectionsAverageCountActive client connections
ReadIOPSAverageCount/secRead I/O operations per second
WriteIOPSAverageCount/secWrite I/O operations per second
ReadLatencyAverageSecondsAverage time per read I/O
WriteLatencyAverageSecondsAverage time per write I/O
DiskQueueDepthAverageCountOutstanding I/O requests waiting
FreeStorageSpaceMinimumBytesAvailable storage on the instance
ReplicaLagMaximumSecondsReplication delay (replicas only)
SwapUsageMaximumBytesSwap space in use

That table is the whole set

Eleven metrics, requested identically for every engine. There are no PostgreSQL-specific, MySQL-specific or Aurora-specific requests — no MaximumUsedTransactionIDs, BinLogDiskUsage, AuroraReplicaLag, FreeLocalStorage or Volume* metric is collected. The engine recorded on the instance selects one of exactly two branches (mysql,postgres for RDS, redis,valkey for ElastiCache), not a per-engine metric list.

Dimensions ​

DBInstanceIdentifier only.

Scrape interval ​

The default scrape interval is 300 seconds (5 minutes). At this interval, each poll requests 5 minutes of 60-second datapoints — the same resolution as a 60-second interval but at one fifth the CloudWatch API cost.

DB_OPTIMIZER_SCRAPE_INTERVAL is enforced at 300 to 3600 seconds. A value outside that range fails core's startup with an error rather than being clamped, and there is no override.

Data retention ​

RDS metrics are retained for 15 days, the same as raw node and pod metrics. There is no longer-term rollup for them.

Null handling ​

If CloudWatch returns no datapoint for a metric in a period, no row is stored and the API reports that metric as null. A measured value of 0 is stored and reported as 0. The console renders null as an em dash (—) and 0 as a zero — two visually distinct states so "not measured" is never mistaken for "measured and idle".

Every figure in KubeSpend traces to a real cloud price. Where we cannot measure something, we say so.