Migrating Dashboards
Overview
CloudWatch dashboards are JSON documents of metric widgets. There are two ways to move them to OpenObserve:
- 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.
- 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
- 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).
- Connect (optional) — point the tool at your OpenObserve instance so it can read your live stream catalog and validate the stream name.
- Review — inspect the translated widgets and queries.
- 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 concept | OpenObserve SQL |
|---|---|
Metric CPUUtilization in AWS/EC2 | WHERE namespace = 'AWS/EC2' AND metric_name = 'CPUUtilization' |
| Statistic Average | sum("sum") / sum("count") |
| Statistic Sum | sum("sum") |
| Statistic Min / Max | min("min") / max("max") |
Dimension InstanceId=i-123 | WHERE str_match(metric_dimensions, 'InstanceId=["i-123"]') |
| Period / time range | Time 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-1The 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 tsAdd 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
- OpenObserve Dashboards Documentation — dashboard builder, panel types, and variables
- OpenObserve Alerts Documentation — recreate CloudWatch alarms as OpenObserve alerts