Skip to content

fix(query): union instances_matching into ASAP-tier sid resolution (schema-retirement #5 step 1) - #273

Merged
zzylol merged 1 commit into
mainfrom
retire-agg-id-schema-retirement-5
May 17, 2026
Merged

zzylol merged 1 commit into
mainfrom
retire-agg-id-schema-retirement-5

Conversation

@zzylol

@zzylol zzylol commented May 17, 2026

Copy link
Copy Markdown
Contributor

Summary

First step of #272 (schema-retirement #5) — the query-path-side sid resolution fix that unblocks MVP demo Axis C (#271).

execute_range_promql_modern and the QueryEngine::execute() trait impl resolved ASAP-tier candidates → sids via sids_for_policy(fp) only, on the assumption that every production sid registration would populate policy_fp (per the comment a prior PR added when removing the legacy instances_matching fallback). That assumption breaks for sketches arriving via OTLP: derive_sketch_policy_fp only returns Some(fp) when a streaming-config policy's grouping_labels exactly matches the wire DP's group_by_keys. When the agent emits sketches with the full wire-attr set (no upstream attributes/keep — the common case when the controller's OpAMP-pushed runtime config doesn't reach the agent, see ASAPCollector#381), all sids land in the catalog with policy_fp = UNSET, and sids_for_policy(streaming_config_fp) returns empty even though the data is sitting in the SketchStore.

Fix: union the instances_matching(metric, group_by_keys) catalog walk into the sid set. instances_matching is the more general primitive — returns sids whose group_by_keys is a SUPERSET of the candidate's asked grouping. That subsumes the policy-fp reverse-index hit (ExactAgg sids minted via ingest_precompute_for_agg_config have group_by_keys == streaming_config.grouping_labels so they satisfy the subset check) AND covers the full-attr sketch case the prior path missed.

End-to-end verification

Single-node MVP smoke test (/mydata/mvp-smoke-test/):

Pre-fix:

$ curl --data-urlencode 'query=quantile_over_time(0.99, http_requests_total_latency_ms[5m])' \
       http://localhost:19091/api/v1/query
{"data":null,"error":"No result for query","errorType":"bad_data","infos":["data_source: asap_query"],"status":"error"}

Post-fix:

$ curl --data-urlencode 'query=quantile_over_time(0.99, http_requests_total_latency_ms[5m])' \
       http://localhost:19091/api/v1/query
{"accuracy":{"delta":0.0,"epsilon":0.01,"kind":"relative_quantile"},
 "data":{"result":[{"metric":{"zone":""},
                    "value":[1779043268.182,"90.93548893834691"]}],
         "resultType":"vector"},
 "infos":["accuracy: ε=0.01, δ=0, kind=relative_quantile",
          "precompute_window: [1779042780000, 1779042810000) ms (width 30000 ms)",
          "data_source: asap_query"]}

DDSketch p99 = 90.9ms with the right accuracy envelope. Axis D (51 sids registered) had been green for two weeks; this PR closes the loop on Axis C.

Test plan

  • cargo test -p data_plane --lib → 756 pass / 0 fail / 5 ignored
  • cargo test -p control_plane --lib → 691 pass / 0 fail
  • New regression test full_attr_sketch_sid_findable_via_subset_grouping in asap_tier_classify_tests pins the smoke-test scenario at unit level: a sketch sid with policy_fp = UNSET and full wire-attr group_by_keys must be findable by a query whose group_by_keys is a subset
  • End-to-end smoke test via bash /mydata/mvp-smoke-test/run_smoke.sh — Axis C quantile_over_time returns a real DDSketch quantile

Scope / what's still left

This is step 1 of #272. Still TODO:

  • data_plane/src/drivers/ingest/otel.rs:561,640 — ingest bucketing rekey from (aggregation_id, group_key) to sid
  • data_plane/src/precompute_engine/{worker,output_sink}.rs — WorkerMessage::AccumulatorInput shape change
  • data_plane/src/storage_engines/sketch_db/backfill/processor.rs — 6 sites
  • The legacy handle_query / execute_context path (engine.rs:945-1127) still routes via agg_id and emits the "No precomputed outputs found for metric: X, aggregation_id: Y" warning — its retirement is the natural next step
  • Re-enable the two ignored cross-reconfigure dispatch tests in tests/schema_timeline_dispatch_tests.rs
  • Drop pub fn aggregation_id() on AggregationConfig once all consumers are gone

Each is a separate PR per the staging plan in #272.

Related: #271 (MVP demo axis C) — this PR is sister fix path 2 from the issue body.

🤖 Generated with Claude Code

…chema-retirement #5 step 1)

The modern execute() trait path and execute_range_promql_modern resolved
ASAP-tier candidates to sids via `sids_for_policy(fp)` only, on the
assumption that every production sid registration would populate
`policy_fp` (per the comment retired by an earlier PR). That assumption
breaks for sketches arriving via OTLP: `derive_sketch_policy_fp` only
returns `Some(fp)` when a streaming-config policy's `grouping_labels`
EXACTLY matches the wire DP's `group_by_keys`. When the agent emits
sketches with the full wire-attr set (no upstream attribute reduction —
the common case when the controller's OpAMP-pushed runtime config
doesn't take effect, see ASAPCollector#381), `find_policy_by_content`
returns `None`, all sids land in the catalog with `policy_fp = UNSET`,
and `sids_for_policy(streaming_config_fp)` returns empty even though
the data is sitting in the SketchStore right there.

Fix: union the `instances_matching(metric, group_by_keys)` catalog walk
into the sid set. `instances_matching` is the more general primitive:
it returns sids whose `group_by_keys` is a SUPERSET of the candidate's
asked grouping, which subsumes the policy-fp reverse-index hit (an
ExactAgg-style sid minted via `ingest_precompute_for_agg_config` has
`group_by_keys == streaming_config.grouping_labels` so it satisfies the
subset check) AND covers the full-attr sketch case the prior path
missed.

End-to-end verified via the single-node MVP smoke test
(`/mydata/mvp-smoke-test/`):

  $ curl --data-urlencode 'query=quantile_over_time(0.99, http_requests_total_latency_ms[5m])' \
         http://localhost:19091/api/v1/query
  {"accuracy":{"delta":0.0,"epsilon":0.01,"kind":"relative_quantile"},
   "data":{"result":[{"metric":{"zone":""},
                      "value":[1779043268.182,"90.93548893834691"]}],
           "resultType":"vector"},
   "infos":["accuracy: ε=0.01, δ=0, kind=relative_quantile", ...]}

Pre-fix this returned `{"data":null,"error":"No result for query"}`.
Smoke-test `D` axis already showed 51 sids registered for the metric;
the gap was purely the query path's sid-resolution step.

Test plan:
  * `cargo test -p data_plane --lib` 756/756 green (756 pass / 5 ignored)
  * `cargo test -p control_plane --lib` 691/691 green
  * New regression test `full_attr_sketch_sid_findable_via_subset_grouping`
    in the `asap_tier_classify_tests` module pins the smoke-test scenario
    at unit level — a sketch sid with `policy_fp = UNSET` and full
    wire-attr `group_by_keys` must be findable by a query whose
    `group_by_keys` is a subset.
  * End-to-end smoke test (`bash /mydata/mvp-smoke-test/run_smoke.sh`)
    Axis C `quantile_over_time` now returns a real DDSketch quantile;
    pre-fix it returned "No result for query".

Scope: this is step 1 of [#272 (schema-retirement #5)](#272).
The ingest bucketing (`otel.rs:561`, `WorkerMessage::AccumulatorInput`),
precompute output sink, and backfill processor still key on
`config.aggregation_id()`; those are separate per-subsystem
retirements tracked in the same issue. The legacy `handle_query` /
`execute_context` path also still routes through agg_id and the
"No precomputed outputs found for metric: X, aggregation_id: Y"
error message — its retirement is the next step. Closes the
sid-resolution sub-step of #272.

Related: issue #271 (MVP demo axis C) — sister fix path 2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@zzylol
zzylol merged commit 667bdc0 into main May 17, 2026
zzylol added a commit that referenced this pull request May 17, 2026
…ema-retirement #5 step 2) (#274)

* fix(query): union instances_matching into ASAP-tier sid resolution (schema-retirement #5 step 1)

The modern execute() trait path and execute_range_promql_modern resolved
ASAP-tier candidates to sids via `sids_for_policy(fp)` only, on the
assumption that every production sid registration would populate
`policy_fp` (per the comment retired by an earlier PR). That assumption
breaks for sketches arriving via OTLP: `derive_sketch_policy_fp` only
returns `Some(fp)` when a streaming-config policy's `grouping_labels`
EXACTLY matches the wire DP's `group_by_keys`. When the agent emits
sketches with the full wire-attr set (no upstream attribute reduction —
the common case when the controller's OpAMP-pushed runtime config
doesn't take effect, see ASAPCollector#381), `find_policy_by_content`
returns `None`, all sids land in the catalog with `policy_fp = UNSET`,
and `sids_for_policy(streaming_config_fp)` returns empty even though
the data is sitting in the SketchStore right there.

Fix: union the `instances_matching(metric, group_by_keys)` catalog walk
into the sid set. `instances_matching` is the more general primitive:
it returns sids whose `group_by_keys` is a SUPERSET of the candidate's
asked grouping, which subsumes the policy-fp reverse-index hit (an
ExactAgg-style sid minted via `ingest_precompute_for_agg_config` has
`group_by_keys == streaming_config.grouping_labels` so it satisfies the
subset check) AND covers the full-attr sketch case the prior path
missed.

End-to-end verified via the single-node MVP smoke test
(`/mydata/mvp-smoke-test/`):

  $ curl --data-urlencode 'query=quantile_over_time(0.99, http_requests_total_latency_ms[5m])' \
         http://localhost:19091/api/v1/query
  {"accuracy":{"delta":0.0,"epsilon":0.01,"kind":"relative_quantile"},
   "data":{"result":[{"metric":{"zone":""},
                      "value":[1779043268.182,"90.93548893834691"]}],
           "resultType":"vector"},
   "infos":["accuracy: ε=0.01, δ=0, kind=relative_quantile", ...]}

Pre-fix this returned `{"data":null,"error":"No result for query"}`.
Smoke-test `D` axis already showed 51 sids registered for the metric;
the gap was purely the query path's sid-resolution step.

Test plan:
  * `cargo test -p data_plane --lib` 756/756 green (756 pass / 5 ignored)
  * `cargo test -p control_plane --lib` 691/691 green
  * New regression test `full_attr_sketch_sid_findable_via_subset_grouping`
    in the `asap_tier_classify_tests` module pins the smoke-test scenario
    at unit level — a sketch sid with `policy_fp = UNSET` and full
    wire-attr `group_by_keys` must be findable by a query whose
    `group_by_keys` is a subset.
  * End-to-end smoke test (`bash /mydata/mvp-smoke-test/run_smoke.sh`)
    Axis C `quantile_over_time` now returns a real DDSketch quantile;
    pre-fix it returned "No result for query".

Scope: this is step 1 of [#272 (schema-retirement #5)](#272).
The ingest bucketing (`otel.rs:561`, `WorkerMessage::AccumulatorInput`),
precompute output sink, and backfill processor still key on
`config.aggregation_id()`; those are separate per-subsystem
retirements tracked in the same issue. The legacy `handle_query` /
`execute_context` path also still routes through agg_id and the
"No precomputed outputs found for metric: X, aggregation_id: Y"
error message — its retirement is the next step. Closes the
sid-resolution sub-step of #272.

Related: issue #271 (MVP demo axis C) — sister fix path 2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(query): port resolve_sketch_metric_alias to modern execute() (schema-retirement #5 step 2)

Continuing #272 retirement work. The agent-side `_quantile` / `_hll`
INGEST-time metric renames (DDSketch+KLL append `_quantile`, HLL
appends `_hll`) used to be handled only at the entry of the legacy
`handle_query_promql` path. With #273 making modern `execute()` and
`execute_range_promql_modern` the producing paths for the common
sketch-backed-query case, those paths also need the rename rewrite —
otherwise a user query `quantile_over_time(0.99, http_latency[5m])`
that lands in modern (via the legacy→modern fallback in
`process_via_simple_engine`) misses the suffixed series the ASAP tier
actually holds.

Port: call `self.resolve_sketch_metric_alias(query).unwrap_or_else(...)`
at the top of both modern execute() trait impl and
`execute_range_promql_modern`. The helper is already a pure function
(parse + classify shape + replace metric token); no refactor needed,
just an additional caller.

Tested with the smoke test
(`/mydata/mvp-smoke-test/run_smoke.sh`) — the bare-metric case still
works because the smoke fake-exporter emits `http_requests_total_latency_ms`
literally (no suffix), and the streaming-config metric name matches,
so `resolve_sketch_metric_alias` correctly no-ops via `bare_present`.
Once the agent's DDSketch processor's `metric_suffix: "_quantile"`
takes effect (when ASAPCollector#381 is resolved and OpAMP-pushed
runtime config applies), modern's PromQL queries will need this
rename to bind back to the suffixed series — this PR pre-stages it.

Why not reorder process_via_simple_engine to call modern first now:
the `http_capability_miss_feedback_loop_closes_over_http` test relies
on the capability-miss notify side-effect inside
`find_compatible_aggregation_with_miss_notify` (which only legacy
calls); reordering also surfaces a pre-existing time=0 underflow
bug at engine.rs:792. Modern needs its own capability-miss notify
before that flip is safe — staged as the next sub-PR of #272.

Test plan:
  * `cargo test -p data_plane --lib` 756/756 pass
  * `cargo test -p control_plane --lib` 691/691 pass

Related: #272 (schema-retirement #5 umbrella), #273 (step 1 — sid
resolution fallback).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
zzylol added a commit that referenced this pull request May 17, 2026
…#275)

* fix(query): union instances_matching into ASAP-tier sid resolution (schema-retirement #5 step 1)

The modern execute() trait path and execute_range_promql_modern resolved
ASAP-tier candidates to sids via `sids_for_policy(fp)` only, on the
assumption that every production sid registration would populate
`policy_fp` (per the comment retired by an earlier PR). That assumption
breaks for sketches arriving via OTLP: `derive_sketch_policy_fp` only
returns `Some(fp)` when a streaming-config policy's `grouping_labels`
EXACTLY matches the wire DP's `group_by_keys`. When the agent emits
sketches with the full wire-attr set (no upstream attribute reduction —
the common case when the controller's OpAMP-pushed runtime config
doesn't take effect, see ASAPCollector#381), `find_policy_by_content`
returns `None`, all sids land in the catalog with `policy_fp = UNSET`,
and `sids_for_policy(streaming_config_fp)` returns empty even though
the data is sitting in the SketchStore right there.

Fix: union the `instances_matching(metric, group_by_keys)` catalog walk
into the sid set. `instances_matching` is the more general primitive:
it returns sids whose `group_by_keys` is a SUPERSET of the candidate's
asked grouping, which subsumes the policy-fp reverse-index hit (an
ExactAgg-style sid minted via `ingest_precompute_for_agg_config` has
`group_by_keys == streaming_config.grouping_labels` so it satisfies the
subset check) AND covers the full-attr sketch case the prior path
missed.

End-to-end verified via the single-node MVP smoke test
(`/mydata/mvp-smoke-test/`):

  $ curl --data-urlencode 'query=quantile_over_time(0.99, http_requests_total_latency_ms[5m])' \
         http://localhost:19091/api/v1/query
  {"accuracy":{"delta":0.0,"epsilon":0.01,"kind":"relative_quantile"},
   "data":{"result":[{"metric":{"zone":""},
                      "value":[1779043268.182,"90.93548893834691"]}],
           "resultType":"vector"},
   "infos":["accuracy: ε=0.01, δ=0, kind=relative_quantile", ...]}

Pre-fix this returned `{"data":null,"error":"No result for query"}`.
Smoke-test `D` axis already showed 51 sids registered for the metric;
the gap was purely the query path's sid-resolution step.

Test plan:
  * `cargo test -p data_plane --lib` 756/756 green (756 pass / 5 ignored)
  * `cargo test -p control_plane --lib` 691/691 green
  * New regression test `full_attr_sketch_sid_findable_via_subset_grouping`
    in the `asap_tier_classify_tests` module pins the smoke-test scenario
    at unit level — a sketch sid with `policy_fp = UNSET` and full
    wire-attr `group_by_keys` must be findable by a query whose
    `group_by_keys` is a subset.
  * End-to-end smoke test (`bash /mydata/mvp-smoke-test/run_smoke.sh`)
    Axis C `quantile_over_time` now returns a real DDSketch quantile;
    pre-fix it returned "No result for query".

Scope: this is step 1 of [#272 (schema-retirement #5)](#272).
The ingest bucketing (`otel.rs:561`, `WorkerMessage::AccumulatorInput`),
precompute output sink, and backfill processor still key on
`config.aggregation_id()`; those are separate per-subsystem
retirements tracked in the same issue. The legacy `handle_query` /
`execute_context` path also still routes through agg_id and the
"No precomputed outputs found for metric: X, aggregation_id: Y"
error message — its retirement is the next step. Closes the
sid-resolution sub-step of #272.

Related: issue #271 (MVP demo axis C) — sister fix path 2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(query): port resolve_sketch_metric_alias to modern execute() (schema-retirement #5 step 2)

Continuing #272 retirement work. The agent-side `_quantile` / `_hll`
INGEST-time metric renames (DDSketch+KLL append `_quantile`, HLL
appends `_hll`) used to be handled only at the entry of the legacy
`handle_query_promql` path. With #273 making modern `execute()` and
`execute_range_promql_modern` the producing paths for the common
sketch-backed-query case, those paths also need the rename rewrite —
otherwise a user query `quantile_over_time(0.99, http_latency[5m])`
that lands in modern (via the legacy→modern fallback in
`process_via_simple_engine`) misses the suffixed series the ASAP tier
actually holds.

Port: call `self.resolve_sketch_metric_alias(query).unwrap_or_else(...)`
at the top of both modern execute() trait impl and
`execute_range_promql_modern`. The helper is already a pure function
(parse + classify shape + replace metric token); no refactor needed,
just an additional caller.

Tested with the smoke test
(`/mydata/mvp-smoke-test/run_smoke.sh`) — the bare-metric case still
works because the smoke fake-exporter emits `http_requests_total_latency_ms`
literally (no suffix), and the streaming-config metric name matches,
so `resolve_sketch_metric_alias` correctly no-ops via `bare_present`.
Once the agent's DDSketch processor's `metric_suffix: "_quantile"`
takes effect (when ASAPCollector#381 is resolved and OpAMP-pushed
runtime config applies), modern's PromQL queries will need this
rename to bind back to the suffixed series — this PR pre-stages it.

Why not reorder process_via_simple_engine to call modern first now:
the `http_capability_miss_feedback_loop_closes_over_http` test relies
on the capability-miss notify side-effect inside
`find_compatible_aggregation_with_miss_notify` (which only legacy
calls); reordering also surfaces a pre-existing time=0 underflow
bug at engine.rs:792. Modern needs its own capability-miss notify
before that flip is safe — staged as the next sub-PR of #272.

Test plan:
  * `cargo test -p data_plane --lib` 756/756 pass
  * `cargo test -p control_plane --lib` 691/691 pass

Related: #272 (schema-retirement #5 umbrella), #273 (step 1 — sid
resolution fallback).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* revert+retire(query): delete dead resolve_sketch_metric_alias rewrite

Revert PR #274 (and remove the legacy `handle_query_promql` call site
plus the function itself and its test module). The `_quantile` /
`_hll` metric-suffix rewrite is obsolete dead code post the 2026-05
processor refactor.

Per `opentelemetry-collector-contrib-patch/processor/ddsketchprocessor/shim_helpers.go:189`:

  // Refactor-2026-05: metric name is PRESERVED from the input metric.
  // MetricSuffix is intentionally NOT applied — the sketch type is
  // carried by the OTLP pdata.Metric variant tag (DDSketch), so the
  // downstream backend can identify the encoding without a name suffix
  // and PromQL queries fired against the raw input metric name resolve
  // directly against the stored sketch state.

(See also `deploy/mvp-singlenode/configs/backend-streaming.yaml`'s
header note documenting the same refactor.) The wire-side input
metric name IS the served metric name; the per-processor
`metric_suffix` config field is now a no-op in production paths.

The backend's `resolve_sketch_metric_alias` was the query-side
counterpart to that long-since-retired emit-side suffix. With the
suffix never applied, the resolver's `bare_present` check always
short-circuits to `None` — making it pure overhead (one PromQL
parse + one streaming-config snapshot scan per query) and worse,
misleading: the doc comments + the in-tree `mod
sketch_alias_resolver_tests` keep an architectural story alive that
the runtime no longer matches.

This PR removes:

  * The 3 call sites of `resolve_sketch_metric_alias`:
    - `handle_query_promql` (line 2038 — pre-existing)
    - `QueryEngine::execute()` trait impl (line ~3219 — added by #274)
    - `execute_range_promql_modern` (line ~3720 — added by #274)
  * The `resolve_sketch_metric_alias` method itself
    (~90 LOC + ~30 LOC doc comment)
  * The `replace_metric_token` helper (only caller was the resolver)
  * The `utf8_char_len` helper (only caller was `replace_metric_token`)
  * The `sketch_alias_resolver_tests` module (~160 LOC, 8 tests, all
    asserting behavior that's been a no-op for months)

Net: -381 LOC, no additions.

Test plan:
  * `cargo test -p data_plane --lib` → 748 pass / 0 fail / 5 ignored
    (756 → 748 reflects the 8 deleted alias-resolver tests)
  * `cargo test -p control_plane --lib` → 691 pass / 0 fail

Follow-ups (out of scope for this PR):
  * `docs/design-controller-into-backend.md` still has two
    `metric_suffix: "_quantile"` references that should be rewritten
    in a docs-only PR — the live config (`gateway-aggregate-from-raw.yaml`)
    no longer carries the suffix, so the doc table is stale.

Apologies for the original PR #274 — I called it a "port" without
checking that the function being ported is dead code. Thanks for the
catch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
zzylol added a commit that referenced this pull request May 18, 2026
…g crate (B7.5, schema-retirement #5 step 4) (#278)

After #273 (modern execute() handles sketches via instances_matching)
and #277 (saturating_sub for time=0 + dangling-callers cleanup), the
legacy `handle_query` / `handle_query_promql` family no longer has
features the modern `QueryEngine::execute()` trait can't handle. This
PR deletes the whole legacy tree and the orphan
`crates/promql_utilities/src/ast_matching/` module that only the
legacy path consumed.

Deleted:
  * `ASAPQueryEngine::handle_query`,
    `ASAPQueryEngine::handle_query_promql`,
    `ASAPQueryEngine::try_handle_query_promql_via_timeline`
    (instant-query entry points)
  * `ASAPQueryEngine::handle_range_query_promql`,
    `build_range_query_execution_context_promql`,
    `execute_range_query_pipeline`,
    `handle_binary_expr_range_promql`,
    `build_arm_range_context`, `apply_range_binary_op`
    (range-query entry point + helpers)
  * `execute_context`, `execute_query_pipeline`,
    `execute_store_query`, `execute_and_merge_store_queries`
    (legacy dispatcher chain)
  * `build_query_execution_context_promql*`,
    `build_promql_execution_context_tail`,
    `parse_and_match_promql`, `resolve_agg_info_promql`,
    `agg_info_from_forced_id`,
    `find_compatible_aggregation_with_miss_notify`,
    `resolve_metric_labels`,
    `calculate_query_timestamps_promql`,
    `calculate_start_timestamp_promql`,
    `validate_and_align_end_timestamp`,
    `extract_quantile_param_promql`, `extract_topk_param`,
    `build_query_kwargs_promql`, `create_keys_query_params`,
    `create_store_query_plan`, `collect_all_results`,
    `merge_precomputed_outputs`, `merge_accumulators`,
    `collect_results_separate_keys`,
    `collect_results_same_aggregation`, `limit_keys_for_topk`,
    `validate_range_query_params`, `format_final_results`,
    `build_query_requirements_promql`,
    `query_precompute_for_statistic` (legacy helpers)
  * `QueryExecutionContext`, `QueryMetadata`, `QueryTimestamps`,
    `StoreQueryParams`, `StoreQueryPlan`, `RangeQueryParams`,
    `RangeQueryExecutionContext` (legacy types)
  * `control_plane_patterns` field, the `PromQLPatternBuilder`
    setup in `new_with_hot_reload`, `QueryPatternType` enum
  * `crates/promql_utilities/src/ast_matching/` (4 files; only
    consumer was the legacy path)
  * `crates/promql_utilities/src/query_logics/parsing.rs` helpers
    (`get_metric_and_spatial_filter`, `get_statistics_to_compute`,
    `get_spatial_aggregation_output_labels`)
  * Test modules tied to the deleted surface: `range_query_tests`,
    `sketch_query_tests`, `e2e_feedback_loop_tests`,
    `forced_agg_id_tests`, `hll_count_query_tests`,
    `kll_quantile_query_tests`, `cms_rate_capability_tests`,
    `analyzer_parity_tests`,
    `calculate_start_timestamp_promql_tests`,
    `aux_pushdown_tests`, the whole
    `capability_matching_tests.rs` file and
    `tests/test_utilities/comparison.rs`

Updated:
  * `data_plane/src/drivers/query/servers/http.rs::process_via_simple_engine`
    now calls modern `execute()` only. The capability-miss notify
    side-effect that used to live in
    `find_compatible_aggregation_with_miss_notify` is moved to
    the modern path's sid-resolution error branches AND to the
    "no-sketch-index attached" branch (HttpServer attaches its own
    `SketchStore` but the `ASAPQueryEngine` builder it hands off
    does not `.with_sketch_index(...)` — the e2e test
    `http_capability_miss_feedback_loop_closes_over_http` pins
    exactly that wiring).
  * `handle_range_query` now calls modern
    `execute_range_promql_modern` only — no legacy fallback.
  * `handle_precompute_job` routes through modern `execute()`.
  * `tests/schema_timeline_dispatch_tests.rs::single_schema_query_falls_through_to_default_path`
    moved to `#[ignore]` — its premise no longer has a callsite.
    Modern-path coverage lives in `asap_tier_classify_tests` and
    `e2e_modified_otlp_sketch_path`.

Test plan:
  * `cargo test -p data_plane --lib`: 707 pass, 0 failed, 5 ignored
    (down from 754 — 47 tests deleted with the legacy code they
    exercised).
  * `cargo test -p data_plane --lib capability_miss_http_e2e`:
    1 pass, 1 ignored — the feedback-loop test that pins the
    notify side-effect still passes.
  * `cargo test -p control_plane --lib`: 699 pass, 0 failed.

The `try_handle_query_promql_via_timeline` cross-reconfigure
dispatch path is gone too. Its functionality (per-segment dispatch
across schema boundaries) was scheduled for a sid-level rewrite
in the schema-retirement #5 follow-up; deferred to a separate PR
since no current test exercises a multi-segment reconfigure
boundary (the two `#[ignore]`d tests in
`tests/schema_timeline_dispatch_tests.rs` documented as needing a
sid-level rewrite anyway).

Closes step 4 of #272.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@zzylol
zzylol deleted the retire-agg-id-schema-retirement-5 branch July 17, 2026 20:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant