Skip to main content

AI & assistant-friendly summary

This section provides structured content for AI assistants and search engines. You can cite or summarize it when referencing this page.

Summary

On July 31, 2026 AWS shipped CloudWatch managed Prometheus collectors. For the AWS Example 22 shape (100 hosts x 50 metrics @ 60s), OTLP ingestion is $54/mo vs $1,500 classic custom metrics if you do not double-ingest.

Key Facts

  • On July 31, 2026 AWS shipped CloudWatch managed Prometheus collectors
  • For the AWS Example 22 shape (100 hosts x 50 metrics @ 60s), OTLP ingestion is $54/mo vs $1,500 classic custom metrics if you do not double-ingest
  • Metrics arrive in OpenTelemetry format, query with PromQL, and sit next to AWS vended metrics for one alarm and dashboard surface
  • 30/series) or AMP samples | CloudWatch destination: OTLP $0
  • Solution guides exist for EC2 and ECS

Entity Definitions

EC2
EC2 is an AWS service discussed in this article.
CloudWatch
CloudWatch is an AWS service discussed in this article.
Amazon CloudWatch
Amazon CloudWatch is an AWS service discussed in this article.
VPC
VPC is an AWS service discussed in this article.
EKS
EKS is an AWS service discussed in this article.
ECS
ECS is an AWS service discussed in this article.
OpenSearch
OpenSearch is an AWS service discussed in this article.
Kubernetes
Kubernetes is a development tool discussed in this article.

CloudWatch Managed Prometheus Collectors (July 2026)

DevOps & CI/CDPalaniappan P6 min read

Quick summary: On July 31, 2026 AWS shipped CloudWatch managed Prometheus collectors. For the AWS Example 22 shape (100 hosts x 50 metrics @ 60s), OTLP ingestion is $54/mo vs $1,500 classic custom metrics if you do not double-ingest.

Key Takeaways

  • On July 31, 2026 AWS shipped CloudWatch managed Prometheus collectors
  • For the AWS Example 22 shape (100 hosts x 50 metrics @ 60s), OTLP ingestion is $54/mo vs $1,500 classic custom metrics if you do not double-ingest
  • Metrics arrive in OpenTelemetry format, query with PromQL, and sit next to AWS vended metrics for one alarm and dashboard surface
  • 30/series) or AMP samples | CloudWatch destination: OTLP $0
  • Solution guides exist for EC2 and ECS
CloudWatch Managed Prometheus Collectors (July 2026)
Table of Contents

On July 31, 2026, AWS announced Amazon CloudWatch managed Prometheus collectors: fully managed, agentless scrapers that pull Prometheus-compatible metrics from EKS, EC2, ECS, MSK, and OpenSearch without you deploying or scaling an OpenTelemetry Collector fleet. Metrics arrive in OpenTelemetry format, query with PromQL, and sit next to AWS vended metrics for one alarm and dashboard surface.

This is a collector-ops and destination decision, not a free observability lunch. Ingestion still bills. Cardinality still bills. The win is deleting the scrape fleet if you pick one destination and filter before scrape.


What changed

BeforeAfter July 31, 2026
Self-manage ADOT / Prometheus agent HA, patching, scalingCloudWatch-managed scraper (ENI per subnet you specify)
Metrics path often = custom metrics ($0.30/series) or AMP samplesCloudWatch destination: OTLP $0.50/GB (15 months storage included)
Separate scrape tooling per compute typeOne CreateScraper flow for EKS / ECS / EC2 / MSK / OpenSearch

Official overview: CloudWatch managed Prometheus collectors. Solution guides exist for EC2 and ECS.

Architecture notes that matter on day one:

  • Scraper creates an ENI per subnet; scrape traffic stays on private networking via VPC endpoint to CloudWatch (not the public internet).
  • You still need at least two subnets in different AZs, security groups that allow collector to exporter ports, and a CloudWatch interface VPC endpoint if the scraper subnets have no internet path.
  • Scraping can incur VPC data transfer between collector and targets. Compress /metrics responses (gzip) to shrink transfer volume; compression does not change CloudWatch ingested metric bytes.

