{"record":{"id":"8db43a6be52ccbee","repo":"SigNoz/signoz","slug":"errcodedashboardinvaliddata","errorCode":"ErrCodeDashboardInvalidData","errorMessage":"invalid dashboard data","messagePattern":"invalid dashboard data","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"pkg/types/dashboardtypes/dashboard.go","lineNumber":349,"sourceCode":"\t\tWidgets []struct {\n\t\t\tPanelTypes string `json:\"panelTypes\"`\n\t\t\tQuery      struct {\n\t\t\t\tBuilder struct {\n\t\t\t\t\tQueryData          []map[string]any `json:\"queryData\"`\n\t\t\t\t\tQueryFormulas      []map[string]any `json:\"queryFormulas\"`\n\t\t\t\t\tQueryTraceOperator []map[string]any `json:\"queryTraceOperator\"`\n\t\t\t\t} `json:\"builder\"`\n\t\t\t\tClickhouseSQL []map[string]any `json:\"clickhouse_sql\"`\n\t\t\t\tPromQL        []map[string]any `json:\"promql\"`\n\t\t\t\tQueryType     string           `json:\"queryType\"`\n\t\t\t} `json:\"query\"`\n\t\t\tFillGaps bool `json:\"fillSpans\"`\n\t\t} `json:\"widgets\"`\n\t}\n\n\tdataJSON, err := json.Marshal(dashboard.Data)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, errors.TypeInvalidInput, ErrCodeDashboardInvalidData, \"invalid dashboard data\")\n\t}\n\n\tvar data dashboardData\n\terr = json.Unmarshal(dataJSON, &data)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, errors.TypeInvalidInput, ErrCodeDashboardInvalidData, \"invalid dashboard data\")\n\t}\n\n\tif int(widgetIndex) >= len(data.Widgets) {\n\t\treturn nil, errors.Newf(errors.TypeInvalidInput, ErrCodeDashboardInvalidInput, \"widget with index %v doesn't exist\", widgetIndex)\n\t}\n\n\tcompositeQueries := []any{}\n\twidgetData := data.Widgets[widgetIndex]\n\tswitch widgetData.Query.QueryType {\n\tcase \"builder\":\n\t\tfor _, query := range widgetData.Query.Builder.QueryData {\n\t\t\tqueryName, ok := query[\"queryName\"].(string)","sourceCodeStart":331,"sourceCodeEnd":367,"githubUrl":"https://github.com/SigNoz/signoz/blob/5069bf80b08f1f00d7e014eccc09902f9871004f/pkg/types/dashboardtypes/dashboard.go#L331-L367","documentation":"GetWidgetQuery serializes dashboard.Data to JSON and then unmarshals it into an internal dashboardData struct. This first failure means dashboard.Data itself cannot be marshalled to JSON — almost always because Data holds a value with an unsupported type (chan, func, complex number, cyclic reference) or a custom MarshalJSON that errors.","triggerScenarios":"Calling GetWidgetQuery (via GetPublicWidgetQueryRange) on a dashboard whose Data field contains unserializable values or a nested type whose MarshalJSON returns an error.","commonSituations":"Programmatically constructed Dashboard objects (not decoded from JSON) holding Go-native non-serializable fields; custom data types injected into Data by integrations; cyclic structs from builder patterns.","solutions":["Ensure dashboard.Data contains only JSON-serializable values (maps, slices, strings, numbers, bools)","If using custom types, implement error-free json.Marshaler on them","Construct dashboards by decoding from JSON so Data is inherently plain"],"exampleFix":"// before\ndashboard.Data = map[string]any{\"ch\": make(chan int)}\n\n// after\ndashboard.Data = map[string]any{\"widgets\": []any{}}","handlingStrategy":"validation","validationCode":"if _, err := json.Marshal(dashboard.Data); err != nil {\n    return fmt.Errorf(\"dashboard.Data not serializable: %w\", err)\n}","typeGuard":"func dataIsJSONSafe(v any) bool {\n    enc := json.NewEncoder(io.Discard)\n    enc.SetDiscard() // or use Marshal\n    _, err := json.Marshal(v)\n    return err == nil\n}","tryCatchPattern":"q, err := d.GetWidgetQuery(idx, ...)\nif err != nil && strings.Contains(err.Error(), \"invalid dashboard data\") {\n    return errors.New(\"dashboard data is not valid JSON-compatible; re-save the dashboard in the UI\")\n}","preventionTips":["Build dashboards from decoded JSON, not native Go structs","Avoid funcs/chans/cycles inside Data"],"tags":["dashboard","json-marshal","serialization"],"backgroundTag":"json-marshal-failed","analyzedSha":"5069bf80b08f1f00d7e014eccc09902f9871004f","analyzedAt":"2026-08-28T06:22:12.824Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}