thanos-io/thanos · error · api.ApiError
using both the parameter and the header is not supported
Error message
using both the %s parameter and the %s header is not supported
What it means
A mutually-exclusive-inputs guard in Handler.getStats: the request supplies both the stats-by-label query parameter and its corresponding HTTP header at the same time, which is unsupported because they compete to select the grouping label. The request is rejected as bad input rather than guessing precedence.
Solutions
- Send the limit via only one of parameter or header.
- Update the client to not duplicate the limit.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at pkg/receive/handler.go:456 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of thanos-io/thanos@35b8b99117 (2026-09-07).
Data as JSON: /api/errors/2ff368504b02a5c1.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/receive/handler.go:456
statsLimit, err := strconv.ParseInt(statsLimitStr, 10, 0)
if err != nil {
return 0, fmt.Errorf("unable to parse '%s' parameter: %w", LimitStatsQueryParam, err)
}
if statsLimit > math.MaxInt {
return 0, fmt.Errorf("'%s' parameter is larger than %d", LimitStatsQueryParam, math.MaxInt)
}
return int(statsLimit), nil
}
func (h *Handler) getStats(r *http.Request, statsByLabelName string) ([]api.TenantStats, *api.ApiError) {
if !h.isReady() {
return nil, &api.ApiError{Typ: api.ErrorInternal, Err: fmt.Errorf("service unavailable")}
}
tenantID := r.Header.Get(h.options.TenantHeader)
getAllTenantStats := r.FormValue(AllTenantsQueryParam) == "true"
if getAllTenantStats && tenantID != "" {
err := fmt.Errorf("using both the %s parameter and the %s header is not supported", AllTenantsQueryParam, h.options.TenantHeader)
return nil, &api.ApiError{Typ: api.ErrorBadData, Err: err}
}
statsLimit, err := getStatsLimitParameter(r)
if err != nil {
return nil, &api.ApiError{Typ: api.ErrorBadData, Err: err}
}
if getAllTenantStats {
return h.options.TSDBStats.TenantStats(statsLimit, statsByLabelName), nil
}
if tenantID == "" {
tenantID = h.options.DefaultTenantID
}
return h.options.TSDBStats.TenantStats(statsLimit, statsByLabelName, tenantID), nil
}View on GitHub (pinned to 35b8b99117)