Vendor and custom metrics cost reduction
Amazon CloudWatch, Prometheus, and third-party monitoring can become significant cost drivers in Amazon EKS.
Check container insights, prometheus, ADOT (AWS Distro for OpenTelemetry) metrics
For sample commands to audit Container Insights metrics and estimate cost, see the audit-container-insights-metrics.sh
Reduce Prometheus/ADOT Metric Cardinality
For sample commands to identify and reduce high-cardinality Prometheus metrics, see this reduce-prometheus-cardinality.sh
Prometheus Relabeling to Drop Expensive Metrics
For a sample Prometheus ServiceMonitor with metric relabeling to drop expensive metrics, see this servicemonitor-cost-optimized.yaml
CloudWatch Metric Streams: Cost-Effective Alternative
Use CloudWatch metric filters to extract only the signals you need from existing log data instead of publishing continuous custom metrics, see this cloudwatch-metric-filter.sh
Vendor Metrics Cost Checklist
Metric Source | Cost Driver | Optimization |
|---|---|---|
CloudWatch Container Insights | Per-metric pricing ($0.30/metric/month) | Disable enhanced metrics for non-prod |
Amazon Managed Prometheus | Ingested samples ($0.03/10M samples) | Drop unused metrics via relabeling |
CloudWatch Logs | Ingestion + storage ($0.50/GB + $0.03/GB) | Filter at source, reduce log verbosity |
Third-party (Datadog, New Relic) | Per-host or per-container pricing | Use namespace-level sampling |
Custom metrics via PutMetricData | $0.30/metric/month + API calls | Batch calls, reduce dimensions |
Actions
Audit custom metrics and replace them with default metrics or built-in integrations wherever possible.
Audit process
For sample commands to list custom metrics, estimate their monthly cost, and identify ones that duplicate Container Insights defaults, see this audit-custom-metrics.sh
Common replacements
Custom Metric | Default Alternative | Source |
|---|---|---|
Custom CPU per pod |
| Container Insights |
Custom memory per pod |
| Container Insights |
Custom node count |
| Container Insights |
Custom network bytes |
| Container Insights |
Custom disk usage |
| Container Insights |
Custom request count | ALB metrics / Service Mesh | Built-in |
Cleanup steps
Inventory – List all custom metrics and their associated costs
Map – Identify which default metrics or integrations provide equivalent data
Validate – Confirm dashboards and alarms work with default metrics
Remove – Delete custom metric publishing from application configurations
Monitor – Verify no alerting gaps after removal
Audit your metric count with aws cloudwatch list-metrics, drop unused metrics via Prometheus relabeling, disable enhanced Container Insights in non-production clusters, and set ttlSecondsAfterFinished on jobs to auto-clean metric sources.
key takeaway: Monitoring costs scale with cluster size unless you actively manage cardinality. A 100-node cluster can easily generate thousands of metrics, most of which nobody looks at. Filter at the source, not after ingestion.
Recommendations
Enable CloudWatch Container Insights as the default observability layer, it provides comprehensive metrics at lower cost than custom metrics
Use the CloudWatch Metrics Calculator to estimate savings from custom metric removal
Retain custom metrics only when they provide unique business-level data not available from infrastructure metrics
Review metric publishing frequency, reduce from 1-second to 60-second resolution where real-time precision isn't required (saves on high-resolution metric charges)