Availability: all Regions where the CloudWatch OTLP endpoint exists, except Asia Pacific (New Zealand).


Discovery by compute type

SourceDiscovery modelGotcha
EKSKubernetes service discoveryCluster access / roles must allow the scraper to find targets
ECSDNS via AWS Cloud MapStatic IPs fail after redeploy; register services in Cloud Map first
EC2static_configs / instance targetsExporter ports must be open to scraper security groups (Node Exporter often 9100)
MSK / OpenSearchOpen monitoring endpointsAutomatic dashboards available; still apply label hygiene

If you run ECS on Fargate with rolling deploys, Cloud Map is not optional. Teams that copy an EC2 static_configs block onto ECS will see intermittent gaps that look like “flaky metrics” and are really stale targets.


First-party pricing math (not a client silhouette)

No anonymized engagement is cited for this launch week. Numbers below are reproducible arithmetic on published AWS examples, labeled as math.

CloudWatch OTLP vs classic custom metrics (AWS CloudWatch pricing Example 22 shape: 100 EC2 instances, 50 metrics each, 60s interval, 500 bytes/datapoint):

PathMonthly mathTotal
OTLP ingestion108 GB × $0.50/GB$54
Classic custom metrics (same 5,000 series)5,000 × $0.30/metric-month$1,500

Direction:$1,446/month on the metric storage model alone for that illustrative shape, before collector-hour fees and VPC transfer. Source: CloudWatch pricing Example 22 (OpenTelemetry custom metrics).

Collector hours: Scrapers are created with aws amp create-scraper and a cloudWatchConfiguration destination. AMP publishes agentless collector pricing at $0.04/collector-hour + $0.03 per 10M samples collected (AMP pricing Example 2). One always-on scraper is about $29.76/month in collector hours (744 × $0.04), before the per-sample collected line. Confirm the collector charge appears as expected when the destination is CloudWatch; do not assume the OTLP GB line is the only new cost.

PromQL API scans: $0.01 per million samples. Console, Query Studio, and dashboard queries are free.

Halving the scrape interval from 60s to 30s roughly doubles OTLP GB for the same series set. Classic per-series monthly fees do not change with interval. That asymmetry is why managed collectors plus OTLP reward coarser scrapes for non-alerting infra series.

Reproduce this — Open the OTLP vs classic cost model CSV. Plug your targets × metrics × scrape_interval × bytes_per_datapoint. Compare to classic unique_series × $0.30. Walk the destination decision matrix before you create a second scrape path. Sample EC2 scrape YAML (with keep/drop relabeling): sample-ec2-scrape-config.yml.

For the broader stack choice (Application Signals vs AMP vs Grafana), see Observability beyond CloudWatch. For label hygiene, see Prometheus cardinality explosion. Bill anatomy lives in CloudWatch pricing dimensions.


Opinionated recommendation

We recommend: If your primary pane is CloudWatch and you currently run a self-managed Prometheus/ADOT scrape fleet only for metrics into CloudWatch, migrate those scrape jobs to managed collectors → CloudWatch dataset, with aggressive metric_relabel_configs on day one.

Trade-off you accept: You give up ADOT processor flexibility and multi-backend dual-export on that path. If you still need traces and logs through the same collector, keep ADOT for those signals. The managed Prometheus scraper does not replace your whole telemetry pipeline.

SituationPreferWhy
CloudWatch-first, Prometheus exporters on EC2/ECS/EKSManaged collector → CloudWatchKill scrape-fleet ops; PromQL + alarms in one place
Grafana + recording rules + AMP already paid forManaged collector → AMP (or keep existing AMP collector)Do not dual-write the same series to OTLP
Need traces/logs processors + metricsKeep ADOT; add managed collectors only for isolated scrape jobsDifferent jobs, different tools
EKS infra already on Container Insights OTel ($0.08/GB)Leave CI-OTel alone; add managed collectors for app /metricsDifferent product rates and receivers

