What Is New in Grafana 9.0
| Category | Highlights |
|---|---|
| New Features | Visual query builders for Prometheus and Loki; modern heatmap panel; Grafana Alerting enabled by default; envelope encryption GA; dashboard previews (beta); panel-title search (beta); expanded navigation bar; starred dashboards in nav; Explore-to-Dashboard workflow; command palette; error trace IDs; query-history migration; RBAC GA; multi-dashboard reports and embedded images. |
| Improvements | Heatmap rendering up to orders of magnitude faster; support for exemplars, sparse histograms and smarter auto-bucket sizing; navigation UI refinements; full-text panel-title index; richer alert state history UI; faster query history stored in DB; updated clock and polystat panels for compatibility. |
| Bug Fixes | Regex rename transformation now supports global patterns; backendSrv.fetch now throws on invalid JSON; deprecated UI helpers removed; endpoint /api/tsdb/query retired. |
| Breaking Changes | RBAC replaces legacy access control with new schema and role naming; Loki logs format changed, affecting transformations; NaN handling unified for Prometheus and Loki; Elasticsearch versions < 7.10.0 and browser-access mode dropped; envelope encryption now default (disableEnvelopeEncryption flag); clock panel v1.x crashes, upgrade required; polystat panel v1.2.8+ incompatible. |
| Deprecations | Removed getColorForTheme, TextDisplayOptions, getFormStyles; deprecated /api/tsdb/query endpoint; old clock and polystat panel versions. |
How do the new visual query builders make Prometheus and Loki queries easier?
The new UI query builders let you construct PromQL and LogQL expressions without typing the raw syntax.
- Start by selecting a metric or label filter; both act as mutual filters.
- Operations (functions, aggregations, binary ops) are added via a "+ Operation" button and displayed in execution order.
- Range vectors are auto-added for functions like
rateorincrease. - Switch between the visual builder and raw code while preserving changes, thanks to a full-featured parser.
In practice, a team can onboard new SREs faster because the builder shows parameter names, documentation links, and a live preview of the generated query.
# Example: adding a rate function in the builder
metric: http_requests_total
operation: rate[5m]
What changes does Grafana 9 bring to alerting and how can I revert to legacy alerts?
Grafana Alerting (formerly unified alerting) is now enabled by default and all existing legacy rules are migrated automatically.
- Alert state history now distinguishes "Alerting (NoData)" and "Alerting (Error)".
- Images of dashboard panels can be attached to notifications when the alert references a specific panel UID and ID.
- To switch back, set
GF_UNIFIED_ALERTING_ENABLED=false(orGF_UNIFIED_ALERTING_ENABLED = falseingrafana.ini) before starting Grafana.
This matters if you rely on custom legacy UI extensions that have not yet been ported to the new alerting engine.
Why is the new heatmap panel considered a major performance upgrade?
The new heatmap panel uses the modern panel option architecture and renders up to 10× faster than the old version.
- Supports exemplars overlay, Prometheus sparse histograms, and configurable color steps.
- Smart auto-bucket sizing for unbucketed data and filters out near-zero bucket values.
- Assumes pre-bucketed data by default, allowing thousands of series with high-resolution points without UI lag.
Most production teams see a noticeable reduction in browser memory usage when visualizing large time-series datasets.
What are the key breaking changes I need to address before upgrading to Grafana 9?
Several core components have changed semantics or APIs, so a careful audit is required.
- RBAC: Built-in roles renamed to "basic roles", permission inheritance removed, provisioning schema updated.
- Loki logs format: Logs now come as a single dataframe with a
labelsfield; replace "Labels to fields" transformation with "Extract fields". - NaN handling: Both Prometheus and Loki now keep NaN values unchanged for all query types.
- Elasticsearch: Versions older than 7.10.0 and browser-access mode are no longer supported.
- Envelope encryption: Enabled by default; older nodes must have
disableEnvelopeEncryption=trueif you need to keep compatibility. - Plugins & panels: Update clock panel to ≥ 2.0.0 and polystat panel to ≥ 1.2.10; adjust code that uses removed UI helpers.
Watch out for CI pipelines that generate dashboards programmatically; they may need to adapt to the new role names and transformation changes.
How do the UI/UX enhancements like the command palette and expanded navigation improve daily workflows?
The command palette (⌘K / Ctrl K) provides instant access to navigation, panel creation, and common actions without leaving the keyboard.
- Expanded navigation bar shows all installed integrations at a glance.
- Starred dashboards appear directly in the nav when the
savedItemsflag is enabled. - Dashboard previews (beta) give a thumbnail overview of all dashboards, speeding up discovery.
- Panel-title full-text search (beta) enables fast lookup of panels by name.
In practice, engineers report a 20 % reduction in time spent navigating large Grafana instances.
Frequently Asked Questions
Can I disable the new visual query builder for Prometheus?
You can turn it off by setting prometheus.queryBuilderEnabled=false in the datasource configuration.
What command reverts Grafana Alerting to the legacy system?
Set GF_UNIFIED_ALERTING_ENABLED=false in the environment or grafana.ini before starting Grafana.
Do I need to update my Loki transformations after upgrading?
Yes, replace any "Labels to fields" transformation with an "Extract fields" transformation that targets the new labels field.
Is the old heatmap panel still usable?
The legacy heatmap panel is deprecated and will not receive updates; you should migrate to the new panel.
How do I enable envelope encryption on older Grafana versions?
Add envelopeEncryption=true to the feature toggles in custom.ini before upgrading.
What is the syntax to add a rate function in the Prometheus query builder?
metric: http_requests_total operation: rate[5m]