CostMonStart free

Calculator

What is your observability stack actually costing you?

The monitoring bill nobody budgets for. Price Datadog and AWS CloudWatch meter by meter, and find out which config change actually moves the number.

Rates verified Datadog pricing is global USD; CloudWatch rates are us-east-1, see the sources below

Why observability bills drift

Why an observability bill outgrows the infrastructure it watches

Every other line item on a cloud bill scales with something you decided on purpose: more instances, more storage, more traffic. Observability spend scales with something nobody decided on purpose at all: the number of unique tag values a metric happens to see, the length of a debug log statement a developer left in, how many hosts an autoscaler briefly spun up at 3 a.m. None of those are provisioning decisions. They're side effects of normal operation, which is exactly why nobody's watching them the way they'd watch an EC2 fleet.

The tools built to catch cost surprises everywhere else in the stack rarely point at themselves. A team that diligently rightsizes instances and cleans up orphaned volumes can still let its own monitoring bill triple, because the meter that's growing lives inside the observability platform, not the infrastructure it's watching, and it takes a specific kind of attention to notice a bill that's rising for reasons unrelated to the traffic it's monitoring.

How the calculator works

The Datadog panel prices four meters that move independently: infrastructure hosts (billed at a high-water mark, not an average), custom metrics (billed on cardinality, with a real multiplier for histogram and distribution types), APM (a per-host charge plus indexed spans beyond an included allotment), and logs (ingestion and indexing priced completely separately). Every total is computed twice, once at Datadog's annual/committed rate and once at its on-demand rate, so a list-price comparison doesn't require guessing which one applies to you.

The CloudWatch panel prices the AWS-side equivalent: log ingestion and storage (each with a cheaper Infrequent Access class), custom metrics (billed on a volume-tiered ladder, not a flat rate), and the GetMetricData API calls every dashboard refresh generates.

Below both panels, a ranked set of levers computes what each concrete fix is worth at your own numbers: capping autoscale-driven host peaks, cutting the histogram fan-out on high-volume metrics, moving logs to a cheaper access tier, setting an actual retention policy, killing unused custom metrics, and sampling APM traces instead of indexing every one. Each figure is driven entirely by values you enter, so nothing here rests on an assumption you can't see. They don't stack cleanly, though: the two CloudWatch log levers both bill against the same stored volume, so applying both saves less than adding them suggests.

Free calculator

Price your own observability stack

Two independent panels, Datadog and AWS CloudWatch, plus a ranked list of what each fix is worth at your own numbers. Everything computes in your browser; nothing you type here is sent anywhere.

Datadog

hosts

Your steady-state count, outside of any autoscale spike.

hosts

The highest hourly count Datadog saw, close to what host billing's high-water mark actually charges.

series

Distinct metric-name + tag-value combinations you send, before any histogram fan-out.

%

Each one bills as roughly 5 custom metrics by default, not 1.

hosts

APM bills per host, on top of Infrastructure Monitoring.

M spans

What's actually retained and searchable, after any sampling.

%

Traces from healthy, unremarkable requests. Error and high-latency traces are the ones worth keeping at full rate.

GB

Everything sent to Datadog, whether or not it's ever indexed.

M events

The subset of ingested logs kept searchable. Ingest and index are two separate meters.

%

Compliance and audit logs you'd only ever rehydrate, not query day-to-day.

Datadog, by meterMonthly
Live
Infrastructure hosts
$825
Custom metrics (ingested overage)
$24.50
APM (hosts + indexed spans)
$784
Log ingestion
$60
Log indexing (15-day)
$77
Total, annual/committed rate$1,770$2,402/mo on-demand

List prices only, no volume discounts. Custom-metric overage prices only the published Metrics without Limits ingested rate. See the FAQ below.

AWS CloudWatch

GB

Custom log data sent to CloudWatch Logs, Standard log class.

%

Logs nobody derives a live metric filter or alarm from. IA turns off real-time processing on that log group.

GB

Total retained log volume across every log group, regardless of age.

%

Log groups defaulted to "Never Expire" keep billing storage forever until someone sets a limit.

metrics

Total metric-months across every namespace. CloudWatch's tiers apply to the whole account.

metrics

Metrics from a deprecated service or a dashboard nobody opens, a subset of the total above.

M requests

Every dashboard refresh and every external tool polling CloudWatch counts here.

CloudWatch, by meterMonthly, us-east-1
Live
Log ingestion (Standard)
$150
Log storage (Standard)
$75
Custom metrics
$1,200
GetMetricData requests
$20.00
Total$1,445

Estimate only, based on us-east-1 list prices verified against AWS's Price List Bulk API, not a bill.

