Grafana / Editorial solution guide
The source returns rows but the panel is empty
Locate scope, field-type, frame-shape, transformation, and visualization mismatches before changing source credentials or replacing missing data with zero.
Read-only knowledge base ยท No public comments
Recognize the symptoms
A query appears to return data, but a time-series or stat panel shows nothing, an unexpected field, or an old value. A table or exploratory view may look different. The symptom can start after a plugin, query, variable, or field-name change.
Understand the likely causes
- Possible causes include different source or time scope, a numeric value represented as text, an unsupported timestamp, long versus wide frames, a transformation that removes the field, or a reducer that selects only missing values. Query success alone does not establish that the response fits the chosen visualization.
Freeze the exact response and panel contract
Record Grafana and plugin versions, edition or hosting, source UID, query, variables, absolute time range, panel type, and known last-good revision. Use safe synthetic response examples rather than copying customer data. Confirm that the displayed query result belongs to the same source and scope as the failing panel. A separate Explore query can use different defaults or credentials. This guide reads no real inspector output and changes no account, source, query, dashboard, or service.
Inspect the untransformed fields first
Check field names, types, time units, labels, row alignment, null positions, and frame count. The offline fixture finds a synthetic delay field stored as text, which needs a reviewed type contract before numeric visualization. It does not parse a Grafana frame or prove that conversion is the correct repair. A timestamp named Time can still have the wrong unit or timezone meaning. Keep source correctness separate: rows can be well formed while describing the wrong population. Do not resolve an empty display by coercing every null or invalid string into zero.
rows = [{"route":"r1", "delay_seconds":"6"}]
value = rows[0]["delay_seconds"]
if isinstance(value, str):
print("review-source-type-and-explicit-conversion")
elif value is None:
print("preserve-missing-evidence")
else:
print("inspect-frame-and-display-selection")
review-source-type-and-explicit-conversion
The fixed dictionary is the entire fixture. It performs no Grafana query, type conversion, frame validation, or rendering.
Trace each intermediate transformation
Review filter, join, rename, conversion, and reduction steps in order. A missing key can remove rows, duplicate metadata can multiply them, and an early reduction can discard Time before a later operation needs it. Compare intermediate shapes with the intended contract. Temporarily simplifying a real panel must follow its authorized review workflow; this editorial guide executes no UI action. Check overrides and exact field matchers after names change. A broad regex can target another field while the intended field disappears from the displayed selection.
Repair the narrow mismatch and preserve unknowns
Choose the evidence-supported correction: align source scope, restore a truthful type, reshape through a supported transformation, repair a join key, or select the intended field and reducer. Keep units and missing-data semantics intact. A last-available value may be stale rather than current; exposing freshness can be more honest than filling the panel. Do not change backend credentials or broaden permissions merely because a renderer is empty. Record version assumptions, expected result, and consumer effects before any actual authorized change.
Verify the fix
Use known synthetic rows containing normal, zero, null, stale, renamed, and differently typed fields. Verify the source population, intermediate frames, selected field, reducer, unit, and freshness separately in the authorized integration if available. State exactly whether only the local type fixture ran. A populated panel alone cannot prove source correctness, access isolation, or complete history.
Keep it from recurring
- Version query, frame, transformation, and display contracts together. Keep field-name and type fixtures through plugin or source upgrades, and make no-data and stale behavior explicit. Review default variables and source UID mappings whenever a panel is reused so future empty results lead to a staged diagnosis rather than cosmetic zero replacement.