SigNoz/signoz · error · errors.Error

CodeInvalidInput

CodeInvalidInput

Error message

oidc: missing email in claims

What it means

Returned by buildDeltaMetricQueryForTable when the aggregate operator is v3.AggregateOperatorNoOp and the target is a table view. NoOp means 'return raw samples unchanged', which only makes sense for time-series output; a table view requires a scalar aggregate per group, so the builder explicitly rejects it.

Source

Thrown at ee/authn/callbackauthn/oidccallbackauthn/authn.go:119

		return nil, errors.Newf(errors.TypeInternal, errors.CodeInternal, "oidc: failed to get token").WithAdditional(err.Error())
	}

	claims, err := a.claimsFromIDToken(ctx, authDomain, oidcProvider, token)
	if err != nil && !errors.Ast(err, errors.TypeNotFound) {
		return nil, err
	}

	if claims == nil && oidcConfig.GetUserInfo {
		claims, err = a.claimsFromUserInfo(ctx, oidcProvider, token)
		if err != nil {
			return nil, err
		}
	}

	emailClaim, ok := claims[oidcConfig.ClaimMapping.Email].(string)
	if !ok {
		return nil, errors.New(errors.TypeInvalidInput, errors.CodeInvalidInput, "oidc: missing email in claims")
	}

	email, err := valuer.NewEmail(emailClaim)
	if err != nil {
		return nil, errors.Newf(errors.TypeInvalidInput, errors.CodeInvalidInput, "oidc: failed to parse email").WithAdditional(err.Error())
	}

	if !oidcConfig.InsecureSkipEmailVerified {
		emailVerifiedClaim, ok := claims["email_verified"].(bool)
		if !ok {
			return nil, errors.New(errors.TypeInvalidInput, errors.CodeInvalidInput, "oidc: missing email_verified in claims")
		}

		if !emailVerifiedClaim {
			return nil, errors.New(errors.TypeForbidden, errors.CodeForbidden, "oidc: email is not verified")
		}
	}

View on GitHub (pinned to 5069bf80b0)

Solutions

  1. Set an actual aggregate operator (avg, sum, max, min, count, count_distinct, or a *_rate variant) for table panels
  2. Keep NoOp queries in graph/time-series view where raw series rendering is supported
  3. Guard in your own layer: reject NoOp+table combinations before calling PrepareMetricQuery with a clearer message

Example fix

// before
op := v3.AggregateOperatorNoOp
q, err := PrepareMetricQuery(..., op, v3.FormatTable)

// after
op := v3.AggregateOperatorAvg // pick a real aggregation for table output
q, err := PrepareMetricQuery(..., op, v3.FormatTable)
Defensive patterns

Strategy: validation

Validate before calling

if qp.AggregateOperator == v3.AggregateOperatorNoOp && qp.Format == v3.FormatTable {
	return errors.New("noop requires a time-series view; choose an aggregate for tables")
}

Type guard

func isNoOp(op v3.AggregateOperator) bool { return op == v3.AggregateOperatorNoOp }

Try / catch

if _, err := v3.PrepareMetricQuery(...); err != nil && strings.Contains(err.Error(), "noop is not supported") {
	qp.AggregateOperator = v3.AggregateOperatorAvg // fallback aggregate
	return v3.PrepareMetricQuery(...)
}

Prevention

When it happens

Trigger: PrepareMetricQuery / dashboard or API requests where mq.AggregateOperator == v3.AggregateOperatorNoOp (or the string 'noop') combined with a table/list panel format, routing execution into the delta table builder.

Common situations: Exporting raw metric points into a table widget; migrating a query from the explore (graph) view to a table panel without changing the operator; UI defaults leaving operator as noop when a user only changes the panel type.

Related errors


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