Ranked savingsWhat each fix is worth at your numbers
Live
  1. Cap how high and how long autoscaling is allowed to spike−$225.00/mo

    Host billing is a high-water mark, not an average. A sustained spike sets the whole month's host charge. A ceiling on max group size limits the worst case.

  2. Move logs nobody derives a live metric from to Infrequent Access−$31.50/mo

    Half the ingestion cost and 40% off storage, with no functional loss for a log group nothing is alerting on in real time.

  3. Cut the histogram/distribution fan-out on your highest-volume metrics−$15.00/mo

    Trim histogram_aggregates and histogram_percentiles in datadog.yaml, or switch the metric to a plain type. Each HISTOGRAM series bills as five custom metrics by default.

  4. Move rarely-queried indexed logs to Flex Storage−$18.56/mo

    Compliance and audit logs you'd only ever rehydrate, not query day-to-day, cost a fraction as much in a searchable-on-demand cold tier.

  5. Set an explicit retention period on every log group−$26.25/mo

    "Never Expire" is the default. One setting per log group stops storage from accumulating indefinitely.

  6. Delete custom metrics tied to decommissioned services−$180.00/mo

    A metric namespace nobody's dashboard references any more still bills at its tier's marginal rate every month.

  7. Sample APM traces instead of indexing every span−$4.25/mo

    Indexed spans beyond your host allotment bill per million, same shape as logs. A retention filter that keeps every error and slow trace, then samples the rest, is the usual shape. The figure uses the sampleable share you entered above.

Figures use Datadog's annual/committed rate for comparability across levers; on-demand rates make every saving larger. Ranked by typical impact, not re-sorted as you type. Don't add these up: the two CloudWatch log levers both bill against the same stored volume, so applying both saves less than their sum.

Rate card

Every Datadog and CloudWatch observability rate, priced

Verified against each vendor's own published pricing, not blog hearsay. Full citations are in the sources section below.

Datadog

Datadog rates, their billing unit, and notes
RatePriceBilling unitNote
Infrastructure host (Pro plan)$15/host/mo annual · $18/host/mo on-demandPer host, per monthBilled at the high-water mark: the max of the LOWER 99% of the month's hourly host counts. A spike lasting more than roughly 1% of the month's hours (about 7 hours) sets the bill; a shorter one is excluded.
Custom metrics included per host100/host (Pro) · 200/host (Enterprise)Metric-months, bundledCovers both ingested and indexed volume. A custom metric is any unique metric-name + tag-value combination not submitted through one of Datadog's 1,000+ built-in integrations.
Custom metrics ingested beyond allotment$0.10 per 100 ingested custom metrics/moMetrics without Limits™ ingested overageThe only overage rate Datadog publishes. Indexed-metric overage for accounts NOT using Metrics without Limits is priced per your contract, and Datadog doesn't publish it.
Histogram/Distribution metric fan-out5x custom metrics per unique series by defaultMetric-type multiplierCovers max, median, avg, p95, and count. Adding percentile aggregations on a Distribution stacks another 5x on top, up to 10x total.
APM host$31/host/mo annual · $48/host/mo on-demandPer host, per month, bundled with Infrastructure Monitoring
Indexed spans included per APM host1M spans/host/moAt the default 15-day retention
Indexed spans beyond allotment, 7-day retention$1.27/M spans annual · $1.91/M on-demandPer million spans, per month
Indexed spans beyond allotment, 15-day retention$1.70/M spans annual · $2.55/M on-demandPer million spans, per month
Indexed spans beyond allotment, 30-day retention$2.50/M spans annual · $3.75/M on-demandPer million spans, per month
Log ingestion$0.10/GB ingested or scannedPer GB, per monthFlat: Datadog quotes the same figure whether billed annually or on-demand.
Log indexing, 15-day retention$1.70/M events annual · $2.55/M on-demandPer million log events, per monthA separate meter from ingestion. Every other retention tier Datadog offers links out to "Contact Us for Pricing" rather than a published rate.
Flex Storage (rehydratable cold tier)$0.05/M events annual · $0.075/M on-demandPer million events stored, per month1–15 month retention, searchable on demand rather than always-indexed.

AWS CloudWatch (us-east-1)

