Features
- Series carrying a label set but no samples are now rejected while the protobuf is parsed. The check already existed, but only fired later, when the series was added to the LSS during relabeling — a much heavier operation that takes locks and does extra bookkeeping for input that was going to be rejected anyway.
read_timeseries_label_set/Protobuf::parse_timeseriesnow throw right away instead. The new opt-inPROMPP_FEATURES=enable_skip_no_samples_seriesflag silently skips such series instead of erroring, for clients known to send them legitimately (#506). - The WAL V2 segment format can now actually be turned on. The format (per-segment embedded ID, decoded by
loadSegmentsV2) already existed, butcreateShardOnDiskalways wrote V1 regardless: theenable_wal_writer_v2PROMPP_FEATURESflag had nothing wired to it. Shard WAL headers and segments now go through a pair of process-global switches thatEnableWalWriterV2()flips together, so the segment encoding and the header version tag stay consistent and replay picks the matching decoder (#510).
Fixes
- Finalized chunks leaked when jemalloc arenas were enabled.
FinalizedChunkListtook noReallocatorand always allocated through plainmalloc/free, bypassing the arena, so the finalized chunks of aDataStoragewith arenas enabled were never freed when it was destroyed. It now takes aReallocator, matchingOutdatedChunk(#508). - Series still receiving samples over remote write could be pruned from the LSS as inactive. On the read-only transition path (
input_transition_relabeling_only_read) a series found in the target LSS was not marked active, and the active-series bitset was not resized after an LSS copy, so a later prune before the fixed state could drop series that were in fact live. The path now marks found series active atomically, the copier resizes the bitset, andprune_hidden_series_before_fixed_statebounds itself by the next item index instead of the bitset size (#495). - LSS reallocations were lost when relabeling returned an error. The
prompp_prometheus_per_goroutine_relabeler_*bridge functions computedbuild_deferred_indexes()andtarget_lss_has_reallocationsonly on the success path inside thetry, and the appender skippedLSSResetSnapshot()whenever relabeling failed. Since allocations can happen before relabeling aborts, this left the head's allocated-memory tracking and LSS snapshot out of sync with an LSS that had actually grown. Both now run unconditionally (#504). - Dependency security updates. Bumped
google.golang.org/grpcto v1.83.2, picking up the fix for CVE-2026-84445 — a request missing both the:authorityandHostheaders panics an xDS gRPC server, taking the whole process down (#502). The OpenTelemetry modules (otel,otel/sdk,otel/traceand the threeotlptraceexporters) moved to v1.45.0 (#511, #512, #513, #514); the SDK builds its resource against semconv 1.43, sotracing.gowas moved off semconv 1.41 — otherwiseresource.Newrefuses to merge the two schema URLs and no tracer provider can be installed.
Other
inline __attribute__((always_inline))replaced with thePROMPP_ALWAYS_INLINEmacro throughout the C++ core (#496).- The web UI Jest suites are green again.
@codemirror/state6.5.x pulls in@marijn/find-cluster-break, whose packagemainis ESM-only, which aborted everycodemirror-promqlsuite under Jest; it is now mapped to the shipped CommonJS build. The legacyreact-app— whose enzyme 3.11 stack is incompatible with currentcheerio— was dropped frommake ui-test, mirroring upstream; it is still built and linted. Aui-testsCI job runs the module suites (#469).