Monitoring metrics
A reference sheet of the metrics that matter at each tier. Use it as a starting point — add the metrics that predict failure for this particular workload, and remove the ones nobody acts on.
Web tier
Elastic Load Balancer
| Metric | What it tells you |
|---|---|
RequestCount | Traffic volume; the denominator for every rate metric |
HTTPCode_ELB_4XX_Count | Requests the load balancer rejected, often malformed or unauthorised |
HTTPCode_ELB_5XX_Count | Load balancer errors; usually capacity or target health |
HTTPCode_Target_5XX_Count | Errors returned by the application |
TargetResponseTime | Time spent behind the load balancer — the user's experience |
HealthyHostCount / UnhealthyHostCount | Target availability |
ActiveConnectionCount | Connection pressure |
RejectedConnectionCount | Load balancer at connection limit |
API Gateway
| Metric | What it tells you |
|---|---|
Count | Requests handled |
4XXError | Client-side failure — auth, validation, rate limiting |
5XXError | Integration or authoriser failure |
Latency | End-to-end request time including integration |
IntegrationLatency | Time spent in the backend — latency minus this is gateway overhead |
CacheHitCount / CacheMissCount | Cache effectiveness |
CloudFront
| Metric | What it tells you |
|---|---|
Requests | Volume at the edge |
BytesDownloaded / BytesUploaded | Transfer volume and cost driver |
4xxErrorRate / 5xxErrorRate | Error rate at the edge |
CacheHitRate | Origin load and cost; a low rate points at cache policy |
OriginLatency | Time to origin when the cache misses |
Application tier
EC2
| Metric | What it tells you |
|---|---|
CPUUtilization | Compute saturation; scales with most workloads |
MemoryUtilization | Requires the CloudWatch agent; often the real constraint |
DiskReadOps / DiskWriteOps | I/O pressure |
NetworkIn / NetworkOut | Traffic and potential cost |
StatusCheckFailed | Instance or host failure |
Auto Scaling
| Metric | What it tells you |
|---|---|
GroupDesiredCapacity | Intended capacity |
GroupInServiceInstances | Capacity actually available |
GroupOutOfServiceInstances | Capacity lost to health failures |
GroupPendingInstances | Capacity not yet ready — a scaling lag signal |
Lambda
| Metric | What it tells you |
|---|---|
Invocations | Volume |
Duration | Execution time; the cost driver alongside memory |
Errors | Handler failures |
Throttles | Concurrency limit reached — requests are being dropped |
ConcurrentExecutions | Account and function pool pressure |
IteratorAge | Consumer is falling behind a stream |
DeadLetterErrors | Failed delivery to a DLQ |
ElastiCache
| Metric | What it tells you |
|---|---|
CurrConnections | Connection pool health |
CacheHits / CacheMisses | Cache effectiveness |
Evictions | Memory pressure causing silent data loss |
CPUUtilization | Node saturation |
MemoryUsage / MemoryFree | Headroom |
ReplicationLag | Read replica freshness |
EKS
| Metric | What it tells you |
|---|---|
pod_cpu_utilization | Pod CPU relative to request |
pod_memory_utilization | Pod memory relative to limit |
pod_number_of_container_restarts | Crash loop or OOM kill |
kube_pod_status_phase | Pending, Running, Failed |
kube_deployment_status_replicas_available | Serving replicas |
kube_deployment_status_replicas_unavailable | Deployment health |
node_filesystem_avail_bytes | Disk pressure |
kube_job_failed | Batch failure |
Database tier
RDS
| Metric | What it tells you |
|---|---|
CPUUtilization | Instance saturation |
FreeStorageSpace | Storage exhaustion risk |
DatabaseConnections | Connection pool pressure |
ReadIOPS / WriteIOPS | I/O load against provisioned capacity |
ReadLatency / WriteLatency | Storage-level performance |
DatabaseLoad | Active sessions — the most useful single RDS metric |
ReplicaLag | Read replica staleness |
FreeableMemory | Memory pressure |
BurstBalance | Burst-capable volume exhaustion |
DynamoDB
| Metric | What it tells you |
|---|---|
ConsumedReadCapacityUnits / ConsumedWriteCapacityUnits | Throughput used |
ReadThrottleEvents / WriteThrottleEvents | Requests rejected for capacity |
ThrottledRequests | Combined throttle signal |
SuccessfulRequestLatency | User-facing latency |
SystemErrors | Service-side failures |
Aurora
| Metric | What it tells you |
|---|---|
AuroraReplicaLag | Replica freshness |
BufferCacheHitRatio | Whether the working set fits in memory |
DDLThroughput / DMLThroughput | Write load |
RollbackSegmentHistoryListLength | Long-running transaction pressure |
Cross-cutting signals
| Signal | Source | Why it matters |
|---|---|---|
| Deployment events | CI/CD → CloudWatch annotations | Correlates change with effect |
| Queue depth and age | SQS | Consumers falling behind |
| DLQ depth | SQS | Silent message loss |
| Certificate expiry | ACM | Outage on a known date |
| Snapshot age | AWS Backup | Recovery point risk |
| Budget threshold | AWS Budgets | Cost anomaly |
How to use this sheet
- Select the metrics for the tiers the workload actually has.
- Baseline for one week under normal load.
- Set thresholds relative to the baseline and to user impact, not to generic defaults.
- Alarm on the two or three that indicate a problem, with composite alarms to reduce noise.
- Dashboard the rest for diagnosis, not alerting.
- Review monthly — delete what nobody looks at.