SigNoz/signoz · error

ErrCodeDashboardInvalidWidgetQuery

ErrCodeDashboardInvalidWidgetQuery

Error message

invalid query request

What it means

GetWidgetQuery builds a QueryRangeRequest by marshalling an intermediate map (queryRangeReq) and unmarshalling into querybuildertypesv5.QueryRangeRequest. This first 'invalid query request' fires when that intermediate map cannot be marshalled — e.g. a value inside the request map is a func/chan or otherwise non-serializable.

Source

Thrown at pkg/types/dashboardtypes/dashboard.go:431

	}

	queryRangeReq := map[string]any{
		"schemaVersion": "v1",
		"start":         startTime,
		"end":           endTime,
		"requestType":   dashboard.getQueryRequestTypeFromPanelType(widgetData.PanelTypes),
		"compositeQuery": map[string]any{
			"queries": compositeQueries,
		},
		"formatOptions": map[string]any{
			"fillGaps":               widgetData.FillGaps,
			"formatTableResultForUI": widgetData.PanelTypes == "table",
		},
	}

	req, err := json.Marshal(queryRangeReq)
	if err != nil {
		return nil, errors.Wrapf(err, errors.TypeInvalidInput, ErrCodeDashboardInvalidWidgetQuery, "invalid query request")
	}

	queryRangeRequest := new(querybuildertypesv5.QueryRangeRequest)
	err = json.Unmarshal(req, queryRangeRequest)
	if err != nil {
		return nil, errors.Wrapf(err, errors.TypeInvalidInput, ErrCodeDashboardInvalidWidgetQuery, "invalid query request")
	}

	return queryRangeRequest, nil
}

func (dashboard *Dashboard) getQueryRequestTypeFromPanelType(panelType string) querybuildertypesv5.RequestType {
	switch panelType {
	case "graph", "bar":
		return querybuildertypesv5.RequestTypeTimeSeries
	case "table", "pie", "value":
		return querybuildertypesv5.RequestTypeScalar
	case "trace":

View on GitHub (pinned to 5069bf80b0)

Solutions

  1. Inspect the widget's query data and remove non-serializable values
  2. Keep widget query data limited to plain JSON-compatible types
  3. Wrap calls to GetWidgetQuery and log the widget definition when it fails

Example fix

// before
req["start"] = someFunc

// after
req["start"] = "now-1h"
Defensive patterns

Strategy: validation

Validate before calling

if _, err := json.Marshal(widgetQueryData); err != nil {
    return fmt.Errorf("widget query data contains non-serializable values: %w", err)
}

Try / catch

req, err := d.GetWidgetQuery(i, ...)
if err != nil && strings.Contains(err.Error(), "invalid query request") {
    return errors.New("widget query could not be converted to a QueryRangeRequest; check widget definition")
}

Prevention

When it happens

Trigger: Invoking GetWidgetQuery where composed request values (from widget data) include a non-JSON-serializable Go value, causing json.Marshal(queryRangeReq) to fail.

Common situations: Programmatically built widget/query objects containing Go-native types; custom types in widget query data lacking proper serialization; edge-case composite data from integrations.

Related errors


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