/observe
GitHubGet started

Coming from Grafana? Bring your dashboards.

Connect a Grafana with a read-only token. Every dashboard comes across with its folder, tags, variables and links, and unmatched panels are listed, not hidden. Every imported query runs. Panels whose queries fail or return nothing go to a repair queue the agent repairs when you ask; placeholders are listed for you to redo by hand. The old links keep resolving, and nothing is written back.

34Grafana panel types with importable options, legacy ones included
100%of the public test corpus converts with no placeholder and nothing left behind

Generated from the importer's test corpus and option catalogs at each release. Never typed.

ConnectImportRepairKeep the links

Connect

Settings › Grafana takes a Grafana URL and a service account token with the Viewer role on the folders to import. The test counts top-level folders and dashboards; the import form shows each Grafana datasource beside its match.

Import, and import again

Choose "Import", then "All folders" and "Start import". Every dashboard comes across with its tags, variables and links, and every imported query runs. A nested folder path is kept as one folder titled Parent / Child. A second run skips dashboards unchanged in Grafana and saves a new version of those that changed; your edits stay in the version history.

Repair

Panels whose queries fail or return nothing go to a repair queue the agent works through; placeholders are listed for you to redo by hand. Those panels are marked unverified, never hidden, and "Repair with the agent" rewrites their queries against the metrics that exist and saves a version you can diff.

Keep the links

Every imported dashboard keeps its Grafana uid, so /d/<uid>/<slug> here redirects to the imported dashboard. Point the old hostname at SlashObserve and runbooks, wiki pages and alert links keep working.

observe.example.com/settings/grafana
GrafanaConnect a Grafana server and import its dashboards with their folders.
GeneralGrafana
NameURLLast testLast importActions
prodhttps://grafana.internalConnected: 14 top-level folders, 212 dashboards.2 min agoNeverTestImportDelete
Import from prodChoose what to bring over and check the datasource matches.
FoldersAll folders (212 dashboards)Choose folders
Datasources
In GrafanaTypeUse in SlashObserve
Prometheus mainprometheusprom (Prometheus)
ClickHouse eventsgrafana-clickhouse-datasourcech (ClickHouse)
3 datasources have types SlashObserve does not query; their panels import as placeholders.
Start importCancel
Add a connectionA Grafana URL and a service account token with the Viewer role on the folders to import.
observe.example.com/import/repair
Repair queueAll foldersRepair all
DashboardFolderUnverifiedPlaceholdersImportedRepairActions
Kubernetes / PodsPlatform / Kubernetes3 panels02 h agoRepairingRepair with the agent
Node exporter fullInfra5 panels, 1 variable02 h agoRepair queuedRepair with the agent
Payments latencyPlatform / Shop1 panel02 h agoRepaired, still failing12 min agoRepair with the agent
Ingest pipelineObservability2 panels32 h agoRepair failed1 h agoRepair with the agent
Checkout servicePlatform / Shop1 panel02 h agoNot requestedRepair with the agent
Graphite legacyInfraNone42 h agoNot requestedRepair with the agent
Old links

What maps, what changes, what waits.

How each Grafana feature comes across. The numbers above are generated from the importer at every release; this table describes the mapping.

Grafana featureStatusWhat happens on import
Time series, stat, gauge, bar gauge, table, text, logs, tracesMapsEach becomes the matching ObserveSpec panel with its units, thresholds, overrides and legend, when its datasource is Prometheus or ClickHouse.
Template variablesMapsNames and formats are kept, so $job and ${job:regex} expand as before.
TransformsMapsOrganize, merge, reduce, filter, group by, join and the rest of the table. An unsupported transformation is dropped and reported at its path; the panel imports as partial.
Rows and collapsed rowsMapsRows become row panels; collapsed state and repeat are kept.
Folders, tags, dashboard linksChangesA nested folder becomes one folder titled Parent / Child. Tags are lowercased and capped at 20. Links to an address and links by tag are kept.
Gradients, shadows, panel backgroundsChangesDrawn flat. Colour stays on data and status; the chrome is monochrome by design.
Stat colour mode "value"ChangesThe threshold colour pairs with an icon and a word instead of colouring the digits, so warning stays readable on white.
Third-party plugin panelsChangesWorldmap, singlestat, the pie chart plugin and the discrete panel become native geomap, stat or gauge, pie chart and state timeline panels. Any other plugin imports as a placeholder that keeps its title and layout; the original dashboard JSON stays with the import record.
AnnotationsWaitsAnnotation queries are reported and not imported; built-in annotations are skipped. Add markers with observe annotate or the API.
Alert rules, contact points, silencesWaitsNot imported in this release. Keep Alertmanager or Grafana alerting running beside SlashObserve.
Other datasourcesWaitsPanels on a datasource type SlashObserve does not query yet (Loki, Tempo, Elasticsearch and others) import as placeholders that keep the title, layout and reason. The original dashboard JSON stays with the import record.

The same import, scripted.

Everything the Settings page does is a verb, so a migration can run from CI or a runbook and be repeated.

zsh
$ printf '%s' "$GRAFANA_TOKEN" | observe grafana connect \ https://grafana.internal:3000 --token-stdin --name prodConnected prod: 0b6f2c1e-7d4a-4f3b-9a51-2c8e6d1f0a37Connected: 14 top-level folders, 212 dashboards. $ observe grafana import 0b6f2c1e-7d4a-4f3b-9a51-2c8e6d1f0a37 --all212 done, 0 skipped, 0 failed of 2123 dashboards have panels that did not verify # They wait in the repair queue at /import/repair, worked by the agent.

Import your dashboards this afternoon.

Point it at a Grafana you can read, or run the demo stack's own export through the importer. Nothing is written back.