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

  1. Inspect dashboard.Data for NaN/Inf floats, func/chan fields, or cycles and sanitize them before calling the API
  2. Load the dashboard from the DB/API (already validated JSON) instead of constructing it in memory
  3. 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

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


AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28). Data as JSON: /api/errors/3674fab6f4b79a48. Report an issue: GitHub.