CloudWatch rates, their usage type, and notes
RatePriceUsage typeNote
Log ingestion, Standard class$0.50/GBDataProcessing-Bytes
Log ingestion, Infrequent Access class$0.25/GBDataProcessingIA-BytesHalf the ingestion cost, but that log group loses metric filters, anomaly detection, and sensitive-data protection. Logs Insights queries still work on it.
Log storage, Standard class$0.03/GB-moTimedStorage-ByteHrs
Log storage, Infrequent Access class$0.018/GB-moTimedStorage-IA-ByteHrs
Logs Insights query scanning$0.005/GB scannedDataScanned-Bytes
Custom metrics$0.30/metric-mo ≤10,000 · $0.10/metric-mo next 240,000 · $0.05/metric-mo next 750,000 · $0.02/metric-mo over 1,000,000CW:MetricMonitorUsageTiers apply account-wide, not per namespace. The marginal rate on your next metric depends on how many you already publish.
GetMetricData API requests$0.01 per 1,000 requestsCW:GMD-MetricsEvery dashboard auto-refresh and every external tool polling CloudWatch counts here.
GetMetricWidgetImage API requests$0.02 per 1,000 requestsCW:GMWI-Metrics
Other API requests (PutMetricData, ListMetrics, etc.)$0.01 per 1,000 requestsCW:RequestsThe first 1,000,000 requests/month are free; only the overage bills.
OTel metrics via the CloudWatch OTLP endpoint$0.50/GB ingestedCW:OTEL:BytesA separate, byte-based meter from per-metric custom-metrics pricing. It's the CloudWatch parallel to Datadog's OTel-defaults-to-custom trap below.

The traps

The non-obvious mistakes that cost real money

Host billing runs close to the month's peak, not an average

Datadog bills infrastructure hosts at the high-water mark: the maximum of the lower 99% of the month's hourly host counts, which excludes the very top outlier hours before taking the max. A brief autoscale spike lasting less than about 1% of the month's hours (roughly 7 hours in a 730-hour month) can fall inside that excluded slice and never touch the bill. A spike that runs longer than that, or repeats often enough to no longer be the top 1%, sets the month's host charge just as surely as running that many hosts the whole time would have.

The practical upshot is the opposite of "any spike costs you": short, rare spikes are close to free under this methodology, but anything approaching a sustained autoscale event is billed as if it ran all month. Capping how high and how long an autoscaling group is allowed to scale is the lever, not eliminating spikes entirely.

A custom metric bills per tag combination, not per metric name

Adding one metric name doesn't add one billable metric. Datadog counts a custom metric as a unique combination of metric name and tag values, including the host tag, so tagging a single metric by customer_id or request_id across a growing user base multiplies it into thousands of billable series without a single new metric name ever being created. The fix is dropping or aggregating the highest-cardinality tags, not renaming metrics.

A HISTOGRAM or DISTRIBUTION metric bills as up to 10 metrics, not 1

By default, a HISTOGRAM metric generates five billable custom metrics per unique tag combination (max, median, avg, p95, and count). Turning on percentile aggregations for a DISTRIBUTION metric stacks another five on top, for up to ten billable metrics behind what looks, in code, like a single metric.submit call. This compounds directly with the cardinality trap above: a high-cardinality histogram is the single most expensive shape a custom metric can take.

Ingesting a log and indexing it are two different charges

Both Datadog and CloudWatch bill log ingestion and log storage/indexing as separate meters. A verbose logging change can move both line items at once without anyone realizing it, and a log that's ingested but never indexed still bills its ingestion cost even though nobody can search it. Sending everything to full-price indexing by default, rather than deciding case by case what needs to be searchable, is the single most common way a logging bill outgrows the traffic it's describing.

CloudWatch's Infrequent Access log class isn't a free discount

Moving a log group to CloudWatch's Infrequent Access class halves the ingestion rate, but AWS's own launch announcement is explicit about the tradeoff: Standard remains the choice for logs that need "real-time operational visibility and advanced analytical capabilities such as extracting metrics from logs, anomaly detection, sensitive data protection, or real-time logs analysis," none of which IA supports. Logs Insights queries still work on IA logs. Metric filters, alarms derived from log content, and anomaly detection do not. It's a safe move only for logs nobody's deriving a live signal from.

An OpenTelemetry metric is a custom metric unless it's explicitly mapped

Datadog's own documentation is direct about this: "If a metric is not submitted from one of the more than 1,000 Datadog integrations it's considered a custom metric," and that includes OpenTelemetry metrics outside Datadog's built-in semantic-convention mappings. Teams standardizing on OTel instrumentation to stay vendor-neutral routinely discover their metrics are billed at custom-metric rates, cardinality multiplier included, unless the specific metric happens to match a mapping Datadog ships out of the box. CloudWatch has its own version of the same gap: OTel metrics sent through its OTLP endpoint bill by ingested byte, a separate meter from its per-metric custom-metrics pricing.

A CloudWatch log group defaults to never expiring

