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.
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(value_sum) / sum(value_count) |
| Statistic Sum | sum(value_sum) |
| Statistic Min / Max | min(value_min) / max(value_max) |
Dimension InstanceId=i-123 | WHERE 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 _timestamp, sum(value_sum) / sum(value_count) AS avg_cpu
FROM cloudwatch_metrics
WHERE namespace = 'AWS/EC2' AND metric_name = 'CPUUtilization'
GROUP BY _timestampAdd dimensions_<name> filters 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 value_sum / value_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
Last updated on