SigNoz/signoz · error
ErrCodeDashboardInvalidData
ErrCodeDashboardInvalidData
Error message
invalid dashboard data
What it means
NewPublicDashboardDataFromDashboard marshals the dashboard's Data to JSON and unmarshals it into an internal dashboardData struct to sanitize widgets for public display. Failure at this first step (line 123) means dashboard.Data itself could not be serialized — essentially a marshaling failure of a Dashboard that was constructed programmatically rather than loaded from validated storage.
Source
Thrown at pkg/types/dashboardtypes/public_dashboard.go:123
type dashboardData struct {
Widgets []struct {
PanelTypes string `json:"panelTypes"`
Query struct {
Builder struct {
QueryData []map[string]any `json:"queryData"`
QueryFormulas []map[string]any `json:"queryFormulas"`
QueryTraceOperator []map[string]any `json:"queryTraceOperator"`
} `json:"builder"`
ClickhouseSQL []map[string]any `json:"clickhouse_sql"`
PromQL []map[string]any `json:"promql"`
QueryType string `json:"queryType"`
} `json:"query"`
} `json:"widgets"`
}
dataJSON, err := json.Marshal(dashboard.Data)
if err != nil {
return nil, errors.Wrapf(err, errors.TypeInvalidInput, ErrCodeDashboardInvalidData, "invalid dashboard data")
}
var data dashboardData
err = json.Unmarshal(dataJSON, &data)
if err != nil {
return nil, errors.Wrapf(err, errors.TypeInvalidInput, ErrCodeDashboardInvalidData, "invalid dashboard data")
}
for idx, widget := range data.Widgets {
updatedQueryData := []map[string]any{}
for _, queryData := range widget.Query.Builder.QueryData {
updatedQueryMap := map[string]any{}
updatedQueryMap["aggregations"] = queryData["aggregations"]
updatedQueryMap["legend"] = queryData["legend"]
updatedQueryMap["queryName"] = queryData["queryName"]
updatedQueryMap["expression"] = queryData["expression"]
updatedQueryMap["groupBy"] = queryData["groupBy"]
updatedQueryMap["dataSource"] = queryData["dataSource"]View on GitHub (pinned to 5069bf80b0)
Solutions
- Inspect dashboard.Data for NaN/Inf floats, func/chan fields, or cycles and sanitize them before calling the API
- Load the dashboard from the DB/API (already validated JSON) instead of constructing it in memory
- Add a pre-check json.Marshal in your own code to get the precise offending field from the wrapped error
Example fix
// before
data, err := dashboardtypes.NewPublicDashboardDataFromDashboard(dash)
// after
if _, err := json.Marshal(dash.Data); err != nil {
return fmt.Errorf("dashboard data not serializable: %w", err)
}
data, err := dashboardtypes.NewPublicDashboardDataFromDashboard(dash) Defensive patterns
Strategy: validation
Validate before calling
if _, err := json.Marshal(dash.Data); err != nil {
return fmt.Errorf("dashboard data not serializable: %w", err)
} Prevention
- Never put NaN/Inf, funcs, or cyclic structures into panel data
- Load dashboards from validated storage rather than building them ad hoc
When it happens
Trigger: Calling GetPublicData (or NewPublicDashboardDataFromDashboard directly) on a Dashboard whose Data contains values json.Marshal cannot handle: NaN/Inf float fields, channels, funcs, or cyclic references in panel data.
Common situations: Building a Dashboard struct in Go code with untyped map[string]any panel data containing unsupported values; dashboards assembled from templated generation code; unit fixtures with float NaN defaults.
Related errors
- ErrCodePublicDashboardInvalidInput
- invalid_input
- public_dashboard_invalid_input
- err.Error()
- CodeLicenseUnavailable
AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28).
Data as JSON: /api/errors/3674fab6f4b79a48.
Report an issue: GitHub.