Unless a retention period is set explicitly, a CloudWatch log group's default is "Never Expire." Every byte ever ingested into that group keeps billing storage forever, with no automatic cleanup and nothing to notice failing, because nothing fails. It just accumulates. This is the same shape as the lifecycle-policy trap on S3 and EBS: the fix is a one-time retention setting, not an ongoing cleanup task, but almost nothing forces anyone to set it.

The levers

Seven fixes, ranked by typical impact

The calculator above computes what each one is worth at your own numbers. This is the reasoning behind the ranking.

  1. Cap how high and how long autoscaling is allowed to spike

    Host billing is a high-water mark, not an average. A sustained spike sets the whole month's host charge. A ceiling on max group size limits the worst case.

  2. Move logs nobody derives a live metric from to Infrequent Access

    Half the ingestion cost and 40% off storage, with no functional loss for a log group nothing is alerting on in real time.

  3. Cut the histogram/distribution fan-out on your highest-volume metrics

    Trim histogram_aggregates and histogram_percentiles in datadog.yaml, or switch the metric to a plain type. Each HISTOGRAM series bills as five custom metrics by default.

  4. Move rarely-queried indexed logs to Flex Storage

    Compliance and audit logs you'd only ever rehydrate, not query day-to-day, cost a fraction as much in a searchable-on-demand cold tier.

  5. Set an explicit retention period on every log group

    "Never Expire" is the default. One setting per log group stops storage from accumulating indefinitely.

  6. Delete custom metrics tied to decommissioned services

    A metric namespace nobody's dashboard references any more still bills at its tier's marginal rate every month.

  7. Sample APM traces instead of indexing every span

    Indexed spans beyond your host allotment bill per million, same shape as logs. A retention filter that keeps every error and slow trace, then samples the rest, is the usual shape. The figure uses the sampleable share you entered above.

Sources

Where every rate on this page comes from

Every Datadog and CloudWatch rate above is pulled first-party from each vendor's own pricing data, re-verified as of 2026-08-10.

FAQ

Common questions about observability costs

Why did our Datadog bill jump when we didn't add any new hosts?

Host count is rarely the culprit behind a sudden jump. Custom-metric cardinality and log volume move far more easily. Check whether a recently-added tag (customer_id, request_id, or anything with unbounded unique values) landed on a metric, and whether a logging change increased ingestion, indexing, or both. Both move independently of host count entirely.

Is a brief autoscale spike really going to blow up our Datadog bill?

Not necessarily. Datadog bills the high-water mark of the LOWER 99% of the month's hourly host counts, which excludes the very top outlier hours before taking the max. A spike shorter than roughly 1% of the month (about 7 hours) is likely to be excluded entirely. A spike that runs longer, or repeats often enough to stop being an outlier, gets billed as if it ran all month.

What counts as a custom metric?

Anything not submitted through one of Datadog's 1,000+ built-in integrations, per Datadog's own documentation, including anything sent via DogStatsD, a custom Agent Check, or OpenTelemetry outside a built-in semantic-convention mapping. It's billed per unique metric-name + tag-value combination (cardinality), not per metric name.

Why does this page only price one Datadog custom-metric overage rate?

It's the only one Datadog publishes. The rate for indexed-metric overage on standard (non-"Metrics without Limits") accounts is, per Datadog's own billing docs, "specified in your current contract", not a public list price. Rather than guess at it, this page models only the published Metrics without Limits ingested-overage rate, labeled as exactly that.

What's the real difference between CloudWatch log ingestion and log storage?

Ingestion is a one-time charge the moment a log event arrives; storage is a recurring monthly charge for every byte still sitting in the log group. A log group with no retention policy set keeps paying the storage charge indefinitely, long after the ingestion charge for those same bytes was paid once and forgotten.

Does moving logs to an Infrequent Access or Flex tier mean losing them?

No, but it does mean losing some capability. CloudWatch's Infrequent Access class still supports Logs Insights queries. It just drops real-time features like metric filters and anomaly detection. Datadog's Flex Storage keeps logs searchable on demand rather than always-indexed, with a rehydration step before you can query them. Both are safe for logs nobody's alerting on live, and a poor fit for anything that is.

Does CostMon fix any of this automatically?

No. CostMon doesn't change a metric's tags, set a CloudWatch retention policy, or adjust an APM sampling rate for you. What it does is pull your real Datadog and AWS cost and usage data on a schedule, normalize it alongside every other provider you run, and flag a climbing observability line before it turns into a surprise on the invoice. The fixes above are still yours to apply.

The meter you don't watch still grows.

Waste rarely hides in the service you check every week. CostMon watches every meter on your stack, including the ones you forgot were running.

Esc