{"record":{"id":"64bb75ca98dfabb4","repo":"SigNoz/signoz","slug":"builder-query-s-is-invalid-w","errorCode":null,"errorMessage":"builder query %s is invalid: %w","messagePattern":"builder query (.+?) is invalid: %w","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"pkg/query-service/model/v3/v3.go","lineNumber":620,"sourceCode":"\t\tif len(query.GroupBy) > 0 && c.PanelType == PanelTypeList {\n\t\t\tquery.GroupBy = []AttributeKey{}\n\t\t}\n\t}\n}\n\nfunc (c *CompositeQuery) Validate() error {\n\tif c == nil {\n\t\treturn fmt.Errorf(\"composite query is required\")\n\t}\n\n\tif c.BuilderQueries == nil && c.ClickHouseQueries == nil && c.PromQueries == nil && len(c.Queries) == 0 {\n\t\treturn fmt.Errorf(\"composite query must contain at least one query type\")\n\t}\n\n\tif c.QueryType == QueryTypeBuilder {\n\t\tfor name, query := range c.BuilderQueries {\n\t\t\tif err := query.Validate(c.PanelType); err != nil {\n\t\t\t\treturn fmt.Errorf(\"builder query %s is invalid: %w\", name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif c.QueryType == QueryTypeClickHouseSQL {\n\t\tfor name, query := range c.ClickHouseQueries {\n\t\t\tif err := query.Validate(); err != nil {\n\t\t\t\treturn fmt.Errorf(\"clickhouse query %s is invalid: %w\", name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif c.QueryType == QueryTypePromQL {\n\t\tfor name, query := range c.PromQueries {\n\t\t\tif err := query.Validate(); err != nil {\n\t\t\t\treturn fmt.Errorf(\"prom query %s is invalid: %w\", name, err)\n\t\t\t}\n\t\t}","sourceCodeStart":602,"sourceCodeEnd":638,"githubUrl":"https://github.com/SigNoz/signoz/blob/5069bf80b08f1f00d7e014eccc09902f9871004f/pkg/query-service/model/v3/v3.go#L602-L638","documentation":"Thrown by CompositeQuery.Validate when a query in the BuilderQueries map fails its own BuilderQuery.Validate for the given panel type. The %s is the map key (query name) and %w wraps the inner validation error explaining the actual problem.","triggerScenarios":"POSTing a v3 composite query with queryType=builder where one of the BuilderQueries entries has an empty expression, missing query name, invalid aggregate operator, invalid filters, etc.","commonSituations":"Building dashboard/chart API payloads by hand, migrating from v2 payloads, formulas referencing misconfigured queries, or UI-generated queries with incomplete builder fields.","solutions":["Inspect the wrapped error (%w) — it names the exact field that failed inside the builder query","Ensure each BuilderQueries entry has QueryName, Expression, and a valid DataSource","Validate the payload client-side with the same rules before sending (e.g. check Expression != \"\")","Check panel type compatibility (e.g. value panels with group by need SecondaryAggregation)"],"exampleFix":"// before\n{\"queryType\":\"builder\",\"builderQueries\":{\"A\":{\"expression\":\"\"}}}\n// after\n{\"queryType\":\"builder\",\"builderQueries\":{\"A\":{\"queryName\":\"A\",\"expression\":\"A\",\"dataSource\":\"metrics\"}}}","handlingStrategy":"validation","validationCode":"func validBuilderQuery(q v3.BuilderQuery) error {\n\tif q.QueryName == \"\" || q.Expression == \"\" { return errors.New(\"queryName and expression required\") }\n\tif err := q.DataSource.Validate(); err != nil { return err }\n\treturn nil\n}\nfor name, q := range composite.BuilderQueries {\n\tif err := validBuilderQuery(q); err != nil { return fmt.Errorf(\"query %s: %w\", name, err) }\n}","typeGuard":"func isSimpleBuilderQuery(q v3.BuilderQuery) bool {\n\treturn q.QueryName != \"\" && q.Expression != \"\" && q.DataSource != \"\"\n}","tryCatchPattern":"if err := compositeQuery.Validate(); err != nil {\n\t// err already contains query name; log and map to 400 Bad Request\n\thttp.Error(w, err.Error(), http.StatusBadRequest)\n}","preventionTips":["Always call Validate() on the composite query before persisting dashboards","Keep queryName/expression/dataSource as required fields in your client-side schema"],"tags":["go","query-validation","builder-query"],"backgroundTag":"query-payload-validation-failed","analyzedSha":"5069bf80b08f1f00d7e014eccc09902f9871004f","analyzedAt":"2026-08-28T06:22:12.824Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}