Skip to content

fix: isolate POST metadata cache keys and serve labels alias - #949

Merged
szibis merged 5 commits into
mainfrom
fix/metadata-post-cache-alias
Nov 1, 2026
Merged

szibis merged 5 commits into
mainfrom
fix/metadata-post-cache-alias

Conversation

@szibis

@szibis szibis commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

POST metadata reads could cache a body-filtered answer under a URL-only key. A later POST for a different app could then return the previous app's labels. This change keys effective form parameters, preserves body precedence and fences the affected old namespaces across RAM, disk, peers and the outer compatibility cache. It also serves GET/POST /loki/api/v1/label directly through the existing labels handler.

The read-scope/reporting changes from #948 are merged. This PR is rebased onto main at 4c5b769f96f1630dd69854449dd0e0f1872b1859; its diff contains only the alias, POST cache correction, regression tests and supporting evidence/docs.

Historical main versus PR evidence

Retained results, method and limits, harness and isolated compose. Historical measured main runtime: 28a5a2f6994240d85d254b5daa23dbc04ecfd891; candidate runtime: c320190c3b2cda0137b36518491e406bbc8835d3. This capture predates #947. The branch is now rebased onto main at 4c5b769 (including v2.54.0 and #948) and includes its S2 ownership change. These rows retain their original measured identities and are not measurements of the rebased head. Reference: Loki 3.7.9 and VictoriaLogs 1.52.0, the same dual-written TestSetup_IngestLogs fixture and a fixed one-hour selector window.

Signal Historical main runtime Historical PR runtime Meaning
Singular labels alias, GET and POST 307 redirect 200, equal to plural and Loki Closes the modern alias route gap
Canonical filtered POST immediately after matching GET 4 VL select requests 0 Equivalent forms reuse the existing metadata answer
POST for a second, missing app Returned previous app's labels Empty, like its GET control and Loki Reproduces and fixes incorrect selector reuse
Backend cost for that new selector 0 VL selects, wrong answer 3 VL selects, correct answer Correctness requires a new read
Alias after canonical priming 0 selects, redirect only 0 selects, correct labels The labels metadata cache is shared; outer GET cache remains path-specific
Upgrade reuse of affected old keys Ambiguous entries eligible New namespaces fence them Initial refill cost; old records follow existing expiry/eviction
Read inventory after scope correction 24/27 routed, 18 differential, 11 declared proven 25/27 routed, 19 differential, 12 declared proven One alias; no new backend-native algorithm

The counter rows are one dedicated sequence, including prior endpoint-test priming. They are not a cold latency benchmark, per-tier hit ratios or physical disk operations. The empty-selector raw response differs in an existing way: Loki omits data; the proxy returns data: [].

Resource / state Scope and result
Topology and RF One main and one PR proxy with separate cache volumes; shared fixture; peers disabled, RF not applicable
Configured budgets, both builds Primary L1 256 MiB/10,000 entries; additional GET cache 10%; logical SSD cache 512 MiB; Go memory target 2 GiB, not a process/container cap
CPU, RSS, allocations, retained occupancy, evictions, encoded disk traffic, physical IOPS, VL-server CPU/RSS Not measured in this endpoint correctness proof; no resource-savings claim
Layer attribution Labels are Loki-facing metadata; VL-facing cache reuse and independent tier hit/miss rates were not measured
p50/p95, shifted windows, refresh, disk restart, peer loss, mixed-version fleet and pressure Not measured here; exact repeats do not prove those states

Tenant/auth and backend scoping, existing freshness/completeness rules and configured capacities are preserved. POST skips the URL-only key memo and copies the parsed form for normalization. The old-key fence applies to upgraded binaries; it is not a distributed deletion-invalidation protocol. cache/generation_numbers remains unimplemented. index/shards stays a counted optional planner-only gap; it does not block ordinary pinned Grafana/Drilldown queries or peer-cache lookup.

Verification

  • Pre-rebase go test ./... -count=1: passed, including the proxy package (310 s). After rebasing onto perf: release oversized S2 cache backing buffers #947, focused race tests including POST/alias/tenant/compatibility regressions, stats extents and S2 disk-queue/restart tests passed (26.9 s). Full CI reruns on the updated head.
  • Focused -race regressions: passed for POST form identities, selectors/windows, alias routing, old namespaces, compatibility cache and tenant/auth isolation. A malformed partial-form case also passes.
  • HTTP upgrade regressions seed prior RAM, SSD and outer GET-cache answers and require fresh backend labels. Shared peer/stale key fencing is checked structurally by the versioned identities; this is not a live L3 migration claim.
  • Live TestCompat_LabelsSingularAlias: passed against the committed candidate image and Loki, including nonempty direct GET/POST parity and a second empty selector. It runs in the existing TestCompat_.* core shard.
  • Existing CI-script suite: 411 tests passed, including read-scope and generated-page regression tests. Production Docusaurus build passed. Conformance/registry and changelog gates passed; compose configuration validates.
  • Independent code and proof review: no unresolved findings. Pre-rebase pinned Gitleaks scan: 80 locally available commits, no leaks; full remote-history scanning remains CI's job.

The retained harness is manually reproducible; it adds no CI workload solely for the PR comment. Existing product compatibility, visual smoke and regression workflows provide the CI evidence.

The README and four curated API-status blocks are regenerated and checked by the existing conformance gate. This tree shows 25/27 routed reads, 19/27 with differential evidence and 12/27 declared proven; the parent scope/report PR shows 24/27, 18/27 and 11/27. The singular alias leaves the missing-route list only in this product PR. Known Issues records the POST collision in the parent and the tested correction here. Optional deletion remains outside the read score; generation_numbers remains unimplemented and index/shards optional.

Release audit after v2.54.0: the released changelog is unchanged byte-for-byte; the POST/alias and security notes remain under Unreleased. Runtime source is unchanged by the docs/release rebases. The latest local pinned Gitleaks run before the release rebase scanned 101 available commits with no leaks; remote full-history checks rerun on the updated head. The report string-construction quality finding is fixed in the shared parent using explicit concatenation, with unchanged rendered output.

Conflict-resolution verification (2026-11-01): rebased only the five product commits onto merged #948. The resulting file tree is byte-for-byte identical to the previous PR head. Fresh focused POST/alias race regressions passed (36 tests); conformance and changelog gates passed; all five rebased commits have valid signatures. CI reruns on the updated head.

@github-actions github-actions Bot added size/XL Extra large change scope/proxy Proxy core scope/ci CI/CD scope/docs Documentation scope/tests Tests bugfix Bug fix labels Oct 31, 2026
Comment thread conformance/scripts/gaps.py Fixed
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

⚪ Performance A/B: no change beyond noise

56 shape×range — 56 ⚪ same · results vs Loki: 49 same, 0 new difference(s), 7 pre-existing

Loki profiles compared (like for like):

  • aligned: not run (no build supports -align-queries-with-step, so every aligned row would be not like-for-like)
  • loki-defaults: 56 shape×range; proxy flag base off, pr off

Every shape is within noise of the base build (±30% and 100 ms).

