Managing Hundreds of Amazon EKS Clusters at Fleet Scale · Part 13 of 18

Observing an EKS Fleet: One Pane Over Hundreds of Clusters

A single cluster is easy to watch. Once you run hundreds, "add a dashboard" stops working and observability becomes its own scaling problem — where the answer to "how is prod?" has to come from one pane, and the metrics bill quietly grows faster than the fleet.

TL;DR

Default to the managed stack: Amazon Managed Service for Prometheus (AMP) for storage and PromQL, Amazon Managed Grafana (AMG) for the pane. The fleet-scale question is not "which tool" — it's how you span many clusters. Aggregate many AMP workspaces through promxy into one Grafana data source when you need a single pane; give each team or environment its own workspace when tenant isolation and cost attribution matter more. And watch cardinality before it watches your invoice — at fleet scale, unique time series, not cluster count, is what makes ingestion cost explode.

Do this

  • Run AMP + AMG as the managed default; ingest with ADOT or Prometheus remote-write.
  • Aggregate workspaces via promxy when one pane over the fleet is the goal.
  • Split workspaces per team/env when isolation and cost-attribution dominate.
  • Treat cardinality as a first-class budget: recording rules, label discipline, per-workspace scoping.

Don't do this

  • Don't self-run Prometheus on every cluster and hope the dashboards add up.
  • Don't let every pod label and path become a new metric dimension.
  • Don't pick "single pane vs isolation" by taste — it's the same blast-radius tradeoff as your GitOps model.
  • Don't discover the ingestion bill after the fact; scope and sample up front.
Figure 1 · Fleet observability topology Many clusters → many workspaces → promxy → one paneEKS CLUSTERSprod clusterprod cluster+ hundreds moreAMP WORKSPACESworkspaceworkspaceworkspacepromxyaggregatesGrafanaAMG · one paneremote-write (ADOT)one sourceContainer Insights + Network Obs.service map · flow table · OpenMetricsPrometheus format
Every cluster remote-writes to a workspace; promxy fans one query across all of them so Grafana sees the fleet as a single source.

Why a fleet breaks the single-cluster dashboard — from one Prometheus to hundreds

Observing one EKS cluster is a solved craft. You run Prometheus, point Grafana at it, and every question about that cluster has an answer in one place. The instinct at scale is to do the same thing many times: a Prometheus per cluster, a Grafana per cluster. That instinct is exactly what breaks.

The moment you operate clusters by the hundred, three things go wrong with the copy-paste approach at once:

So the real problem is not collecting metrics. It's two harder things: how you store metrics without operating a storage tier by hand, and how you see across clusters from one place. Fleet observability is a scaling problem in its own right, and the rest of this piece is about solving those two without the cost curve getting away from you.

The managed default that skips the ops — AMP for storage, AMG for the pane

Start with the managed stack, because it removes the first problem entirely. Amazon Managed Service for Prometheus (AMP) is a serverless, Prometheus-compatible metric store: you keep PromQL and the Prometheus data model, but there is no Prometheus server to size, scale, or upgrade.1 Clusters send metrics in with ADOT (the AWS Distro for OpenTelemetry) or plain Prometheus remote-write, and AMP holds the time series.

Amazon Managed Grafana (AMG) is the pane on top — managed Grafana with AMP as a first-class data source, so you query with the PromQL you already know.12 The split is the point: AMP owns storage and query, AMG owns visualization and access. Neither is a server you patch.

For a single cluster this is a pleasant convenience. For a fleet it's the thing that makes the rest tractable — you've turned "operate hundreds of Prometheus servers" into "send metrics to a managed endpoint." What you have not solved yet is the pane. One workspace per cluster still leaves you with hundreds of data sources and no single view. That's the fleet-aggregation problem, and it's where the real design decision lives.

Figure 2 · The aggregation decision Aggregate for one pane, or isolate for tenancyAGGREGATE · PROMXY INTO ONE PANEAMP workspacessharedpromxyone Grafana paneISOLATE · PER-TEAM WORKSPACESper-team workspacesisolatedteam Ateam Bteam C+ one query spans the whole fleet– shared query path, one blast radius+ isolation + clean cost attribution– no single pane; find the workspace
Aggregate for one pane and accept a shared query path and blast radius; isolate for tenancy and attribution and accept a fragmented view. It's the same tradeoff as Argo versus Flux.

One pane over many workspaces — promxy aggregation vs per-team isolation

Managed storage still leaves you with a choice about topology: how many AMP workspaces, and how they roll up into a view. There are two honest patterns, and they pull in opposite directions.

Aggregate for one pane. Put clusters into a shared set of AMP workspaces and place promxy in front of them — an open-source Prometheus-compatible proxy that fans a single PromQL query out across many backends and merges the results.3 Grafana then points at one promxy data source and sees the whole fleet as if it were one Prometheus. This is what buys you the single pane: "P99 latency across every prod cluster" becomes one query, not a tab per cluster.

Isolate for tenancy. Give each team or each environment its own AMP workspace. Now blast radius is contained, access control is per-workspace, and cost falls out cleanly per tenant — the workspace is the unit of attribution.4 The price you pay is the single pane: a viewer has to know which workspace holds the answer, and cross-fleet queries get awkward.

If that tension feels familiar, it should. It's the same shape as the Argo CD versus Flux decision from Part 4: a central hub gives you one place to see and drive everything, at the cost of a shared blast radius; a distributed model contains the blast radius but loses the single pane of glass.5 Aggregation is the hub model for metrics; per-team workspaces are the distributed one.

