mirror of
https://github.com/SigNoz/signoz.git
synced 2026-08-14 17:00:37 +01:00
A filter on a metrics label that isn't in metadata ran silently: the query fell back to reading the label directly, but nothing told the user the key was unknown. Removes the `TODO(srikanthccv)` in the metrics statement builder. ### What The detection was already written, and already in the right place. `conditionBuilder.ConditionFor` spots a filter key with no metadata match, warns, and synthesizes an attribute-context key so the query still runs — and it only ever sees terms in **key position**, so it cannot mistake a value or a dashboard variable for a key. That is exactly what the TODO was waiting for. Two things hid it: - `Build` pre-seeded the field-key map with a synthesized entry for every lexer-derived selector, so `MatchingFieldKeys` always matched and the missing-key branch was dead code. - The metrics builder never read `PrepareWhereClause`'s warnings — the visitor collects them and `unionStatements` merges them, but nothing ever set them. So: drop the pre-seeding, and carry the warnings out of `buildTimeSeriesCTE` onto the statement. ### Notes - **Generated SQL is unchanged.** The key the condition builder synthesizes (attribute context, name as written) is what the pre-seeding was injecting, so `test_missing_key_falls_back_to_labels` still expects byte-identical SQL and only gains the warning. - A full-text term routes through `labels`, which is a real column, so it takes the `isColumn` branch and stays silent — bare-word searches don't start warning. - The reduced statement prepares the same filter over the same keys, so only the main path's warnings go into the union; carrying both would show each warning twice. ### Testing - `test_missing_key_falls_back_to_labels` gains the expected warning, same SQL. - `queriermetrics/10_key_resolution.py::test_metrics_filter_unknown_label_matches_nothing` now asserts the warning instead of asserting silence. - `queriermetrics/02_warnings.py` already covered the TODO's own example (`my_tag = $tag`). It passed before only because every warning was suppressed; it is now a real guard that a value-position variable is not flagged. - `queriermetrics` integration suite: 118 passed. `go test ./pkg/statementbuilder/... ./pkg/telemetryschema/...` green. `make go-lint` and `make py-lint` clean.