Features
- Append and WAL latency can now be broken down by stage. New low-overhead counters report the duration and execution count of caller-side append stages (
prompp_head_append_stage_*), the maximum duration across shards (prompp_head_append_shard_stage_*), and WAL operations (prompp_shard_wal_stage_*). The metrics distinguish semaphore waits, relabeling and cache hits or misses, data-storage writes, WAL writes, commits, flushes and syncs without adding ashard_idlabel (#529). - Previously unattributed relabeling and label-storage memory is now visible.
prompp_scrape_relabeling_caches_bytesreports scrape and report-state mapping caches per scrape job, with memoized C++ measurements to avoid a cgo call on every steady-state scrape.prompp_head_cgo_memory_bytesnow reports the ingestion-only input LSS underallocator="input_lss";allocator="main_lss"contains only the target LSS, so their sum preserves the previous total (#533).
Fixes
- Persisting a head can no longer read a stale chunk iterator after loading the next batch. The recoder used to position the next batch before
Loader::load_finalizecould replace a finalized chunk, leaving cached pointers to freed memory. Depending on allocator reuse this caused a crash inChunkRecoderIterator, wrote overlapping chunks that later failed compaction, or skipped a batch that appeared empty before loading. The iterator is now positioned only after the batch has been loaded (#531). - Compaction safely treats empty input and an all-corrupted input set as a no-op. Both the upstream TSDB compactor path and the Prom++ lcompactor path now return no block instead of dereferencing an empty meta list, panicking, or attempting to write a bogus block. Corrupted blocks remain marked and are excluded from the next plan, so the compaction loop terminates normally (#532, #534).
- Two C++ undefined-behaviour paths were hardened. The WAL timestamp encoding heuristic now uses guarded unsigned arithmetic instead of underflowing, and jemalloc's slab-bitmap exhaustion path aborts on the violated allocator invariant instead of retrying an allocation through an out-of-bounds bitmap access (#535).
- Go updated to 1.26.9, closing the twelve standard-library advisories
govulncheckreports as reachable against the 1.26.8 toolchain the previous release was built with: innet/http, HTTP/2 server memory exhaustion through declaredTrailerfields (GO-2026-6603), HTTP/1 client connection desynchronization after a rejectedCONNECT(GO-2026-6605), an unboundedRangeheader parse (GO-2026-6609), the HTTP/2 transport accepting malformed framing headers (GO-2026-6610), CPU exhaustion from repeated initial window changes (GO-2026-6611), a double connection-level flow-control refund on reset streams (GO-2026-6612), HTTP/1 server desynchronization after a 2xxCONNECTresponse (GO-2026-6613) and an HPACK encoder race crashing the HTTP/2 server (GO-2026-6617); a memory-limit bypass parsing MIME headers innet/textprotoandmime/multipart(GO-2026-6608); malformed ECH outer extension references incrypto/tls(GO-2026-6607); and two JavaScript context-tracking errors inhtml/template, both reachable through the template expander and the web handlers (GO-2026-6599, GO-2026-6600). The thirteenth advisory of this release,os.Root.Mkdirfollowing junctions out of the root (GO-2026-6604), is Windows-only and does not apply to the shipped builds. Both the CI image and the werf build pin the new version. golang.org/x/netupdated to v0.60.0, together with the compatiblex/cryptov0.57.0,x/modv0.41.0,x/syncv0.23.0,x/sysv0.48.0,x/termv0.46.0 andx/textv0.42.0. Five of the HTTP/2 defects above also live inx/net/http2(GO-2026-6603, GO-2026-6610, GO-2026-6611, GO-2026-6612, GO-2026-6617), and that package is linked into the binaries throughprometheus/common/config, which configures the HTTP/2 transport of every scrape and remote-write client (#536).source-map-jsupdated to 1.2.2 in the web UI, closing GHSA-68fv-2mgg-jv7q — indexed source-map section offsets are read without validation, so a crafted map can stall the event loop. It reaches the shipped UI throughsanitize-html→postcss. Thebracesadvisory GHSA-vfj7-8cjw-p6xm has no fixed release and is reachable only through thesasscompiler and the dev-server proxy, neither of which ends up in the embedded bundle, so it is left in place.
Performance
- WAL v2 commits only the shard whose segment reached its size limit. Cold shards are no longer forced to emit small segments and perform
write/fsyncwork whenever a busy shard fills up. WAL v1 retains the commit-all behaviour. The v2 loader now accepts uneven shard segment counts and validates the global segment-ID sequence, including a missing ID 0 and empty shards. A head keeps the behaviour of the format stored on disk when the feature flag changes. Downgrading below this release with WAL v2 enabled is not supported: older versions can mark a head with uneven shard files read-only (#524). - Identical timestamp sequences are shared inside
DataStorage. The timestamp encoder is replaced by a reference-counted sequence dictionary, so series with the same timestamp progression reuse one encoded stream instead of keeping duplicate timestamp state and finalized streams. Chunk lifecycle, serialization and memory accounting now operate on the shared sequence IDs (#530).
Other
- The first part of the head catalog v3 codec is in place, without changing the production on-disk format. The new codec supports per-record field presence, protobuf payloads and CRC32C-framed records; v1 and v2 codecs were split into explicit implementations. Production and
prompptoolcontinue to write v2, so rollback remains safe. Runtime retention decisions can now use a head's actualmaxtafter rotation or persistence, falling back tocreatedAtafter a v2 restart (#528).