{"record":{"id":"939c6df5ca59e311","repo":"SigNoz/signoz","slug":"dashboard-invalid-widget-query","errorCode":"dashboard_invalid_widget_query","errorMessage":"cannot type cast query name as string","messagePattern":"cannot type cast query name as string","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"pkg/types/dashboardtypes/dashboard.go","lineNumber":369,"sourceCode":"\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)\n\t\t\tif !ok {\n\t\t\t\treturn nil, errors.New(errors.TypeInvalidInput, ErrCodeDashboardInvalidWidgetQuery, \"cannot type cast query name as string\")\n\t\t\t}\n\t\t\tcompositeQueries = append(compositeQueries, querybuildertypesv5.WrapInV5Envelope(queryName, query, \"builder_query\"))\n\t\t}\n\t\tfor _, query := range widgetData.Query.Builder.QueryFormulas {\n\t\t\tqueryName, ok := query[\"queryName\"].(string)\n\t\t\tif !ok {\n\t\t\t\treturn nil, errors.New(errors.TypeInvalidInput, ErrCodeDashboardInvalidWidgetQuery, \"cannot type cast query name as string\")\n\t\t\t}\n\t\t\tcompositeQueries = append(compositeQueries, querybuildertypesv5.WrapInV5Envelope(queryName, query, \"builder_formula\"))\n\t\t}\n\t\tfor _, query := range widgetData.Query.Builder.QueryTraceOperator {\n\t\t\tqueryName, ok := query[\"queryName\"].(string)\n\t\t\tif !ok {\n\t\t\t\treturn nil, errors.New(errors.TypeInvalidInput, ErrCodeDashboardInvalidWidgetQuery, \"cannot type cast query name as string\")\n\t\t\t}\n\t\t\tcompositeQueries = append(compositeQueries, querybuildertypesv5.WrapInV5Envelope(queryName, query, \"builder_trace_operator\"))\n\t\t}\n\tcase \"clickhouse_sql\":","sourceCodeStart":351,"sourceCodeEnd":387,"githubUrl":"https://github.com/SigNoz/signoz/blob/5069bf80b08f1f00d7e014eccc09902f9871004f/pkg/types/dashboardtypes/dashboard.go#L351-L387","documentation":"GetWidgetQuery iterates builder query data maps and requires each entry's queryName key to be a JSON string. When queryName is absent, a number, or another type, the type assertion query[\"queryName\"].(string) fails with this error.","triggerScenarios":"Dashboard widget with query.builder.queryData entries where queryName is missing or non-string (e.g. numeric 1); dashboards imported/converted from other formats that normalize names to numbers.","commonSituations":"Hand-edited dashboard JSON; conversion tools from Grafana/Perses that emit integer query names; frontend regressions writing queryName as a number.","solutions":["Ensure every queryData entry has \"queryName\":\"A\" style string","Fix the import/conversion script to stringify query names","Validate dashboard JSON against the builder schema before save","Re-save the widget from the UI editor which enforces string names"],"exampleFix":"// before\n{\"queryName\":1,\"expression\":\"...\"}\n// after\n{\"queryName\":\"1\",\"expression\":\"...\"}\n","handlingStrategy":"type-guard","validationCode":"widget.query?.builder?.queryData?.every(q => typeof q.queryName === 'string') ?? true","typeGuard":"function validQueryData(qs: Array<Record<string, unknown>>): boolean { return qs.every(q => typeof q.queryName === 'string'); }","tryCatchPattern":null,"preventionTips":["Validate dashboard JSON on import","Always author queryName as string in generators"],"tags":["dashboard","widget","query-builder","type-cast","go"],"backgroundTag":"json-unmarshal-type-mismatch","analyzedSha":"5069bf80b08f1f00d7e014eccc09902f9871004f","analyzedAt":"2026-08-28T06:22:12.824Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}