Related ops hygiene: CloudWatch observability best practices and log sampling / OTel cost control.


What broke (pattern): lift-and-shift scrape YAML

What broke — Teams that base64-encode an existing scrape-everything Prometheus config into CreateScraper without metric_relabel_configs see collector health “green” while Cost Explorer shows an OTel ingestion (or AMP samples) spike within 24–48 hours. Root cause: managed collectors remove ops friction, not cardinality. A second failure mode: leaving the old ADOT DaemonSet scraping the same job_name, so every series is ingested twice. Detection: Cost Explorer filter on CloudWatch OpenTelemetry / AMP collector lines plus scraper vended logs for target count. Fix: one scrape path per job; drop unused families at scrape; gzip /metrics where supported.

Related FinOps framing: observability FinOps / cardinality.


Create a scraper (EC2 path)

Context: AWS CLI v2, AMP create-scraper API, CloudWatch dataset destination, scrape YAML from the sample artifact. Replace subnet, security group, and dataset ARN. Encode the YAML as the configuration blob (Linux base64 -w 0; macOS base64).

# Assumed: AWS CLI v2, credentials for the workload account, scrape YAML on disk
aws amp create-scraper \
  --alias "ec2-node-exporter-scraper" \
  --source '{
    "vpcConfiguration": {
      "subnetIds": ["subnet-aaa", "subnet-bbb"],
      "securityGroupIds": ["sg-collector"]
    }
  }' \
  --scrape-configuration configurationBlob="$(base64 < sample-ec2-scrape-config.yml | tr -d '\n')" \
  --destination '{
    "cloudWatchConfiguration": {
      "datasetArn": "arn:aws:cloudwatch:us-east-1:123456789012:dataset/default"
    }
  }'

Validate in CloudWatch Query Studio with a PromQL selector for your job label (for example {job="ec2-node-exporter"}). Collector health and scrape errors land in CloudWatch Logs; see Monitor collectors.


What to Do This Week

  1. Inventory every self-managed ADOT/Prometheus agent whose only job is scraping /metrics into CloudWatch or AMP.
  2. Open the decision matrix and pick one destination per job.
  3. Fill the cost CSV with your series count and scrape interval.
  4. Pilot one EC2 or ECS job with keep/drop relabeling; watch OTel GB (or AMP samples) for 48 hours before fleet rollout.
  5. Turn off the old scrape path for that job only after series parity checks in Query Studio or Grafana.

What This Post Doesn’t Cover

  • Full EKS IRSA / cluster role binding walkthrough for Kubernetes service discovery (use the AWS EKS solution guide for your cluster version).
  • Exact CloudWatch console clicks for automatic MSK/OpenSearch dashboards.
  • Whether your CUR line item names for collector hours match AMP vs CloudWatch product codes in every region (verify in your account after the first scraper).
  • Migrating Grafana dashboards off AMP when you choose CloudWatch as destination.

If you only do one thing: do not dual-ingest. Managed collectors remove the agent; they do not forgive scrape-everything YAML or a second collector writing the same series.

PP
Palaniappan P

AWS Cloud Architect & AI Expert

AWS-certified cloud architect and AI expert with deep expertise in cloud migrations, cost optimization, and generative AI on AWS.

AWS ArchitectureCloud MigrationGenAI on AWSCost OptimizationDevOps

Recommended Reading

Explore All Articles »
9 min

Observability Beyond CloudWatch (2026): When to Add Application Signals, ADOT, Managed Prometheus, and Grafana — and When Not To

The reflex to bolt Amazon Managed Prometheus + Grafana onto every workload is how observability bills quietly double. CloudWatch Application Signals now gives you an auto-discovered service map, SLOs, and traces with near-zero setup; AMP only earns its keep when you are PromQL-native or drowning in high-cardinality metrics — where ingestion (not retention) is the cost driver. Here is the decision matrix, an ADOT dual-export config, and the three levers that actually cut the AMP bill.