And the per-team-workspace choice is not really an observability decision at all — it's your tenancy model showing up again. If you already run separate clusters or accounts per team for isolation and cost attribution (the many-vs-few call from Part 2, enforced by the guardrails in Part 6), per-team workspaces just extend that boundary into metrics. Let the tenancy model you already committed to decide this, rather than inventing a second, conflicting one for observability.

The two patterns aren't exclusive. A common fleet shape is per-environment workspaces (prod, staging, dev held apart for isolation) with promxy aggregating within an environment so you still get one prod pane. You draw the promxy boundary where your isolation requirement stops.

Seeing the network, not just the pods — Container Insights and Network Observability

Metrics tell you a pod is slow; they rarely tell you why when the cause is the network between pods. Two AWS features fill that gap, and both feed the same pane.

Container Insights collects cluster, node, pod, and container metrics — CPU, memory, disk, and the control-plane signals — as curated CloudWatch metrics, so you get the health of the cluster itself without hand-building every exporter.6 It's the "is the cluster healthy" layer beneath your application metrics.

The newer piece is Container Network Observability, which adds a service map, a flow table, and network performance metrics — and crucially exposes them in OpenMetrics / Prometheus format, so the same AMP + AMG stack scrapes and renders them alongside everything else.6 That's what lets you answer "which service-to-service path is dropping packets" on the same pane as your latency graphs, instead of in a separate tool. (Feature availability current as of 2026-06-30 — re-verify against the CloudWatch docs before relying on it, as these observability features move quickly.)

The design takeaway is to keep the pane singular. Network visibility that lands in its own console recreates the many-panes problem you just solved. Because these signals are Prometheus-format, they don't have to.

Where the metrics bill actually explodes — cardinality, not cluster count

Here's the part the getting-started guides gloss over, and the reason fleet observability goes wrong in production. At scale, your metrics cost is driven by cardinality — the number of unique time series — far more than by the number of clusters. AMP bills primarily on samples ingested and stored, and every distinct combination of label values is a separate series to ingest, store, and query.7

Cardinality explodes multiplicatively, which is why it ambushes teams. One metric with a pod label, a path label, and a status_code label doesn't cost you three series — it costs you every combination that ever appears. Add a high-churn label like pod name or request ID across a fleet where pods are created and destroyed constantly, and a single innocent-looking metric becomes millions of series. The bill grows with your label choices, not your traffic.

Figure 3 · The cardinality cost curve Cost tracks unique series — and the curve acceleratescostunique time series (cardinality) →no disciplinewith disciplineThe levers that bend the curve:drop high-cardinality labels · recording rules · per-workspace scoping · sampling + retention
Cost tracks unique series, not cluster count — and it curves upward. Discipline bends the curve back down; it doesn't just shift it.

The levers that control it are all about limiting series before they're stored, and they compound:

The honest summary: cardinality discipline is the difference between fleet observability that costs a predictable, budgeted amount and one whose bill grows every time a developer adds a label. It's not a cleanup you do once — it's a standing policy, ideally enforced the same way as your other golden-path defaults.

What to actually build — the fleet-observability decision

Pull it together into a default and a small set of thresholds you can act on.

The default: AMP for storage and PromQL, AMG for the pane, ingest via ADOT or remote-write, Container Insights and Network Observability feeding the same stack. Start here for any fleet; it removes the operate-your-own-storage problem before you tune anything else.

When…ChooseBecause
You need one view across the fleetAggregate workspaces with promxyOne data source, one PromQL query spans every cluster — the single pane
Tenancy, isolation, or cost-attribution dominatesPer-team / per-env workspacesThe workspace is the isolation and billing boundary; blast radius stays contained
You want bothPer-env workspaces + promxy within an envIsolate where the requirement is; still get one prod pane
The metrics bill is climbing faster than the fleetAttack cardinality firstCost tracks unique series, not clusters — labels and recording rules move the number

The one rule to carry out of this piece: let your existing decisions decide. Your GitOps model and your tenancy model already answered the single-pane-versus-isolation question — align observability with them instead of relitigating it. And whichever topology you pick, budget cardinality from day one, because it's the only part of this bill that grows on its own.

The next article turns to day-2 upgrades — how you keep a fleet inside standard support and off the 6× extended-support price, without a hundred hand-run upgrades.

Sources

Feature availability and pricing are current as of 2026-06-30 and should be re-verified against the primary source before acting — AWS observability features and pricing roll forward regularly.

  1. AWS — What is Amazon Managed Service for Prometheus: serverless, Prometheus-compatible, PromQL, ingest via ADOT / remote-write. docs.aws.amazon.com/.../what-is-Amazon-Managed-Service-Prometheus.html
  2. AWS — What is Amazon Managed Grafana: managed Grafana with AMP as a first-class data source. docs.aws.amazon.com/.../what-is-Amazon-Managed-Service-Grafana.html
  3. promxy — open-source Prometheus-compatible aggregating proxy: fan one PromQL query across many backends into a single data source. github.com/jacksontj/promxy
  4. AWS — EKS Best Practices: multi-tenancy, isolation, and per-tenant cost attribution (per-workspace = the tenancy boundary). docs.aws.amazon.com/eks/latest/best-practices
  5. Argo CD documentation — central hub-and-spoke single pane vs distributed pull, and its blast-radius tradeoff (the single-pane-vs-distributed tension mirrored here). argo-cd.readthedocs.io
  6. AWS — CloudWatch Container Insights and Container Network Observability: cluster/pod metrics, service map, flow table, network metrics in OpenMetrics/Prometheus format. docs.aws.amazon.com/.../ContainerInsights.html
  7. AWS — Amazon Managed Service for Prometheus pricing: billed on samples ingested and stored, so cardinality (unique series) drives cost. aws.amazon.com/prometheus/pricing