56 unchanged shape×range (within noise)
shape range Loki profile base p50 PR p50 change Loki p50 PR ÷ Loki result vs Loki
⚪ drilldown service landing 1h defaults 7 ms 6 ms ⚪ -14% 86 ms 0.07× ✅ same
⚪ instant ungrouped rate instant defaults 9 ms 11 ms ⚪ +22% 70 ms 0.16× ✅ same
⚪ json rate by level (no filter, no drop) 1h defaults 400 400 ⚪ +0% 400 — ✅ same
⚪ json volume no filters 1h defaults 57 ms 54 ms ⚪ -5% 341 ms 0.16× ✅ same
⚪ logs plain 1h defaults 53 ms 51 ms ⚪ -4% 435 ms 0.12× ✅ same
⚪ logs | json 1h defaults 76 ms 75 ms ⚪ -1% 668 ms 0.11× ✅ same
⚪ stream-label count by app 1h defaults 7 ms 7 ms ⚪ +0% 99 ms 0.07× ✅ same
⚪ topk rate by app 1h defaults 9 ms 9 ms ⚪ +0% 134 ms 0.07× ➖ differs (as base)
⚪ label values env ending now 1h defaults 9 ms 8 ms ⚪ -11% 20 ms 0.40× ✅ same
⚪ label values env ending two days ago (control) 1h defaults 2 ms 1 ms ⚪ -50% 2 ms 0.50× ➖ differs (as base)
⚪ labels ending now 1h defaults 6 ms 6 ms ⚪ +0% 2 ms 3.00× ✅ same
⚪ labels ending two days ago (control) 1h defaults 2 ms 1 ms ⚪ -50% 2 ms 0.50× ➖ differs (as base)
⚪ E1 json duration_ms sum by service 1h defaults 6 ms 6 ms ⚪ +0% 14 ms 0.43× ✅ same
⚪ E2 json duration_ms p95 by service 1h defaults 9 ms 9 ms ⚪ +0% 12 ms 0.75× ✅ same
⚪ E3 logfmt latency_ms rate, production 1h defaults 10 ms 9 ms ⚪ -10% 88 ms 0.10× ➖ differs (as base)
⚪ E4 logfmt size_bytes max by service 1h defaults 6 ms 5 ms ⚪ -17% 11 ms 0.45× ✅ same
⚪ E6 logfmt ttl unit string (Loki 400) 1h defaults 400 400 ⚪ -9% 400 — ✅ same
⚪ E7 json hexadecimal trace_id (Loki 400) 1h defaults 400 400 ⚪ -15% 400 — ✅ same
⚪ E8 json duration_ms sum by service, namespace prod 1h defaults 8 ms 7 ms ⚪ -12% 67 ms 0.10× ✅ same
⚪ E9 logfmt latency_ms sum by service, namespace prod 1h defaults 8 ms 8 ms ⚪ +0% 64 ms 0.12× ✅ same
⚪ D1 logfmt ttl duration_seconds rate by service 1h defaults 12 ms 11 ms ⚪ -8% 9 ms 1.22× ✅ same
⚪ D2 logfmt ttl duration rate by service 1h defaults 1 ms 1 ms ⚪ +0% 7 ms 0.14× ✅ same
⚪ G1 logfmt amount sum_over_time, no filter 1h defaults 4 ms 3 ms ⚪ -25% 12 ms 0.25× ✅ same
⚪ G10 logfmt latency_ms sum_over_time, production 1h defaults 9 ms 8 ms ⚪ -11% 88 ms 0.09× ➖ differs (as base)
⚪ G2 json duration_ms sum_over_time, no filter 1h defaults 5 ms 4 ms ⚪ -20% 25 ms 0.16× ✅ same
⚪ G3 logfmt amount sum_over_time, error filter 1h defaults 4 ms 3 ms ⚪ -25% 10 ms 0.30× ✅ same
⚪ G4 json duration_ms sum_over_time, error filter 1h defaults 5 ms 4 ms ⚪ -20% 22 ms 0.18× ✅ same
⚪ G5 logfmt amount sum by rate 1h defaults 4 ms 4 ms ⚪ +0% 9 ms 0.44× ✅ same
⚪ G6 json duration_ms sum by rate 1h defaults 5 ms 4 ms ⚪ -20% 22 ms 0.18× ✅ same
⚪ G7 duration() of a unit string 1h defaults 11 ms 10 ms ⚪ -9% 9 ms 1.11× ✅ same
⚪ G8 bytes() of a number 1h defaults 8 ms 8 ms ⚪ +0% 8 ms 1.00× ✅ same
⚪ G9 json duration_ms max_over_time 1h defaults 7 ms 5 ms ⚪ -29% 85 ms 0.06× ✅ same
⚪ W1 sum without pod, max_over_time 1h defaults 5 ms 5 ms ⚪ +0% 14 ms 0.36× ✅ same
⚪ W2 sum without pod, sum_over_time 1h defaults 5 ms 5 ms ⚪ +0% 12 ms 0.42× ✅ same
⚪ W3 sum without pod, rate 1h defaults 7 ms 5 ms ⚪ -29% 12 ms 0.42× ✅ same
⚪ W4 max without pod, max_over_time 1h defaults 2 ms 2 ms ⚪ +0% 12 ms 0.17× ✅ same
⚪ W7 topk 5 of sum without pod 1h defaults 2 ms 2 ms ⚪ +0% 12 ms 0.17× ✅ same
⚪ W8 sum without pod, count_over_time (production) 1h defaults 15 ms 14 ms ⚪ -7% 42 ms 0.33× ✅ same
⚪ U1 logfmt amount rate 1h defaults 5 ms 5 ms ⚪ +0% 12 ms 0.42× ✅ same
⚪ U2 json duration_ms rate 1h defaults 6 ms 5 ms ⚪ -17% 21 ms 0.24× ✅ same
⚪ U3 json duration_ms rate, error filter 1h defaults 6 ms 6 ms ⚪ +0% 20 ms 0.30× ✅ same
⚪ U4 logfmt latency_ms rate, production 1h defaults 9 ms 9 ms ⚪ +0% 90 ms 0.10× ➖ differs (as base)
⚪ U8 logfmt amount rate by service (grouped) 1h defaults 6 ms 5 ms ⚪ -17% 10 ms 0.50× ✅ same
⚪ U9 logfmt amount rate_counter (folded per series) 1h defaults 6 ms 6 ms ⚪ +0% 23 ms 0.26× ✅ same
⚪ U1 json duration_ms sum by service 1h defaults 6 ms 6 ms ⚪ +0% 15 ms 0.40× ✅ same
⚪ U12 json duration_ms over every service 1h defaults 8 ms 8 ms ⚪ +0% 42 ms 0.19× ✅ same
⚪ U13 logfmt latency_ms over every service 1h defaults 18 ms 17 ms ⚪ -6% 112 ms 0.15× ➖ differs (as base)
⚪ U14 duration() of a unit string 1h defaults 13 ms 13 ms ⚪ +0% 6 ms 2.17× ✅ same
⚪ U2 json duration_ms max by service 1h defaults 6 ms 6 ms ⚪ +0% 26 ms 0.23× ✅ same
⚪ U3 json duration_ms sliding sum 1h defaults 12 ms 9 ms ⚪ -25% 45 ms 0.20× ✅ same
⚪ U4 logfmt size_bytes sum by service 1h defaults 7 ms 6 ms ⚪ -14% 7 ms 0.86× ✅ same
⚪ U5 logfmt ttl unit string (no sample) 1h defaults 6 ms 5 ms ⚪ -17% 5 ms 1.00× ✅ same
⚪ U6 missing label, no parser 1h defaults 10 ms 10 ms ⚪ +0% 9 ms 1.11× ✅ same
⚪ U7 missing label, ungrouped sum 1h defaults 5 ms 5 ms ⚪ +0% 9 ms 0.56× ✅ same
⚪ U8 rate of an unwrapped label 1h defaults 6 ms 6 ms ⚪ +0% 12 ms 0.50× ✅ same
⚪ U9 bytes() conversion 1h defaults 10 ms 10 ms ⚪ +0% 9 ms 1.11× ✅ same
Cold (first-run) timings — what a user opening a panel sees
shape range Loki profile base cold PR cold Loki cold PR ÷ Loki cold
drilldown service landing 1h defaults 21 ms 19 ms 390 ms 0.05×
instant ungrouped rate instant defaults 11 ms 12 ms 74 ms 0.16×
json rate by level (no filter, no drop) 1h defaults 400 400 400 —
json volume no filters 1h defaults 164 ms 165 ms 1.24 s 0.13×
logs plain 1h defaults 61 ms 49 ms 449 ms 0.11×
logs | json 1h defaults 115 ms 115 ms 731 ms 0.16×
stream-label count by app 1h defaults 17 ms 16 ms 394 ms 0.04×
topk rate by app 1h defaults 15 ms 17 ms 415 ms 0.04×
label values env ending now 1h defaults 57 ms 56 ms 21 ms † —
label values env ending two days ago (control) 1h defaults 4 ms 4 ms 2 ms † —
labels ending now 1h defaults 20 ms 18 ms 3 ms † —
labels ending two days ago (control) 1h defaults 3 ms 3 ms 2 ms † —
E1 json duration_ms sum by service 1h defaults 63 ms 49 ms 130 ms 0.38×
E2 json duration_ms p95 by service 1h defaults 108 ms 124 ms 144 ms 0.86×
E3 logfmt latency_ms rate, production 1h defaults 302 ms 289 ms 662 ms 0.44×
E4 logfmt size_bytes max by service 1h defaults 37 ms 27 ms 117 ms 0.23×
E6 logfmt ttl unit string (Loki 400) 1h defaults 400 400 400 —
E7 json hexadecimal trace_id (Loki 400) 1h defaults 400 400 400 —
E8 json duration_ms sum by service, namespace prod 1h defaults 167 ms 183 ms 418 ms 0.44×
E9 logfmt latency_ms sum by service, namespace prod 1h defaults 186 ms 189 ms 473 ms 0.40×
D1 logfmt ttl duration_seconds rate by service 1h defaults 44 ms 44 ms 34 ms 1.29×
D2 logfmt ttl duration rate by service 1h defaults 1 ms 1 ms 31 ms 0.03×
G1 logfmt amount sum_over_time, no filter 1h defaults 30 ms 24 ms 50 ms 0.48×
G10 logfmt latency_ms sum_over_time, production 1h defaults 279 ms 280 ms 767 ms 0.37×
G2 json duration_ms sum_over_time, no filter 1h defaults 41 ms 39 ms 166 ms 0.23×
G3 logfmt amount sum_over_time, error filter 1h defaults 26 ms 24 ms 52 ms 0.46×
G4 json duration_ms sum_over_time, error filter 1h defaults 56 ms 58 ms 166 ms ↺ 0.35×
G5 logfmt amount sum by rate 1h defaults 15 ms 14 ms 45 ms ↺ 0.31×
G6 json duration_ms sum by rate 1h defaults 51 ms 52 ms 170 ms 0.31×
G7 duration() of a unit string 1h defaults 41 ms 39 ms 41 ms 0.95×
G8 bytes() of a number 1h defaults 40 ms 37 ms 38 ms 0.97×
G9 json duration_ms max_over_time 1h defaults 59 ms 52 ms 1.12 s 0.05×
W1 sum without pod, max_over_time 1h defaults 43 ms 35 ms 64 ms 0.55×
W2 sum without pod, sum_over_time 1h defaults 38 ms 37 ms 66 ms 0.56×
W3 sum without pod, rate 1h defaults 56 ms 44 ms 60 ms 0.73×
W4 max without pod, max_over_time 1h defaults 20 ms 16 ms 68 ms 0.24×
W7 topk 5 of sum without pod 1h defaults 17 ms 18 ms 66 ms 0.27×
W8 sum without pod, count_over_time (production) 1h defaults 87 ms 88 ms 524 ms 0.17×
U1 logfmt amount rate 1h defaults 28 ms 22 ms 37 ms 0.59×
U2 json duration_ms rate 1h defaults 50 ms 47 ms 96 ms 0.49×
U3 json duration_ms rate, error filter 1h defaults 47 ms 47 ms 106 ms 0.44×
U4 logfmt latency_ms rate, production 1h defaults 199 ms 196 ms 757 ms 0.26×
U8 logfmt amount rate by service (grouped) 1h defaults 25 ms 24 ms 45 ms 0.53×
U9 logfmt amount rate_counter (folded per series) 1h defaults 29 ms 30 ms 184 ms † —
U1 json duration_ms sum by service 1h defaults 58 ms 50 ms 163 ms 0.31×
U12 json duration_ms over every service 1h defaults 149 ms 138 ms 575 ms 0.24×
U13 logfmt latency_ms over every service 1h defaults 284 ms 342 ms 931 ms 0.37×
U14 duration() of a unit string 1h defaults 64 ms 50 ms 42 ms 1.19×
U2 json duration_ms max by service 1h defaults 53 ms 57 ms 537 ms 0.11×
U3 json duration_ms sliding sum 1h defaults 6 ms 6 ms 166 ms 0.04×
U4 logfmt size_bytes sum by service 1h defaults 41 ms 45 ms 38 ms 1.18×
U5 logfmt ttl unit string (no sample) 1h defaults 33 ms 26 ms 33 ms † —
U6 missing label, no parser 1h defaults 30 ms 30 ms 67 ms † —
U7 missing label, ungrouped sum 1h defaults 10 ms 10 ms 68 ms † —
U8 rate of an unwrapped label 1h defaults 51 ms 51 ms 166 ms 0.31×
U9 bytes() conversion 1h defaults 37 ms 37 ms 39 ms 0.95×

† Loki's results cache answered this cold run (its own counters, or identical answers for windows a minute apart): not a computed time, so it is in no ratio.

↺ Loki cold taken from the first set that ran the same query; Loki's cache answered this one.

Why these shapes
  • internal/proxy/proxy.go → 44: unwrap-conversion-error/E1 json duration_ms sum by service, unwrap-conversion-error/E2 json duration_ms p95 by service, unwrap-conversion-error/E3 logfmt latency_ms rate, production, unwrap-conversion-error/E4 logfmt size_bytes max by service, unwrap-conversion-error/E6 logfmt ttl unit string (Loki 400), unwrap-conversion-error/E7 json hexadecimal trace_id (Loki 400), unwrap-conversion-error/E8 json duration_ms sum by service, namespace prod, unwrap-conversion-error/E9 logfmt latency_ms sum by service, namespace prod …
  • control smoke → 8: control/drilldown service landing, control/instant ungrouped rate, control/json rate by level (no filter, no drop), control/json volume no filters, control/logs plain, control/logs | json, control/stream-label count by app, control/topk rate by app
  • internal/proxy/proxy.go (endpoint handler) → 8: control/drilldown service landing, control/instant ungrouped rate, control/json rate by level (no filter, no drop), control/json volume no filters, control/logs plain, control/logs | json, control/stream-label count by app, control/topk rate by app
  • internal/proxy/cache_keys.go → 4: metadata-freshness/label values env ending now, metadata-freshness/label values env ending two days ago (control), metadata-freshness/labels ending now, metadata-freshness/labels ending two days ago (control)

