Wire mergedTracerTags as a read-through parent at span build (level-split phase 1)#11932
Wire mergedTracerTags as a read-through parent at span build (level-split phase 1)#11932dougqh wants to merge 1 commit into
Conversation
🟢 Java Benchmark SLOs — All performance SLOs passed
PR vs. master results
Commit: Load and DaCapo benchmarks can be triggered manually in the GitLab pipeline. Results will appear in the Benchmarking Platform UI after completion. |
7bb20f4 to
e65e58f
Compare
3a0a318 to
e692601
Compare
e65e58f to
3b9156e
Compare
This comment has been minimized.
This comment has been minimized.
Directional span-creation benchmark: master vs this branchGrafted Config:
Throughput deltas were all within noise (≤1.6%, no trend) — directional only, not quoted. Read: the deltas are small but real — a consistent ~50–150 B/op reduction (the Consistent with the settled framing: read-through is structural groundwork (dense-store enabler), not a standalone span-creation alloc headline. From Claude: directional check requested during the fold/read-through rebase; grafted benches, not part of the branch diff. 🤖 Generated with Claude Code |
StringIndex is a compact open-addressed string→index structure (the keyOf substrate the dense tag store builds on): parallel hash/name arrays, linear probing, on par with HashSet on lookup at a smaller footprint. Includes unit tests, a footprint test (jol), and comparison benchmarks (vs HashSet/switch). No TagMap changes — standalone util. Rebased onto the level-split stack (consumer #11932) as the layer dense-store sits on. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…plit phase 1) Attach the trace's merged tracer tags to each span's TagMap as a frozen read-through parent (via TagMap.createFromParent) at span construction, instead of copying them into every span. The span sees the shared tags on read and only stores its own local tags, so the common trace-level bundle is held once per trace rather than duplicated per span. - CoreTracer builds the frozen merged-tracer-tags parent once; config version is kept out of that bundle. - DDSpanContext attaches the parent at construction (fixed, no re-parenting). - Adds TagMapReadThroughBenchmark (copy-down vs read-through, -prof gc). Stacked on the read-through mechanism (#11789), which builds on the folded final-class TagMap (#11967). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3b9156e to
d2aa48f
Compare
StringIndex is a compact open-addressed string→index structure (the keyOf substrate the dense tag store builds on): parallel hash/name arrays, linear probing, on par with HashSet on lookup at a smaller footprint. Includes unit tests, a footprint test (jol), and comparison benchmarks (vs HashSet/switch). No TagMap changes — standalone util. Rebased onto the level-split stack (consumer #11932) as the layer dense-store sits on. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
What Does This Do
Splits trace-level tags & span-level tags into two separate TagMap-s
To maintain full semantic compatibility, this is done via the read-through parent capability introduced in #11789.
Motivation
Reduces some allocation by avoiding the cloning of the BucketGroup collision chain
Reduces span creation time by replacing O(n) map-walk with O(1) referencing of parent TagMap
Additional Notes
Stacked on #11789 (TagMap read-through mechanism) — review that first.
Level-split phase 1: the wiring. Attaches
mergedTracerTagsas a read-through parent at span build (gated on!mergedTracerTagsNeedsIntercept) instead of copying it into every span's storage. This is the change that actually activates read-through — #11789 alone is inert (parent == null).Commits: config-version handling out of the trace-level bundle, the read-through flip (
DDSpanContext.parentTags/CoreTracercopy-vs-share gate), and aTagMapReadThroughBenchmark.Draft — description to be refined; posting now so review can start this week ahead of the release cut.
🤖 Generated with Claude Code