v5.107.0 proposal - #8791
Merged
Merged
Conversation
A loop benchmark slowly rots into measuring process startup instead of its hot path as the requires it pulls in grow. The guard captures load time at require, the loop boundary at loopStart(), and fails the run when load+setup exceeds the allowed share of the total run.
The previous guard only failed once a single shard's group size exceeded the core count, by which point variants past the matrix were already silently dropped. Derive the shards the suite needs from ceil(variants / cores) and fail with the exact SPLITS/GROUP value to configure, so a growing suite surfaces the matrix change instead of quietly skipping benchmarks.
The url.parse method is long deprecated and not used in any supported Node.js versions. Removing it prevents a deprecation notice for modern Node.js versions. Fixes: #8713
* fix(esbuild): drop ...arguments spread from CJS module wrap Bundling with `format: 'esm'` and `minifyIdentifiers: true` (which `minify: true` enables) crashes at module load with `ReferenceError: arguments is not defined`. esbuild's identifier minifier rewrites the surrounding `__commonJS` factory from a `function` expression into an arrow, and arrows resolve `arguments` to the enclosing scope -- which is ESM top-level, where the binding does not exist. The IIFE around the instrumented module body now forwards `module.exports, module` explicitly. It stays parameter-less so `require`, `module`, and `exports` inside the wrapped code keep referring to the factory's closure -- preserving esbuild's static `require()` resolution that the aws-sdk and other CJS modules with relative dynamic requires depend on. Fixes: #8681 * test(esbuild): cover minified CJS wrapper globals The ESM minifier regression also needs to preserve CommonJS globals and static relative requires inside wrapped modules. Pin that behavior so a future wrapper change does not trade the arguments crash for a runtime require fallback.
…level so that the logs can be suppressed when modifying the log level (#8677)
* feat(release): cap proposal at 100 commits and notify guild at 50
GitHub's rebase limit is 100 commits per PR. Commits beyond that are
silently ignored, requiring additional releases to publish them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(release): use existing SLACK_CHANNEL_ID secret
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ci(release): recompute release notes from proposal branch when truncated
When commits are capped at the GitHub rebase limit, lineDiff covers all
commits from v5.x to master and would include notes for commits deferred
to a subsequent release. Recompute from the actual proposal branch HEAD
instead so the notes file only reflects what is in this release.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ci(release): limit new changes display to commits being applied
When truncated, compare up to the last applied SHA instead of main so
the displayed list matches what ends up in the release notes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ci(release): simplify proposal script and reduce code paths
- Replace lineDiff with allDiff for isMinor check (same result, one
fewer branch-diff call)
- Compute proposalShas directly as an array instead of a string
- Always recompute release notes from HEAD, eliminating the truncated
conditional
- Remove limitedDiff variable, inline shasToApply.join(' ')
- Flatten if/else structure: shasToApply > 0, at limit, or no changes
- Fix potential undefined crash when shasToApply is empty but
proposalShas is not (was passing undefined to branch-diff)
- Use a distinct message when the proposal is already full vs. when
commits are partially truncated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ci(release): fix notes links to point to main instead of proposal branch
branch-diff uses commit SHAs in generated links. Comparing to HEAD uses
cherry-pick SHAs that resolve to the proposal branch. Instead, use the
last applied main SHA as the upper bound so links always point to
original commits on main. Also drops the now-redundant lineDiff variable.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ci(release): recompute isMinor and notes from capped upper bound
Derives upperBoundSha early (before any branch checkout) so isMinor
is based only on commits that will fit in the proposal, and release
notes are written in one pass without a redundant branch-diff call.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ci(release): gate release on capped diff to avoid deferred-commit false positives
Previously the gate checked allDiff (all of main), so a deferred commit
beyond position 99 with a semver label would trigger a release containing
only unlabeled commits. Now both the gate and isMinor use cappedDiff
(scoped to upperBoundSha) so they reflect only commits that will actually
be included in the proposal.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ci(release): remove semver label gate now that all PRs require a label
All PRs are now required to have a semver label, so the label check was
redundant. The only remaining gate is whether there are any commits at
all between the release branch and main.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Drives the real PinoPlugin.handleJsonLine (buildLogHolder + the JSON splice) per log line, so the bench tracks the production injection path rather than a copy.
…#8730) New IAST taint-tracking microbench (transaction lifecycle, sink checks), plus keep-alive/reqs/iterations tuning of the appsec and appsec-iast live benches.
Makes the spans bench count-driven, adds a many-tags variant, and batches the finish-later path to keep memory flat.
New sirun bench for the mongodb-core plugin's per-command tracer overhead (bindStart: command shape, namespace, query tagging).
Adds collect-overview.js, which runs the non-live benches locally and reports per-variant runtime, stddev, and startup share via the guard's report mode.
…8756) * perf(format): clear hot-path tags with undefined instead of delete `delete` on the plain `_tags` / `trace.tags` objects transitions them into V8 dictionary (slow) mode, so the per-span extractTags scan and the per-trace propagation scan that follow pay the slow path on every event-bearing or re-sampled trace. Clearing the key by assigning undefined keeps the hidden class; both the encode loop and header injection already skip undefined values, so the emitted meta and the injected headers are byte-identical. Two sites carried the delete: 1. resolveServiceSource clears `_dd.svc_src` when the span service matches the tracer service. 2. PrioritySampler clears the decision-maker tag when a previously kept trace is dropped. * perf(span): drop per-span throwaway allocations in the constructor Every span paid for two allocations it never needed. The constructor copied the caller's per-call `fields.tags` into a throwaway object only to merge that copy into the context tag bag one line later; the merge already copies values into the context's own object, so the intermediate never protected anything. `_createContext` likewise allocated a `baggage` object on every span when only the `propagation_behavior_extract=restart` path ever reads it. Merging `fields.tags` directly and deferring the baggage object to the restart branch removes both allocations from the hottest tracer operation (it runs on every span, not only finished ones). Express-root-shaped span constructor, n=2M x 7 trials, drop best+worst, Node 24.15 / V8 13.6: tag merge 39.0 -> 30.2 ns; full create path 264 -> 251 ns.
* bench(core): tune the async_hooks and scope benches
- async_hooks: drop the no-hooks baseline variant, leaving init-only and
all-hooks.
- scope: add a startup guard and a bind variant, and retune the per-variant
counts so each run stays loop-dominated.
* bench(scope): give the synthetic span a real storage handle
The synthetic span used a plain `{}` as `_store`, which is never a key in
the legacy-storage WeakMap. `scope.activate()` resolves the parent store
through `getStore(span._store)`, so the lookup missed and `{ ...newStore,
span }` copied nothing: the `scope_enabled` and `bind` variants measured
only enterWith and understated the per-hop activate cost they advertise.
Seed an active store and capture its handle so the lookup hits and the
parent-store copy runs, with a pre-flight assertion pinning it.
These benches landed before the per-variant runtime budget was set and push the suite toward the job timeout. Lower the sirun repeat counts (and url's loop, llmobs' iterations) so each variant finishes well under a minute; the startup-guard still keeps the load share, and therefore the wall-time stddev, low at the new counts. - mongodb-core, iast: iterations 15 -> 12 - spans: iterations 20 -> 12 - url: COUNT 3.5M -> 3M - llmobs: ITERATIONS 30k -> 24k
…#8760) web.startSpan already enters { ...store, span } for a fresh request via TracingPlugin.startSpan, so the unconditional this.enter(span, store) that followed bound the same store a second time: one extra AsyncLocalStorage.enterWith per request on the hottest server path. The re-enter is only load-bearing when the bind would differ from the one startSpan made: a reused context (HTTP/2 stream, serverless re-entry) where startSpan returns the existing span without entering, or when AppSec rebuilt the store with req. Gating on `!spanCreated || appsecActive` covers both and drops the redundant enterWith to zero on the common path. Existing http and http2 scope tests pin the context correctness across both branches.
…eld (#8759) `onSpanFinished` computed the bucket time from `span.startTime`, but the span it receives is the post-format span, whose field is `start` (nanoseconds). `startTime` is undefined there, so `start + duration` is NaN and every span collapsed into a single NaN-keyed time bucket. The field was renamed to `start` when stats moved to post-format spans; this read was never updated. The existing test mocked `{ startTime }`, matching the bug rather than the real formatted shape, so it never caught it. The mock now uses `start` and a regression test pins the bucket key to a finite value and to its interval boundary.
Measures the redis plugin's per-command tracer overhead -- command normalization, raw-command formatting, the per-connection service cache -- over representative command shapes (get/set/hset, oversized value, wide mset).
New kafkajs producer/consumer bench plus data-streams (DSM) checkpoint tuning -- the per-message pathway-hash and checkpoint overhead.
…lement (#8689) * fix(llmobs): fan array-valued user tags out into one wire entry per element `tracer.llmobs.annotate({ tags: { 'tool.shell.bin': ['grep', 'head'] } })` produced a single `"tool.shell.bin:grep,head"` wire entry, which intake then comma-split — leaving `head` as a bare orphan in the LLMObs tag panel and breaking `@tool.shell.bin:head` facet filters. One `key:value` entry per array element keeps each value addressable as its own facet, matching the APM tagger's contract for `string[]` tag values. As a side effect, an empty array now emits zero entries instead of a `"key:"` placeholder — the previous output was a no-value tag the user never asked for. Fixes: #8662 * fix(llmobs): keep empty array tags on the wire to preserve cost-tag refs `validateCostTags` only checks that a cost-tag reference key is present in the tag object — not that the key produces a wire entry. Annotating `tags: { team: [] }` with `costTags: ['team']` therefore ships `_dd.cost_tags: ['team']` against an absent `team:*` tag, which dd-go drops or misattributes. Empty arrays fall through to the scalar branch and still emit `key:`, matching the wire shape of any other empty-ish tag value.
- startup: slim the everything-fixture to the modules the bench loads, drop the redundant control baselines, and raise the sample count. - runtime-metrics: retune and raise the sample count for a tighter mean. - log: drive the loop from COUNT (default 800k, down from a hardcoded 1M).
The bench called the plugin's util helpers directly, so it measured buildWebSocketSpanPointerHash / incrementWebSocketCounter in isolation rather than the plugin's per-message path. Subclass WSProducerPlugin / WSReceiverPlugin with the tracer-reaching hooks stubbed and drive bindStart + end, so the send and receive variants measure the real instrumentation (resource parse, meta build, span link, span-pointer hash) that production pays per message.
…8771) `tracer.startSpan()` only sets the parent from `childOf`; it does not make the span active on the scope. Nested `tracer.trace()` calls and auto-instrumented spans therefore parent to whatever was already active, not to the newly created span, which surfaces as sibling spans appearing "out of order" in the trace view. The OpenTelemetry-bridge `startSpan` already documents the equivalent no-context behavior; the OpenTracing-style method did not. Fixes: #3570
juan-fernandez
requested review from
greghuels,
khanayan123,
lym953,
sameerank and
tlhunter
and removed request for
a team
June 11, 2026 07:40
juan-fernandez
previously approved these changes
Jun 11, 2026
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 77ab72aa51
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…intake (#8847) * fix(exporters): send agentless spans to the https intake, not the agent URL The agentless APM exporter took its intake from config.url, which defaults to the local agent URL over plain http. Agentless traffic carries the Datadog API key, so the key was pointed at the agent's cleartext endpoint instead of the intake. The exporter now always builds the intake from the configured site over https and never consults the agent URL; DD_SITE stays the knob for redirecting it. Refs: https://datadoghq.atlassian.net/browse/APMSP-3483 * fix(exporters): never send the Datadog API key over cleartext http A misconfigured or default intake URL could point agentless traffic at a non-loopback host over plain http, putting the dd-api-key on the wire in the clear where any on-path observer could read it. Strip the dd-api-key header (both casings) and log when a request targets a non-loopback host over http. Loopback hosts (localhost, 127.0.0.0/8, ::1) stay exempt so the local agent and dev proxies keep working. Stripping rather than dropping the request preserves agent-proxied telemetry, which authenticates with its own key rather than the header.
dd-octo-sts
Bot
force-pushed
the
v5.107.0-proposal
branch
from
June 11, 2026 10:43
77ab72a to
6ce1d36
Compare
BridgeAR
previously approved these changes
Jun 11, 2026
BridgeAR
enabled auto-merge (rebase)
June 11, 2026 10:51
dd-octo-sts
Bot
force-pushed
the
v5.107.0-proposal
branch
from
June 11, 2026 11:23
6ce1d36 to
5c8288e
Compare
BridgeAR
approved these changes
Jun 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
e56fcb6f35] - (SEMVER-PATCH) Revert "test(cypress): rebalance parallel integration specs (test(cypress): rebalance parallel test suites #8844)" (Juan Antonio Fernández de Alba) #8867eddb1065e0] - (SEMVER-PATCH) fix(exporters): keep the Datadog API key off cleartext for agentless intake (Ruben Bridgewater) #88474e92c35a12] - (SEMVER-PATCH) ci(release): add urgent Slack alert when commit count reaches 100 (Roch Devost) #8865270059c4c8] - (SEMVER-PATCH) test(cypress): rebalance parallel integration specs (Juan Antonio Fernández de Alba) #88442691ba1b5e] - (SEMVER-PATCH) chore(deps): bump @happy-dom/jest-environment (dependabot[bot]) #88530260d1342c] - (SEMVER-MINOR) fixed asserts in testing file (zurdooo) #88627c0fdef510] - (SEMVER-PATCH) bench(sirun): cut runtime of the slowest child_process and debugger variants (Ruben Bridgewater) #88469a3e63fcbc] - (SEMVER-PATCH) ci(benchmarks): bring up the in-repo image and tolerate candidate-only baseline failures (Ruben Bridgewater) #875248b0a7ae8e] - (SEMVER-MINOR) feat(mysql2): preserve caller trace context for pooled queries (Ruben Bridgewater) #8826ad2faea53f] - (SEMVER-PATCH) perf(opentracing): remove per-span throwaway service.name object allo… (Pablo Erhard) #88168ecf0719b8] - (SEMVER-PATCH) chore(deps): bump the gh-actions-packages group across 4 directories with 2 updates (dependabot[bot]) #88566d1e072697] - (SEMVER-MINOR) feat(llmobs): added toolDefinitions support in LLMObs.annotate() (zurdooo) #884539643f1704] - (SEMVER-PATCH) ci(benchmarks): run benchmarks from in-repo bp-runner config (Ruben Bridgewater) #8809ae21e975a4] - (SEMVER-PATCH) fix(openai): mark openai.request span as errored when AI Guard blocks (Alberto Vara) #87405470679584] - (SEMVER-PATCH) bench(debugger): fire the probe deterministically and measure snapshot capture (Ruben Bridgewater) #8785cc2501fdb1] - (SEMVER-PATCH) fix(jest): flush Test Optimization data before bail (Juan Antonio Fernández de Alba) #884004c57787a3] - (SEMVER-PATCH) ci: consolidate JUnit and coverage uploads into All Green (Roch Devost) #88367f25869830] - (SEMVER-PATCH) chore(test): parallelize playwright integration tests with createParallelIt (Roch Devost) #88021c1946eab4] - (SEMVER-PATCH) chore(deps): bump the serverless group across 1 directory with 8 updates (dependabot[bot]) #88317ad1ecf4ff] - (SEMVER-PATCH) chore(deps): bump the ai-and-llm group across 1 directory with 2 updates (dependabot[bot]) #8837a3b8c09d4c] - (SEMVER-PATCH) fix(telemetry): omit OTLP headers and Datadog keys from telemetry (Brian Marks) #88173df1dc2033] - (SEMVER-PATCH) refactor(config): resolve the agent URL once into config.url (Ruben Bridgewater) #88190e2aba9f29] - (SEMVER-PATCH) test(next): enable next.js latest in the plugin suite and CI (Ruben Bridgewater) #8820c72b9dae63] - (SEMVER-PATCH) test: convert agent.load setup hooks to async/await (Ruben Bridgewater) #8821c8d269dce5] - (SEMVER-MINOR) feat(pg): preserve caller trace context for pooled queries (Ruben Bridgewater) #8825f28fa5c0ab] - (SEMVER-PATCH) ci(release): skip release proposal on weekends (Roch Devost) #8835f51485be3b] - (SEMVER-PATCH, SEMVER-MINOR) feat(aiguard): Add span tags to AI Guard spans for anomaly detection (Ilyas Shabi) #8813c67150b39e] - (SEMVER-PATCH) fix(vitest): report vitest retry errors (Juan Antonio Fernández de Alba) #883412c878a5a9] - (SEMVER-PATCH) chore(deps): bump @happy-dom/jest-environment from 20.9.0 to 20.10.1 in /packages/dd-trace/test/plugins/versions in the test-optimization group across 1 directory (dependabot[bot]) #8832811928b882] - (SEMVER-PATCH) fix(test-optimization): buffer early worker test traces (Juan Antonio Fernández de Alba) #8812807c7f16e5] - (SEMVER-PATCH) chore(deps): bump the ai-and-llm group across 1 directory with 6 updates (dependabot[bot]) #88302fc779974c] - (SEMVER-PATCH) chore(deps): bump the test-versions group across 1 directory with 2 updates (dependabot[bot]) #8829b227cf0376] - (SEMVER-PATCH) bench(sirun): add profiler workload and llmobs guard, shorten over-long benches (Ruben Bridgewater) #878703e78e58ac] - (SEMVER-PATCH) perf(format): serialize span links directly instead of via a throwaway array (Ruben Bridgewater) #8796bdfda447b3] - (SEMVER-PATCH) fix(fastify): guard error publishing against re-entrant recursion (Ruben Bridgewater) #8788bf5e02be74] - (SEMVER-PATCH) fix(aiguard): Use abortController instead of promise resolve/reject (Ilyas Shabi) #87432a1c6d56a4] - (SEMVER-PATCH) test(cypress): improve cypress tests (Juan Antonio Fernández de Alba) #88114fe182f776] - (SEMVER-PATCH) chore(deps): bump the serverless group across 1 directory with 10 updates (dependabot[bot]) #8806c3092aa45c] - (SEMVER-PATCH) chore(deps): bump the test-optimization group across 1 directory with 4 updates (dependabot[bot]) #88089b02ace282] - (SEMVER-PATCH) chore: remove preinstall script (Roch Devost) #8803d48e63551e] - (SEMVER-PATCH) chore(deps): bump the ai-and-llm group across 1 directory with 4 updates (dependabot[bot]) #8805800f991e4c] - (SEMVER-PATCH) chore(deps): bump the test-versions group across 1 directory with 2 updates (dependabot[bot]) #88049fd8d377d7] - (SEMVER-PATCH) chore(sampling): remove duplicated sample call (Pablo Erhard) #8800cf6790031e] - (SEMVER-PATCH) Bump libdatadog-nodejs to v0.9.4 (Gyuheon Oh) #88011db5eb1002] - (SEMVER-PATCH) fix(cypress): clear managed retry attempts after Cypress retry setup (Juan Antonio Fernández de Alba) #8797b5e8059daf] - (SEMVER-PATCH) fix(aws-sdk): extract EventBridge trace context on the SQS consumer (Ayan Khan) #86983d2bd9f27e] - (SEMVER-PATCH) bench(dns): drive the callback instrumentor over a no-op lookup (Ruben Bridgewater) #878675443fc7a8] - (SEMVER-PATCH) fix(test-optimization): disable mocha retries for managed retries (Juan Antonio Fernández de Alba) #879210e7c52df4] - (SEMVER-PATCH) fix(vitest): disable manual retries for managed retries (Juan Antonio Fernández de Alba) #87956e07ccce3c] - (SEMVER-PATCH) fix(cucumber): disable manual retries for managed retries (Juan Antonio Fernández de Alba) #87944c2598b235] - (SEMVER-PATCH) fix(cypress): disable manual retries for managed retries (Juan Antonio Fernández de Alba) #87933db69c4b6a] - (SEMVER-PATCH) fix(test-optimization): preserve quarantine on framework retries (Juan Antonio Fernández de Alba) #8790a75867c9bd] - (SEMVER-PATCH) perf(format,encode): reduce per-span format and encode overhead (Ruben Bridgewater) #8754a79ffaed21] - (SEMVER-PATCH) ci: skip implicit-else branches in istanbul line-coverage patch (Ruben Bridgewater) #8720a9c0194667] - (SEMVER-PATCH) chore(deps): bump the serverless group across 1 directory with 8 updates (dependabot[bot]) #87824e5d1c7514] - (SEMVER-PATCH) chore(deps): bump @datadog/openfeature-node-server from 1.2.1 to 2.0.0 (dependabot[bot]) #878095d13e0073] - (SEMVER-PATCH) chore(deps): bump the vendor-minor-and-patch-dependencies group across 1 directory with 2 updates (dependabot[bot]) #87762cc0caee19] - (SEMVER-PATCH) chore(deps-dev): bump @babel/helpers from 7.29.2 to 7.29.7 in the dev-minor-and-patch-dependencies group across 1 directory (dependabot[bot]) #8779d3b7394057] - (SEMVER-PATCH) chore(deps): bump the ai-and-llm group across 1 directory with 6 updates (dependabot[bot]) #877846e96ff2f0] - (SEMVER-PATCH) chore(deps): bump @koa/router from 15.5.0 to 15.6.0 in /integration-tests/esbuild in the test-versions group across 1 directory (dependabot[bot]) #8777cd1c1f01e9] - (SEMVER-PATCH) ci(dependabot): track Docker base image updates (Ruben Bridgewater) #8772ecc40b75ca] - (SEMVER-PATCH) fix(nightly): re-allow nightly node testing (Pablo Erhard) #87533823ad352d] - (SEMVER-PATCH) perf(instrumentation): tune http/http2/net forwarding wrappers for V8 and shimmer (Ruben Bridgewater) #875772167012d9] - (SEMVER-PATCH) docs(agents): tighten AGENTS.md and skills (Ruben Bridgewater) #8684f3d75aac29] - (SEMVER-PATCH) perf(instrumentation): match middleware next-callback identity to skip shimmer rewrites (Ruben Bridgewater) #8758fc0f4df671] - (SEMVER-PATCH) bench(sirun): update Node.js versions and pin the benchmark image (Ruben Bridgewater) #87759c7e13a82f] - (SEMVER-PATCH) perf(core): hold the legacy store directly under AsyncContextFrame (Ruben Bridgewater) #8761c8f9a93742] - (SEMVER-PATCH) bench(integrations): tune dns/graphql/http/net/aws-sdk/propagation; drop bluebird and q (Ruben Bridgewater) #87346d992dc2b2] - (SEMVER-PATCH) docs(types): note that startSpan does not activate the returned span (Ruben Bridgewater) #8771f2b7c57f38] - (SEMVER-PATCH) bench(ws): websocket message instrumentation bench (Ruben Bridgewater) #872557b5ea5795] - (SEMVER-PATCH) bench(core): tune the startup, log, and runtime-metrics benches (Ruben Bridgewater) #8770cf7edad37a] - (SEMVER-MINOR) feat(otel): add support for OTLP Runtime Metrics (Maximo Bautista) #8357f67f0b6bd6] - (SEMVER-PATCH) fix(llmobs): fan array-valued user tags out into one wire entry per element (Ruben Bridgewater) #868992e814b01e] - (SEMVER-PATCH) bench(pg): real-world pg query instrumentation bench (Ruben Bridgewater) #8724b3fcf3302e] - (SEMVER-PATCH) bench(encoders): tune the encoding and exporting-pipeline benches (Ruben Bridgewater) #873109c46f5a4d] - (SEMVER-PATCH) bench(kafkajs): kafkajs and data-streams checkpoint benches (Ruben Bridgewater) #8727ad3a3034b9] - (SEMVER-PATCH) bench(redis): real-world redis command instrumentation bench (Ruben Bridgewater) #8722157ca323e4] - (SEMVER-PATCH) fix(stats): bucket spans by start instead of the missing startTime field (Ruben Bridgewater) #875902f66b9af5] - (SEMVER-PATCH) perf(http): skip the redundant context enter on fresh server requests (Ruben Bridgewater) #87603f16b48dda] - (SEMVER-PATCH) bench(sirun): trim runtime of already-merged loop benches (Ruben Bridgewater) #876657b2c55e11] - (SEMVER-PATCH) bench(core): tune the shimmer-runtime and shimmer-startup benches (Ruben Bridgewater) #8769bc45c72f26] - (SEMVER-PATCH) bench(core): tune the async_hooks and scope benches (Ruben Bridgewater) #8768fe4245d2fd] - (SEMVER-PATCH) perf(format): clear hot-path tags with undefined instead of delete (Ruben Bridgewater) #87569bfd627777] - (SEMVER-PATCH) chore(ci): remove useless call to get-credentials in system-tests workflow (Charles de Beauchesne) #8767ddc183c527] - (SEMVER-PATCH) chore(ci): update dd-sts-action to v1.0.04 (Charles de Beauchesne) #8765812a79be28] - (SEMVER-PATCH) bench(sirun): add the local overview collection script (Ruben Bridgewater) #87334ce00de9d1] - (SEMVER-PATCH) bench(mongodb): mongodb-core command instrumentation bench (Ruben Bridgewater) #872691ddaa58ff] - (SEMVER-PATCH) bench(spans): tune the span lifecycle bench (Ruben Bridgewater) #8732cf3276f5d0] - (SEMVER-PATCH) bench(appsec): iast taint-tracking bench and appsec live-bench tuning (Ruben Bridgewater) #87306ed31f4845] - (SEMVER-PATCH) bench(core): id, url, and tracing-channel dispatch benches (Ruben Bridgewater) #8729f9b0449a63] - (SEMVER-PATCH) bench(idm): fs and child_process instrumentation benches (Ruben Bridgewater) #8728d54b4cc5a8] - (SEMVER-PATCH) bench(pino): log-injection overhead bench (Ruben Bridgewater) #87230813bf0d0a] - (SEMVER-PATCH) ci(release): cap proposal at 100 commits and notify guild at 50 (Roch Devost) #8711e9c271f784] - (SEMVER-PATCH) Fixes APMS-19181: sets the service discovery logs to respect the log level so that the logs can be suppressed when modifying the log level (Sean Dever) #8677740648aae4] - (SEMVER-PATCH) fix(esbuild): drop ...arguments spread from CJS module wrap (Ruben Bridgewater) #86910cc2b46076] - (SEMVER-PATCH) fix: stop using url.parse in http (Ruben Bridgewater) #8750ba82e92e7a] - (SEMVER-PATCH) bench(sirun): auto-shard the suite from variant count and cores (Ruben Bridgewater) #875136a2f15f07] - (SEMVER-PATCH) bench(sirun): add startup-share guard for loop benchmarks (Ruben Bridgewater) #8721