Skip to main content
CloudWatch cost usually grows because an application emits more telemetry than anyone uses. The fix is not to remove observability. The fix is to give every signal a purpose, a retention period, and an owner. Updated October 9, 2026. CloudWatch is several services with different cost drivers. Logs charge for ingestion, storage, analysis, and some delivery paths. Metrics charge for custom metric series and API usage. Dashboards, alarms, synthetics, tracing, and container telemetry add their own usage.

Start with the bill, not a guess

Open AWS Cost Explorer or the Cost and Usage Report and group CloudWatch spend by usage type. Separate log ingestion, archived log storage, Logs Insights scans, custom metrics, alarms, dashboards, and optional observability features. A large total does not tell you which control to change. A log-ingestion problem needs a different response from a custom-metric cardinality problem.

Control logs before they enter CloudWatch

Ingestion is often the largest log cost. Retention settings only reduce storage after ingestion, so they cannot fix noisy output by themselves. Review high-volume log groups and remove data that does not help you debug, audit, or measure the system.
  • Stop logging successful health checks on every request.
  • Avoid writing the same exception at every layer.
  • Reduce verbose framework and SDK logs in production.
  • Sample high-volume success events while retaining errors.
  • Use structured fields instead of several redundant text lines.
  • Remove secrets and personal data before logs leave the process.
Do not drop security or audit events only to reduce cost. Classify them separately and keep the retention required by your threat model and compliance obligations.

Set retention explicitly

A log group can retain data indefinitely unless you configure a retention period. Match retention to the signal: If older logs must remain available, export or deliver them to a storage tier designed for long-term retention. Include retrieval time and analysis tooling in the decision, not just storage price. CloudWatch Logs offers different log classes. Infrequent Access can fit logs that are retained but queried rarely, with a reduced feature set. Confirm feature compatibility before moving a group.

Limit query scans

CloudWatch Logs Insights charges based on data scanned. Narrow the time range and select only relevant log groups. Filter early using indexed or structured fields where available. Saved queries are useful, but a dashboard that repeatedly scans a broad time range can create continuous analysis cost. Use metrics for frequently viewed aggregates and logs for detailed investigation.

Watch metric cardinality

A custom metric is identified by its namespace, name, and complete dimension set. Adding a high-cardinality value such as request_id, user_id, or raw URL can create thousands of distinct metric series. Prefer bounded dimensions such as service, environment, operation, region, and status class. Keep per-request identifiers in logs or traces. High-resolution custom metrics, detailed monitoring, and frequent API calls can also increase cost. Use the finest resolution only when the response process can act on it.

Review optional telemetry

Container Insights, Application Signals, detailed service metrics, synthetics, and tracing can provide valuable context. They also increase the number of collected observations. Enable them for a reason. Measure whether the team uses the additional data during incidents or capacity decisions. Remove duplicate collectors that publish the same signal under different names.

Build a recurring control loop

1

Attribute the spend

Break CloudWatch cost down by usage type, account, region, and workload.
2

Find the largest producer

Rank log groups by incoming bytes and custom metrics by series count.
3

Change one source

Reduce noisy logs, bound dimensions, or shorten retention for a clearly classified signal.
4

Verify the result

Compare usage after the change and confirm that incident response still has the data it needs.
Springwinter reads workload logs and metrics from CloudWatch in your AWS account. The same principle applies whether you use Springwinter or AWS directly: collect enough information to operate the service, but do not make unlimited telemetry the default. See logs, metrics, and cost for the product surfaces.

Frequently asked questions

High CloudWatch bills commonly come from log ingestion volume, indefinite retention, Logs Insights data scans, high-cardinality custom metrics, detailed monitoring, Container Insights, alarms, and dashboards. Group billing data by usage type before changing configuration so you address the actual cost driver.
Shorter retention reduces archived storage after logs arrive, but it does not reduce ingestion charges. Reduce ingestion at the source by removing duplicate messages, filtering health checks, sampling high-volume successes, lowering verbose production log levels, and keeping structured events concise.
Every unique custom metric name and complete dimension set creates a separate time series. Unbounded values such as user IDs, request IDs, and raw URLs can create thousands of billable series. Keep dimensions bounded and store per-request detail in logs or traces.

Sources and further reading

Last modified on October 8, 2026