SigNoz/signoz · error

noop is not supported for table view

Error message

noop is not supported for table view

What it means

In the cumulative table query builder, aggregateOperator 'noop' (no aggregation, return raw sample values) is rejected for table view: a table needs one value per group, and noop provides no aggregation semantics, so SigNoz refuses to build the query rather than emit a meaningless one.

Source

Thrown at pkg/query-service/app/metrics/v3/cumulative_table.go:182

		query = fmt.Sprintf(`SELECT %s toStartOfHour(now()) as ts, sum(rate_value)/%d as value FROM (%s) WHERE isNaN(rate_value) = 0 GROUP BY %s ORDER BY %s ts`, groupTags, points, query, groupBy, orderBy)
		value := aggregateOperatorToPercentile[mq.AggregateOperator]

		query = fmt.Sprintf(`SELECT %s toStartOfHour(now()) as ts, histogramQuantile(arrayMap(x -> toFloat64(x), groupArray(le)), groupArray(value), %.3f) as value FROM (%s) GROUP BY %s ORDER BY %s ts`, groupTagsWithoutLe, value, query, groupByWithoutLe, orderWithoutLe)
		return query, nil
	case v3.AggregateOperatorAvg, v3.AggregateOperatorSum, v3.AggregateOperatorMin, v3.AggregateOperatorMax:
		op := fmt.Sprintf("%s(value)", aggregateOperatorToSQLFunc[mq.AggregateOperator])
		query := fmt.Sprintf(queryTmpl, groupTags, op, filterSubQuery, groupBy, orderBy)
		return query, nil
	case v3.AggregateOperatorCount:
		op := "toFloat64(count(*))"
		query := fmt.Sprintf(queryTmpl, groupTags, op, filterSubQuery, groupBy, orderBy)
		return query, nil
	case v3.AggregateOperatorCountDistinct:
		op := "toFloat64(count(distinct(value)))"
		query := fmt.Sprintf(queryTmpl, groupTags, op, filterSubQuery, groupBy, orderBy)
		return query, nil
	case v3.AggregateOperatorNoOp:
		return "", fmt.Errorf("noop is not supported for table view")
	default:
		return "", fmt.Errorf("unsupported aggregate operator")
	}
}

View on GitHub (pinned to 5069bf80b0)

Solutions

  1. Pick a real aggregator for table view (sum, avg, max, min, count, count_distinct, *_rate)
  2. If raw values are needed, use a time-series/graph query or the raw samples endpoint
  3. Guard request construction: reject noop+table early with a clear client-side message

Example fix

// before
{"aggregateOperator":"noop","queryType":"table"}
// after
{"aggregateOperator":"avg","queryType":"table"}
Defensive patterns

Strategy: validation

Validate before calling

if queryType == "table" && aggregateOperator == "noop" {
  return errors.New("noop is not supported for table view; choose an aggregator")
}

Type guard

func isNoopTableQuery(q Query) bool { return q.QueryType == "table" && q.AggregateOperator == "noop" }

Try / catch

Catch the API error in panel save logic and force the user to pick an aggregator before retry.

Prevention

When it happens

Trigger: A v3 table-view metrics query with aggregateOperator: 'noop' — e.g. migrating a trace/log panel config into a metrics table panel, or hand-crafting BuildQueryRequest payloads and leaving the default operator as noop.

Common situations: Default-initialized request structs where AggregateOperator is zero-valued/noop; dashboard JSON imported between panel types; version upgrades that started enforcing this restriction in table view.

Related errors


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