OpenObserve Docs
MigrationMigrate from cloudwatch to openobserve

Migrating Dashboards

Updated View MarkdownOpen in ChatGPTOpen in Claude

Overview

CloudWatch dashboards are JSON documents of metric widgets. There are two ways to move them to OpenObserve:

  1. Automated — the OpenObserve Dashboard Migrator converts CloudWatch dashboard JSON into OpenObserve dashboards, turning each metric widget into a SQL query over your CloudWatch metrics stream.
  2. Manual — recreate each dashboard by hand.

For most teams the automated path handles the bulk of the work; the manual path is a fallback and a way to understand what changed.

Migrate automatically with the Dashboard Migrator

The OpenObserve Dashboard Migrator is a free web tool that converts dashboards from CloudWatch — and Datadog, Grafana, and Kibana — into OpenObserve-native objects. For CloudWatch it reads a dashboard's widgets array and produces an OpenObserve dashboard with the widgets, layout, and variables translated.

To open it from OpenObserve, go to Dashboards, click Import, and choose Migrate from CloudWatch.

How it works

  1. Load Dashboards — paste or upload the dashboard JSON, or browse your dashboards directly from AWS (the tool provides a read-only CloudFormation template to grant it access).
  2. Connect (optional) — point the tool at your OpenObserve instance so it can read your live stream catalog and validate the stream name.
  3. Review — inspect the translated widgets and queries.
  4. Export — create the dashboards directly in OpenObserve, or download JSON to import.

How CloudWatch metrics map to SQL

Because CloudWatch metrics arrive as a logs stream (see the overview), every metric widget becomes a SQL query over that stream:

CloudWatch conceptOpenObserve SQL
Metric CPUUtilization in AWS/EC2WHERE namespace = 'AWS/EC2' AND metric_name = 'CPUUtilization'
Statistic Averagesum("sum") / sum("count")
Statistic Sumsum("sum")
Statistic Min / Maxmin("min") / max("max")
Dimension InstanceId=i-123WHERE str_match(metric_dimensions, 'InstanceId=["i-123"]')
Period / time rangeTime filter on _timestamp

What's skipped

The migrator flags widgets it can't convert, rather than guessing:

  • Logs Insights widgets — these query log data, not metrics; they're skipped with a note to recreate as OpenObserve SQL.
  • Alarm widgets — CloudWatch alarms are not migrated (see below).

Export your CloudWatch configuration first

Pull a static snapshot before you start:

# List dashboards
aws cloudwatch list-dashboards --region us-east-1

# Fetch one dashboard body
aws cloudwatch get-dashboard --dashboard-name <name> --region us-east-1

The get-dashboard response wraps the body in a DashboardBody string; the migrator accepts either that wrapper or the raw { "widgets": [...] } body.

Migrating manually

If you prefer to rebuild by hand, translate each metric widget to a SQL query over the metrics stream. For example, an Average of CPUUtilization for AWS/EC2 across all instances:

SELECT histogram(_timestamp) AS ts, sum("sum") / sum("count") AS avg_cpu
FROM cloudwatch_metrics
WHERE namespace = 'AWS/EC2' AND metric_name = 'CPUUtilization'
GROUP BY ts
ORDER BY ts

Add str_match(metric_dimensions, '<Dimension>=["<value>"]') filters (or a region filter) to narrow to specific instances, regions, or auto-scaling groups, and use the same aggregation mapping shown above for Sum/Min/Max.

CloudWatch alarms

CloudWatch alarms are not migrated by the Dashboard Migrator. To move an alarm, recreate it as an OpenObserve scheduled alert: take the alarm's metric, statistic, and threshold, express them as a SQL query (using the same sum / count mapping), and attach the notification destination. See the Alerts documentation for details.

Next steps


Back to Overview

Was this page helpful?

On this page