base 4c5b769f96 → PR 51a5dc7fae · 4 runs (first is cold), warm p50 · ranges 1h · noise ±30% and 100 ms · VictoriaLogs restarts 0→0 · 3.0 min · phases stack_up 39s, seed_and_build 42s, loki-defaults:loki_profile 0s, loki-defaults:proxies 2s, loki-defaults:matrix 89s. Same runner, one fresh stack, targets interleaved per request. How to read and reproduce: bench/ab/README.md.

@szibis
szibis force-pushed the fix/metadata-post-cache-alias branch from 12f78e8 to 32241eb Compare October 31, 2026 21:49
@github-actions github-actions Bot added size/XL Extra large change and removed size/XL Extra large change labels Oct 31, 2026
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

✅ Visual smoke: passed

Base 4c5b769f96 vs PR 87728646b2, Grafana through the proxy builds and Loki on one fresh stack; run.
Core set: 9 capture(s) at 1h. Detailed set: 0 entries (nothing visual touched). 9 capture(s), 15m/1h/6h, 24h and 7d stay out of PR runs.

page range set base = PR (data) vs Loki (PR) pixel diff result
dd-fields 1h core ✅ identical identical (4 explained, 1 history-dependent) 0.11% ✅
dd-landing 1h core ✅ identical identical (3 explained) 0.14% ✅
dd-service-logs 1h core ✅ identical identical (3 explained, 1 history-dependent) 0.11% ✅
explore-logs-plain 1h core ✅ identical identical (1 explained) 0.07% ✅
explore-metric-plain 1h core ✅ identical identical (1 explained) 0.04% ✅
explore-sum-by-over-binary 1h core ✅ identical identical (1 explained) 0.04% ✅
explore-topk-by-per-step 1h core ✅ identical identical (1 explained) 0.04% ✅
explore-unwrap-sum 1h core ✅ identical identical (1 explained) 0.04% ✅
lvl-explore-rate-errors-by-service 1h core ✅ identical 1 difference(s), 1 on base too; 1 explained 0.04% ✅

Gate: a base-vs-PR data difference passes when the PR is closer to Loki, and fails when the PR diverges from Loki or Loki cannot decide it (at a range Loki does not hold, a difference passes when the same page proved that query to answer like Loki at a shorter range; otherwise label the pull request visual-change-expected to accept an intended change). Also failing: a panel empty on the PR but not on the base, an error banner, panel error, error answer or new "No data" panel on the PR, a PR side that never settled, a value difference that did not reproduce on the recapture. A delayed first-pass request and pixel differences only warn.

Core set montages (9): base | PR | Loki

dd-fields-1h

dd-fields-1h

dd-landing-1h

dd-landing-1h

dd-service-logs-1h

dd-service-logs-1h

explore-logs-plain-1h

explore-logs-plain-1h

explore-metric-plain-1h

explore-metric-plain-1h

explore-sum-by-over-binary-1h

explore-sum-by-over-binary-1h

explore-topk-by-per-step-1h

explore-topk-by-per-step-1h

explore-unwrap-sum-1h

explore-unwrap-sum-1h

lvl-explore-rate-errors-by-service-1h

lvl-explore-rate-errors-by-service-1h

Published inline montages: pr-visuals/pr-949. Full montage set: artifact.

@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

PR Quality Report

Compared with the PR base commit; measurements below are scoped to their linked run.

Base 4c5b769 → PR 8772864; tested merge 51a5dc7.

Focus signals:

  • Package statement coverage decreased 0.08 percentage points: github.com/ReliablyObserve/Loki-VL-proxy/internal/cache.
  • visual: error / success; Evidence could not be read safely; see the original CI run.. run
  • Exact case comparison: 36 new passing (9 top-level, 27 subtests); github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET, github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/detected_field_values, github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/detected_fields.
  • Declared proven endpoints increased: 11 → 12; declared inventory trend, not runtime proof.
  • Declared API inventory: 25/27 read endpoints implemented, 19 linked to Loki comparison tests, 12 declared proven; 67 open compatibility gaps. These are registry counts, not a runtime pass percentage.
  • A/B selected workload: 56 same; 0 new and 7 pre-existing Loki answer differences. run
  • Above 2× Loki: 0 new, 0 worsened, 0 known, 0 cleared, 0 locked, 0 lost below (warning only; green check does not clear gaps). run
  • Existing CI test evidence: 21202 passed, 0 failed, 72 skipped; scope: internal packages (existing CI artifact). run
  • Broader API/Grafana execution: 17 scopes with retained test outcomes; 0 contain failing cases, 4 contain skips and 0 report flaky/incomplete cases. Candidate-only proof, not a full compatibility percentage.

Main-versus-PR whole-process CPU, peak RSS, physical SSD throughput/IOPS and per-layer evictions are not measured here. Synthetic allocations and fleet cache occupancy do not substitute for them.

Evidence sources and revision status
Source State Result Link Notes
quality completed success run
ci completed success run
perf completed success run
visual error success run Evidence could not be read safely; see the original CI run.
drilldown completed success run
loki completed success run
security completed success run
vl completed success run

Pending, stale, unavailable and skipped sources contribute no measurements.

Coverage and tests
Signal Base PR Delta
Test count 21362 21398 36
Coverage 89.6% 89.6% 0.0% (stable)

Test count includes passing Go test/subtest events, not independent scenarios.

Current CI: 21202 passed, 0 failed, 72 skipped, 2984 top level passed, 18218 subtests passed, 11 packages.
Result scope: internal packages (existing CI artifact).
Cache-package coverage: 88.8932% (candidate only).

API contract coverage and regression changes

Exact Go case outcomes from the existing quality test run. Top-level tests and subtests are separate populations; package + full test name defines identity.

Observed case outcomes Base PR
top-level pass 3104 3113
top-level fail 0 0
top-level skip 2 2
subtests pass 18258 18285
subtests fail 0 0
subtests skip 63 63

Showing 6/6 rows.

Change Package Full test name Population Base PR
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET top-level not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/detected_field_values subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/detected_fields subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/detected_labels subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/index_stats subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/label_values subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/labels subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/volume subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormMatchesGET/volume_range subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormPrecedenceAndImmutable top-level not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTFormSeparatesSelectorsAndWindows top-level not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTMigrationRejectsPriorNamespace top-level not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTMigrationRejectsPriorNamespace/detected_field_values subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTMigrationRejectsPriorNamespace/detected_fields subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTMigrationRejectsPriorNamespace/detected_labels subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTMigrationRejectsPriorNamespace/index_stats subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTMigrationRejectsPriorNamespace/label_inventory subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTMigrationRejectsPriorNamespace/label_values subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTMigrationRejectsPriorNamespace/labels subtests not present pass
new passing github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy TestCanonicalReadCacheKeyPOSTMigrationRejectsPriorNamespace/volume subtests not present pass

Showing 20/36 rows.

Per-package covered/total instrumented statements; missing packages or snapshots have no coverage delta. Coverage changes also reflect changes in the statement denominator.

Package Base covered/total PR covered/total Change
github.com/ReliablyObserve/Loki-VL-proxy/internal/cache 2276/2557 (89.01%) 2274/2557 (88.93%) -0.08 pp
github.com/ReliablyObserve/Loki-VL-proxy/cmd/configdoc 0/26 (0.00%) 0/26 (0.00%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/cmd/healthcheck 0/9 (0.00%) 0/9 (0.00%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/cmd/proxy 891/993 (89.73%) 891/993 (89.73%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/cmd/rules-migrate 37/42 (88.10%) 37/42 (88.10%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/cmd/validate_check 0/19 (0.00%) 0/19 (0.00%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/config 206/232 (88.79%) 206/232 (88.79%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/logql 1786/1951 (91.54%) 1786/1951 (91.54%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/logsql 1134/1415 (80.14%) 1134/1415 (80.14%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/memlimit 30/49 (61.22%) 30/49 (61.22%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/metrics 2174/2300 (94.52%) 2174/2300 (94.52%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/middleware 415/454 (91.41%) 415/454 (91.41%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/observability 128/141 (90.78%) 128/141 (90.78%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/rulesmigrate 83/89 (93.26%) 83/89 (93.26%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/translator 3052/3285 (92.91%) 3052/3285 (92.91%) +0.00 pp
github.com/ReliablyObserve/Loki-VL-proxy/internal/proxy 24688/27599 (89.45%) 24697/27606 (89.46%) +0.01 pp

Showing 16/16 rows.

Declared conformance inventory, not full runtime compatibility. Registry states describe the checked-in contract and proof links; these counts do not certify that every endpoint, version or workload ran successfully.

Loki surface version: v3.7.7 → v3.7.7.

Read API scope: write endpoints are excluded and deletion management is reported separately. POST query transports remain reads. Mixed rule endpoints retain their read methods after registry exclusions. Deprecated read aliases are excluded by owner scope decision; this changes the denominator without proving a compatibility gain.

Declared endpoint inventory Base (read API) PR (read API) Change
Read endpoints: declared total 27 27 +0
Read endpoints: declared implemented 24 25 +1
Read endpoints: linked differential tests 18 19 +1
Read endpoints: declared proven 11 12 +1

Showing 4/4 rows.

Outside the read endpoint score Base PR Change
Write-only endpoints excluded 2 2 +0
Deprecated read aliases excluded 5 5 +0
Deletion management: declared total 1 1 +0
Deletion management: declared implemented 1 1 +0
Deletion management: linked differential tests 0 0 +0
Deletion management: declared proven 0 0 +0

Showing 6/6 rows.

Declared track states Base PR Change
behaviours: gap 3 3 +0
behaviours: not-applicable 0 0 +0
behaviours: partial 17 17 +0
behaviours: proven 6 6 +0
behaviours: unknown 0 0 +0
behaviours: waived 0 0 +0
translations: gap 0 0 +0
translations: not-applicable 0 0 +0
translations: partial 2 2 +0
translations: proven 0 0 +0
translations: unknown 0 0 +0
translations: waived 0 0 +0

Showing 12/12 rows.

Declared gaps / error layer Base PR Change
Declared gaps: open 67 67 +0
Declared gaps: fixed 57 57 +0
Declared gaps: documented 12 12 +0
Declared gaps: owner-kept 6 6 +0
Declared gaps: upstream 2 2 +0
Known error-layer leak cells 57 57 +0
Known error-layer leak links 74 74 +0

Showing 7/7 rows.

Declared item Transition Base state PR state
endpoint:loki_api_v1_label changed gap proven

Showing 1/1 rows.

Selected smoke component checks against the candidate backend only. Both quality snapshot invocations share that backend image, so these checks provide no runtime comparison between revisions. Use the real workload A/B evidence for separately built revisions. This is a small contract sample, not the full declared inventory or version matrix.

Track Component PR passing
drilldown detected_fields 11/11 (100.00%)
drilldown label_values 1/1 (100.00%)
drilldown level_volume 2/2 (100.00%)
drilldown patterns 1/1 (100.00%)
drilldown service_logs 1/1 (100.00%)
drilldown service_selection 1/1 (100.00%)
loki label_values 2/2 (100.00%)
loki labels 4/4 (100.00%)
loki metrics 2/2 (100.00%)
loki otel 1/1 (100.00%)
loki query_range 1/1 (100.00%)
loki series 1/1 (100.00%)
vl detected_fields 4/4 (100.00%)
vl field_values 3/3 (100.00%)
vl index_stats 1/1 (100.00%)
vl stream_translation 1/1 (100.00%)
vl synthetic_labels 1/1 (100.00%)
vl volume_range 1/1 (100.00%)

Showing 18/18 rows.

Broader API and Grafana execution scopes

Existing CI job logs, verified against the tested revision. Candidate only: these scopes have no paired base run here. Go counts include top-level cases and subtests; repeated identities count once and a failed repeat stays failed. Playwright invocations remain separate. Do not sum profiles as independent API coverage. Failed jobs can contain only partial observed populations.

CI source / scope Evidence Passing Failing Skipped Go pass parent / child Flaky / interrupted / not run Logged stack / note
ci / e2e-compat (core) available 4450 0 87 191 / 4259 not recorded PROXY_IMAGE=loki-vl-proxy:e2e-ci
ci / e2e-compat (drilldown) available 95 0 0 28 / 67 not recorded PROXY_IMAGE=loki-vl-proxy:e2e-ci
ci / e2e-compat (otel-edge) available 136 0 0 74 / 62 not recorded PROXY_IMAGE=loki-vl-proxy:e2e-ci
ci / e2e-compat (semantics) available 928 0 3 49 / 879 not recorded PROXY_IMAGE=loki-vl-proxy:e2e-ci
ci / e2e-compat (tail-multitenancy) available 45 0 0 36 / 9 not recorded PROXY_IMAGE=loki-vl-proxy:e2e-ci
ci / e2e-fleet available 56 0 0 9 / 47 not recorded PROXY_IMAGE=loki-vl-proxy:fleet-ci
ci / e2e-ui (comprehensive-drilldown-mt) / invocation 1 available 22 0 0 — 0 / 0 / 0 PROXY_IMAGE=loki-vl-proxy:e2e-ui
ci / e2e-ui (drilldown-core-tail) / invocation 1 available 25 0 0 — 0 / 0 / 0 PROXY_IMAGE=loki-vl-proxy:e2e-ui
ci / e2e-ui (explore-core) / invocation 1 available 9 0 0 — 0 / 0 / 0 PROXY_IMAGE=loki-vl-proxy:e2e-ui
ci / e2e-ui (ops-mt) / invocation 1 available 15 0 1 — 0 / 0 / 0 PROXY_IMAGE=loki-vl-proxy:e2e-ui
ci / e2e-ui (regression-datasource) / invocation 1 available 41 0 10 — 0 / 0 / 0 PROXY_IMAGE=loki-vl-proxy:e2e-ui
ci / e2e-ui (regression-datasource) / invocation 2 available 3 0 0 — 0 / 0 / 0 PROXY_IMAGE=loki-vl-proxy:e2e-ui
drilldown / drilldown-grafana-pr-matrix (12.4.12, previous_smoke, true, ^(TestGrafanaDatasourceCatalogAndHeal... available 49 0 0 3 / 46 not recorded LOKI_IMAGE=grafana/loki:3.7.9, VICTORIALOGS_IMAGE=victoriametrics/victoria-logs:v1.52.0, GRAFANA_IMAGE=grafana/grafana:12.4.12, PROXY_IMAGE=loki-vl-proxy:compat-drilldown
drilldown / drilldown-grafana-pr-matrix (13.2.3, current_smoke, true, ^(TestGrafanaDatasourceCatalogAndHealth... available 49 0 0 3 / 46 not recorded LOKI_IMAGE=grafana/loki:3.7.9, VICTORIALOGS_IMAGE=victoriametrics/victoria-logs:v1.52.0, GRAFANA_IMAGE=grafana/grafana:13.2.3, PROXY_IMAGE=loki-vl-proxy:compat-drilldown
drilldown / drilldown-pinned-runtime available 1 0 0 1 / 0 not recorded LOKI_IMAGE=grafana/loki:3.7.9, VICTORIALOGS_IMAGE=victoriametrics/victoria-logs:v1.52.0, GRAFANA_IMAGE=grafana/grafana:13.2.3, PROXY_IMAGE=loki-vl-proxy:compat-drilldown
loki / loki-pinned available 79 0 0 15 / 64 not recorded LOKI_IMAGE=grafana/loki:3.7.9, VICTORIALOGS_IMAGE=victoriametrics/victoria-logs:v1.52.0, GRAFANA_IMAGE=grafana/grafana:13.2.3, PROXY_IMAGE=loki-vl-proxy:compat-loki
vl / vl-pinned available 3 0 0 3 / 0 not recorded LOKI_IMAGE=grafana/loki:3.7.9, VICTORIALOGS_IMAGE=victoriametrics/victoria-logs:v1.52.0, GRAFANA_IMAGE=grafana/grafana:13.2.3, PROXY_IMAGE=loki-vl-proxy:compat-vl

Showing 17/17 scopes; source links are above.

Real workload A/B: base, PR and Loki

Selected shape × range × Loki profile rows; not the complete workload baseline.

Profile / shape / range Base cold / warm p50 PR cold / warm p50 / p95 Loki cold / warm p50 Result vs Loki
loki-defaults / logs plain / 1h 61 ms / 53 ms 49 ms / 51 ms / 79 ms 449 ms / 435 ms same; same
loki-defaults / logs | json / 1h 115 ms / 76 ms 115 ms / 75 ms / 91 ms 731 ms / 668 ms same; same
loki-defaults / json volume no filters / 1h 164 ms / 57 ms 165 ms / 54 ms / 96 ms 1243 ms / 341 ms same; same
loki-defaults / stream-label count by app / 1h 17 ms / 7 ms 16 ms / 7 ms / 8 ms 394 ms / 99 ms same; same
loki-defaults / topk rate by app / 1h 15 ms / 9 ms 17 ms / 9 ms / 9 ms 415 ms / 134 ms differs; same
loki-defaults / drilldown service landing / 1h 21 ms / 7 ms 19 ms / 6 ms / 7 ms 390 ms / 86 ms same; same
loki-defaults / json rate by level (no filter, no drop) / 1h HTTP 400 HTTP 400 HTTP 400 same; same
loki-defaults / instant ungrouped rate / instant 11 ms / 9 ms 12 ms / 11 ms / 11 ms 74 ms / 70 ms same; same
loki-defaults / labels ending now / 1h 20 ms / 6 ms 18 ms / 6 ms / 7 ms 3 ms / 2 ms same; same; stale answer: base, pr, loki; not a latency reference
loki-defaults / label values env ending now / 1h 57 ms / 9 ms 56 ms / 8 ms / 12 ms 21 ms / 20 ms same; same; stale answer: base, pr, loki; not a latency reference
loki-defaults / labels ending two days ago (control) / 1h 3 ms / 2 ms 3 ms / 1 ms / 1 ms 2 ms / 2 ms differs; same; stale answer: base, pr, loki; not a latency reference
loki-defaults / label values env ending two days ago (control) / 1h 4 ms / 2 ms 4 ms / 1 ms / 2 ms 2 ms / 2 ms differs; same; stale answer: base, pr, loki; not a latency reference
loki-defaults / E1 json duration_ms sum by service / 1h 63 ms / 6 ms 49 ms / 6 ms / 9 ms 130 ms / 14 ms same; same
loki-defaults / E2 json duration_ms p95 by service / 1h 108 ms / 9 ms 124 ms / 9 ms / 9 ms 144 ms / 12 ms same; same
loki-defaults / E3 logfmt latency_ms rate, production / 1h 302 ms / 10 ms 289 ms / 9 ms / 10 ms 662 ms / 88 ms differs; same
loki-defaults / E4 logfmt size_bytes max by service / 1h 37 ms / 6 ms 27 ms / 5 ms / 6 ms 117 ms / 11 ms same; same
loki-defaults / E6 logfmt ttl unit string (Loki 400) / 1h HTTP 400 HTTP 400 HTTP 400 same; same
loki-defaults / E7 json hexadecimal trace_id (Loki 400) / 1h HTTP 400 HTTP 400 HTTP 400 same; same
loki-defaults / E8 json duration_ms sum by service, namespace prod / 1h 167 ms / 8 ms 183 ms / 7 ms / 7 ms 418 ms / 67 ms same; same
loki-defaults / E9 logfmt latency_ms sum by service, namespace prod / 1h 186 ms / 8 ms 189 ms / 8 ms / 12 ms 473 ms / 64 ms same; same

Showing 20/56 rows; full details remain in the linked A/B artifact/comment. † Loki's cache answered cold; not a computed cold comparison. Not-like-for-like rows are not speedup proof.

Profile / shape / range VL sampled max CPU, base VL sampled max CPU, PR VL sampled max CPU, Loki pass
loki-defaults / logs plain / 1h 63.7% 63.7% 63.7%
loki-defaults / logs | json / 1h 63.7% 63.7% 72.1%
loki-defaults / json volume no filters / 1h 72.1% 72.1% 72.1%
loki-defaults / stream-label count by app / 1h 41.28% 41.28% 41.28%
loki-defaults / topk rate by app / 1h 41.28% 41.28% 41.28%
loki-defaults / drilldown service landing / 1h 17.55% 17.55% 17.55%
loki-defaults / json rate by level (no filter, no drop) / 1h 20.36% 20.36% 20.36%
loki-defaults / instant ungrouped rate / instant 20.36% 20.36% 20.36%
loki-defaults / labels ending now / 1h 39.82% 39.82% 39.82%
loki-defaults / label values env ending now / 1h 39.82% 39.82% 39.82%
loki-defaults / labels ending two days ago (control) / 1h 2.42% 2.42% 2.42%
loki-defaults / label values env ending two days ago (control) / 1h 2.31% 2.31% 2.31%

Docker CPU percentages sampled within ±1.5s of each request, maximum across that row's runs. Overlapping work and background activity can contribute; these are not query-attributable CPU seconds. This summary's zero may also mean missing samples.

Distributed cache: candidate only

Current PR candidate only. RF1/RF2 are different configurations, not main/PR comparison. First/repeat populations follow each fleet phase; first is not always cold VL.

RF / phase / layer / replica First p50 / p95 ms Repeat p50 / p95 ms VL calls Peer hits / errors
1 / cross_peer_read / stats_extent / proxy-a 14.452 / 14.452 0.444 / 0.532 1 0 / 0
1 / cross_peer_read / stats_extent / proxy-b 4.212 / 4.212 0.466 / 0.478 0 3 / 0
1 / cross_peer_read / stats_extent / proxy-c 3.973 / 3.973 0.448 / 0.516 0 4 / 0
1 / cross_peer_read / query_steps / proxy-a 15.052 / 24.079 0.549 / 0.825 19 0 / 0
1 / cross_peer_read / query_steps / proxy-b 2.997 / 3.295 0.555 / 0.93 2 18 / 0
1 / cross_peer_read / query_steps / proxy-c 1.939 / 2.733 0.535 / 0.719 2 17 / 0
1 / cross_peer_read / patterns / proxy-a 17.016 / 24.857 0.491 / 0.617 24 0 / 0
1 / cross_peer_read / patterns / proxy-b 4.114 / 4.915 0.624 / 0.895 0 1 / 0
1 / cross_peer_read / patterns / proxy-c 4.636 / 5.315 0.524 / 0.574 0 2 / 0
1 / cross_peer_read / query_range_window / proxy-a 15.6 / 26.655 0.745 / 0.957 32 0 / 0
1 / cross_peer_read / query_range_window / proxy-b 15.874 / 27.185 0.766 / 0.838 19 13 / 0
1 / cross_peer_read / query_range_window / proxy-c 16.307 / 19.342 0.639 / 0.802 11 21 / 0
1 / cross_peer_read / metadata / proxy-a 7.421 / 45.091 0.298 / 0.391 104 0 / 0
1 / cross_peer_read / metadata / proxy-b 0.474 / 1.273 0.313 / 0.394 0 4 / 0
1 / cross_peer_read / metadata / proxy-c 0.707 / 0.8 0.306 / 0.389 0 10 / 0
1 / memory_lost_disk_kept / stats_extent / proxy-b 3.989 / 3.989 0.461 / 0.499 0 3 / 0

Showing 16/216 layer rows; full report in CI artifact.

RF / phase / replica Phase seconds / samples CPU seconds Peak RSS MiB End Loki-layer logical RAM / SSD bytes
1 / cross_peer_read / proxy-a 20.3982 / 41 1.75322 198.543 184065 / 69632
1 / cross_peer_read / proxy-b 20.3982 / 41 1.52392 189.82 133658 / 69632
1 / cross_peer_read / proxy-c 20.3982 / 41 1.54667 186.051 135898 / 77824
1 / memory_lost_disk_kept / proxy-a 7.36311 / 15 0.490045 198.891 169979 / 69632
1 / memory_lost_disk_kept / proxy-b 7.36311 / 15 0.633418 189.836 133047 / 69632
1 / memory_lost_disk_kept / proxy-c 7.36311 / 15 0.456926 186.379 136244 / 77824
1 / disk_lost_refill_from_peers / proxy-a 15.8176 / 32 0.791922 198.949 169978 / 69632
1 / disk_lost_refill_from_peers / proxy-b 15.8176 / 32 0.966384 115.441 157575 / 65536
1 / disk_lost_refill_from_peers / proxy-c 15.8176 / 32 0.730624 188.926 136244 / 77824
1 / owner_down_served_by_others / proxy-a 21.3248 / 14 0.65531 202.402 256077 / 81920
1 / owner_down_served_by_others / proxy-b 21.3248 / 43 1.60384 197.527 288612 / 102400
1 / owner_down_served_by_others / proxy-c 21.3248 / 43 1.48302 200.586 189733 / 94208

CPU seconds are sampled process-counter deltas within a phase, including background activity. RSS peaks belong to each sampled replica, not a simultaneous fleet-wide peak. Occupancy uses Loki-facing l1_memory/l2_disk counters; VL-facing cache occupancy is unmeasured here. Logical cache bytes are not physical disk I/O or process memory. Resources have no main-versus-PR delta.

RF / phase / layer / replica Requests Disk / window hits Peer misses / backup hits Fleet VL / background VL calls Observed VL routes
1 / all_lost_rebuild_equals_loki / metadata / proxy-a 12 0 / 0 118 / 0 104 / 0 /select/logsql/field_names=22, /select/logsql/field_values=6, /select/logsql/query=20, /select/logsql/stream_field_names=20
1 / all_lost_rebuild_equals_loki / patterns / proxy-a 2 0 / 0 2 / 0 24 / 0 /select/logsql/query=24
1 / all_lost_rebuild_equals_loki / patterns / proxy-b 2 0 / 0 0 / 0 0 / 0 —
1 / all_lost_rebuild_equals_loki / patterns / proxy-c 2 0 / 0 0 / 0 0 / 0 —
1 / all_lost_rebuild_equals_loki / query_range_window / proxy-a 2 0 / 0 18 / 0 32 / 0 /select/logsql/hits=16, /select/logsql/query=16
1 / all_lost_rebuild_equals_loki / query_steps / proxy-a 2 0 / 0 39 / 0 19 / 0 /select/logsql/query=1, /select/logsql/stats_query_range=2, /select/logsql/stream_field_names=16
1 / all_lost_rebuild_equals_loki / query_steps / proxy-b 2 0 / 0 1 / 0 2 / 0 /select/logsql/query=1, /select/logsql/stream_field_names=1
1 / all_lost_rebuild_equals_loki / query_steps / proxy-c 2 0 / 0 2 / 0 2 / 0 /select/logsql/query=1, /select/logsql/stream_field_names=1
1 / all_lost_rebuild_equals_loki / stats_extent / proxy-a 1 0 / 0 3 / 0 1 / 0 /select/logsql/stats_query_range=1
1 / all_lost_rebuild_equals_loki / stats_extent / proxy-b 1 0 / 0 0 / 0 0 / 0 —
1 / all_lost_rebuild_equals_loki / stats_extent / proxy-c 1 0 / 0 0 / 0 0 / 0 —
1 / disk_lost_refill_from_peers / metadata / proxy-b 36 0 / 0 6 / 0 31 / 0 /select/logsql/field_names=8, /select/logsql/field_values=6, /select/logsql/query=8, /select/logsql/stream_field_names=2
1 / disk_lost_refill_from_peers / patterns / proxy-b 6 0 / 0 0 / 0 0 / 0 —
1 / disk_lost_refill_from_peers / query_range_window / proxy-b 6 0 / 9 2 / 0 11 / 0 /select/logsql/hits=4, /select/logsql/query=7
1 / disk_lost_refill_from_peers / query_steps / proxy-a 2 0 / 0 0 / 0 0 / 0 —
1 / disk_lost_refill_from_peers / query_steps / proxy-b 8 0 / 0 2 / 0 12 / 0 /select/logsql/query=5, /select/logsql/stats_query_range=2, /select/logsql/stream_field_names=5

Request-counter sums across each shown phase/layer/replica, including first and repeat requests. Showing 16/216 groups, disk-loss/restart and owner-loss phases first. Fleet VL calls exclude background calls; background is listed separately. These counters are not physical disk reads or throughput. Full routes and inventory-unit attribution remain in the artifact.

RF / phase / backend container Phase seconds / samples CPU avg / max Peak container memory MiB
1 / cross_peer_read / fleet-loki 20.3982 / 5 0.67% / 1.2% 50.68
1 / cross_peer_read / fleet-vl 20.3982 / 5 3.228% / 6.81% 15.2
1 / memory_lost_disk_kept / fleet-loki 7.36311 / 2 0.525% / 0.54% 51.95
1 / memory_lost_disk_kept / fleet-vl 7.36311 / 2 3.475% / 3.62% 11.77
1 / disk_lost_refill_from_peers / fleet-loki 15.8176 / 4 0.5675% / 0.62% 54.76
1 / disk_lost_refill_from_peers / fleet-vl 15.8176 / 4 1.4625% / 3.86% 12.64
1 / owner_down_served_by_others / fleet-loki 21.3248 / 5 0.848% / 2.1% 57.81
1 / owner_down_served_by_others / fleet-vl 21.3248 / 5 3.17% / 6.47% 14.47
1 / all_lost_rebuild_equals_loki / fleet-loki 16.9519 / 4 0.5475% / 0.58% 58.14
1 / all_lost_rebuild_equals_loki / fleet-vl 16.9519 / 4 2.705% / 6.83% 16.86
1 / near_now_label_inventory / fleet-loki 33.3444 / 8 0.5875% / 0.74% 88.37
1 / near_now_label_inventory / fleet-vl 33.3444 / 8 2.79% / 7.39% 12.15
1 / edge_disk_full / fleet-loki 30.191 / 8 0.5675% / 0.68% 93.01
1 / edge_disk_full / fleet-vl 30.191 / 8 1.75375% / 5.61% 17.13
1 / edge_owner_paused_timeout_bound / fleet-loki 27.9954 / 7 0.572857% / 0.68% 97.54
1 / edge_owner_paused_timeout_bound / fleet-vl 27.9954 / 7 1.75714% / 3.92% 17.39

Existing docker stats samples from the candidate fleet's Loki/VL containers; CPU is Docker percentage, not CPU seconds or a main/PR delta. Memory is sampled container usage, not proxy RSS.

Synthetic handler microbenchmarks

Synthetic handler elapsed time and allocations; not process CPU, RSS or physical disk I/O. Repeated-sample medians.

Signal Base PR Delta
QueryRange cache-hit elapsed 3564 ns/op 3531 ns/op -0.9% (stable)
QueryRange cache-hit allocated bytes 1256 B/op 1256 B/op 0.0% (stable)
QueryRange cache-hit allocations 28 allocs/op 28 allocs/op 0.0% (stable)
QueryRange cache-bypass elapsed 4243 ns/op 4222 ns/op -0.5% (stable)
QueryRange cache-bypass allocated bytes 1325 B/op 1321 B/op -0.3% (stable)
QueryRange cache-bypass allocations 28 allocs/op 28 allocs/op 0.0% (stable)
Labels cache-hit elapsed 949.2 ns/op 940.1 ns/op -1.0% (stable)
Labels cache-hit allocated bytes 48 B/op 48 B/op 0.0% (stable)
Labels cache-hit allocations 3 allocs/op 3 allocs/op 0.0% (stable)
Labels cache-bypass elapsed 1571 ns/op 1544 ns/op -1.7% (stable)
Labels cache-bypass allocated bytes 400 B/op 400 B/op 0.0% (stable)
Labels cache-bypass allocations 14 allocs/op 14 allocs/op 0.0% (stable)

Labels follow the existing gate percentage, absolute and low-baseline guards, including pooled-path allowances.

CI regression checks
Source / check State Result
ci / bench completed success
ci / conformance completed success
ci / docker completed success
ci / e2e-compat completed success
ci / e2e-compat (core) completed success
ci / e2e-compat (drilldown) completed success
ci / e2e-compat (otel-edge) completed success
ci / e2e-compat (semantics) completed success
ci / e2e-compat (tail-multitenancy) completed success
ci / e2e-fleet completed success
ci / e2e-ui (comprehensive-drilldown-mt) completed success
ci / e2e-ui (drilldown-core-tail) completed success
ci / e2e-ui (explore-core) completed success
ci / e2e-ui (ops-mt) completed success
ci / e2e-ui (regression-datasource) completed success
ci / fuzz-smoke completed success
ci / helm completed success
ci / image completed success
ci / lint completed success
ci / memory-leak-tests completed success
ci / race-stress completed success
ci / race-stress-shard (1) completed success
ci / race-stress-shard (2) completed success
ci / race-stress-shard (3) completed success
ci / race-stress-shard (other) completed success
ci / scope / scope completed success
ci / stress-tests completed success
ci / test completed success
ci / tuple-contract completed success
ci / tuple-smoke completed success
drilldown / drilldown-contract-matrix completed skipped
drilldown / drilldown-grafana-pr-matrix (12.4.12, previous_smoke, true, ^(TestGrafanaDatasourceCatalogAndHeal... completed success
drilldown / drilldown-grafana-pr-matrix (13.2.3, current_smoke, true, ^(TestGrafanaDatasourceCatalogAndHealth... completed success
drilldown / drilldown-grafana-runtime-matrix completed skipped
drilldown / drilldown-matrix-source completed success
drilldown / drilldown-pinned-runtime completed success
drilldown / scope / scope completed success
loki / loki-matrix completed skipped
loki / loki-matrix-source completed success
loki / loki-pinned completed success
loki / scope / scope completed success
perf / perf-smoke completed success
perf / scope / scope completed success
quality / report completed success
quality / scope / scope completed success
security / Security / runtime completed success
security / Security / static completed success
security / scope / scope completed success
vl / scope / scope completed success
vl / vl-matrix completed skipped
vl / vl-matrix-source completed success
vl / vl-pinned completed success

Showing 52/52 checks; failed and pending checks first. Full job lists remain in the linked runs.

Required checks decide merge safety. This report summarizes selected evidence; rendering starts no tests or heavy workloads.

@szibis
szibis force-pushed the fix/metadata-post-cache-alias branch from d1367e2 to d4e732b Compare October 31, 2026 22:10
@github-actions github-actions Bot added size/XL Extra large change and removed size/XL Extra large change labels Oct 31, 2026
@szibis
szibis force-pushed the fix/metadata-post-cache-alias branch from d4e732b to 30f8c06 Compare October 31, 2026 22:12
@github-actions github-actions Bot added size/XL Extra large change and removed size/XL Extra large change labels Oct 31, 2026
@szibis
szibis marked this pull request as ready for review October 31, 2026 23:16
@szibis
szibis force-pushed the fix/metadata-post-cache-alias branch from 30f8c06 to 8772864 Compare October 31, 2026 23:22
@github-actions github-actions Bot removed the size/XL Extra large change label Oct 31, 2026
@github-actions github-actions Bot added the size/XL Extra large change label Oct 31, 2026
@szibis
szibis merged commit b45bb5a into main Nov 1, 2026
74 checks passed
@szibis
szibis deleted the fix/metadata-post-cache-alias branch November 1, 2026 09:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugfix Bug fix scope/ci CI/CD scope/docs Documentation scope/proxy Proxy core scope/tests Tests size/XL Extra large change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant