Skip to content

feat(telemetry): add stable session identifier headers#7821

Merged
khanayan123 merged 18 commits intomasterfrom
ayan.khan/stable-session-id-headers
Mar 20, 2026
Merged

feat(telemetry): add stable session identifier headers#7821
khanayan123 merged 18 commits intomasterfrom
ayan.khan/stable-session-id-headers

Conversation

@khanayan123
Copy link
Copy Markdown
Collaborator

@khanayan123 khanayan123 commented Mar 19, 2026

Summary

Implements the Stable Service Instance Identifier Proposal for Node.js instrumentation telemetry. It adds DD-Session-ID and DD-Root-Session-ID headers to telemetry requests so backend can correlate telemetry across parent/child processes without runtime_id fragmentation

  • DD-Session-ID: always present on every telemetry request, set to the current runtime_id
  • DD-Root-Session-ID: present only in child processes (forked/spawned), set to the inherited root runtime_id. Omitted from root process requests — backend treats root_session_id == session_id when absent
  • Child process propagation: child_session.js patches child_process.spawn, spawnSync, and fork to inject DD_ROOT_JS_SESSION_ID and DD_PARENT_JS_SESSION_ID env vars into all spawned processes, so dd-trace in child processes inherits the session lineage at startup

Changes

  • packages/dd-trace/src/config/index.js: reads DD_ROOT_JS_SESSION_ID at module load (falls back to current RUNTIME_ID for root processes); stores as config.rootSessionId
  • packages/dd-trace/src/telemetry/send-data.js: adds DD-Session-ID (always) and DD-Root-Session-ID (child processes only) to all telemetry request headers
  • packages/dd-trace/src/telemetry/child_session.js (new): patches child_process methods to inject session env vars before spawning
  • packages/dd-trace/src/telemetry/telemetry.js: calls child_session.start(config) during telemetry initialization

Related

Implements the Stable Service Instance Identifier RFC for Node.js.

- DD-Session-ID: always set to current runtime_id on all telemetry requests
- DD-Root-Session-ID: set when process is a child (value inherited via
  DD_ROOT_JS_SESSION_ID env var); omitted for root processes
- child_session.js: patches child_process.spawn/spawnSync/fork to inject
  DD_ROOT_JS_SESSION_ID and DD_PARENT_JS_SESSION_ID into child env so
  forked/spawned processes inherit the session lineage

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
@khanayan123 khanayan123 requested a review from a team as a code owner March 19, 2026 16:27
@khanayan123 khanayan123 requested review from ida613 and removed request for a team March 19, 2026 16:27
@khanayan123 khanayan123 marked this pull request as draft March 19, 2026 16:28
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 19, 2026

Overall package size

Self size: 5.04 MB
Deduped: 5.88 MB
No deduping: 5.88 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | import-in-the-middle | 3.0.0 | 81.15 kB | 815.98 kB | | dc-polyfill | 0.1.10 | 26.73 kB | 26.73 kB |

🤖 This report was automatically generated by heaviest-objects-in-the-universe

@datadog-datadog-prod-us1-2

This comment has been minimized.

@pr-commenter
Copy link
Copy Markdown

pr-commenter bot commented Mar 19, 2026

Benchmarks

Benchmark execution time: 2026-03-19 19:53:49

Comparing candidate commit 9a8f4dd in PR branch ayan.khan/stable-session-id-headers with baseline commit 5b2f0b8 in branch master.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 229 metrics, 31 unstable metrics.

- config/index.js: eslint-disable for process.env (internal propagation
  env var, not in supported-configurations.json)
- child_session.js: fix unicorn/no-negated-condition, use spread instead
  of Array.from, eslint-disable for process.env
- send-data.spec.js: add dd-session-id to existing header assertions,
  add tests for dd-root-session-id presence/absence
- child_session.spec.js: new test file covering env injection for
  spawn, spawnSync, and fork with all argument permutations

Co-Authored-By: Claude Opus 4.6 <[email protected]>
@codecov
Copy link
Copy Markdown

codecov bot commented Mar 19, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 80.47%. Comparing base (5b2f0b8) to head (9a8f4dd).
⚠️ Report is 1 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #7821      +/-   ##
==========================================
+ Coverage   80.46%   80.47%   +0.01%     
==========================================
  Files         748      749       +1     
  Lines       32407    32457      +50     
==========================================
+ Hits        26075    26121      +46     
- Misses       6332     6336       +4     
Flag Coverage Δ
aiguard-macos 39.15% <18.18%> (-0.19%) ⬇️
aiguard-ubuntu 39.27% <18.18%> (-0.19%) ⬇️
aiguard-windows 38.97% <18.18%> (-0.19%) ⬇️
apm-capabilities-tracing-macos 48.97% <100.00%> (+0.08%) ⬆️
apm-capabilities-tracing-ubuntu 49.05% <100.00%> (+0.08%) ⬆️
apm-capabilities-tracing-windows 48.78% <100.00%> (+0.08%) ⬆️
apm-integrations-child-process 38.49% <36.20%> (-0.15%) ⬇️
apm-integrations-couchbase-18 37.33% <15.51%> (-0.20%) ⬇️
apm-integrations-couchbase-eol 37.82% <18.18%> (-0.18%) ⬇️
apm-integrations-oracledb 37.66% <18.18%> (-0.17%) ⬇️
appsec-express 55.16% <37.93%> (-0.17%) ⬇️
appsec-fastify 51.52% <29.31%> (-0.17%) ⬇️
appsec-graphql 51.68% <22.41%> (-0.18%) ⬇️
appsec-kafka 44.29% <22.41%> (-0.18%) ⬇️
appsec-ldapjs 43.92% <18.18%> (-0.17%) ⬇️
appsec-lodash 43.55% <22.41%> (-0.17%) ⬇️
appsec-macos 58.19% <46.55%> (-0.10%) ⬇️
appsec-mongodb-core 48.69% <18.18%> (-0.07%) ⬇️
appsec-mongoose 49.35% <18.18%> (-0.18%) ⬇️
appsec-mysql 50.78% <22.41%> (-0.18%) ⬇️
appsec-node-serialize 43.10% <18.18%> (-0.17%) ⬇️
appsec-passport 47.54% <18.18%> (-0.19%) ⬇️
appsec-postgres 50.51% <22.41%> (-0.18%) ⬇️
appsec-sourcing 42.53% <18.18%> (-0.17%) ⬇️
appsec-template 43.27% <18.18%> (-0.17%) ⬇️
appsec-ubuntu 58.26% <46.55%> (-0.10%) ⬇️
appsec-windows 58.01% <46.55%> (-0.10%) ⬇️
instrumentations-instrumentation-bluebird 32.27% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-body-parser 40.44% <18.18%> (-0.18%) ⬇️
instrumentations-instrumentation-child_process 37.84% <37.93%> (-0.09%) ⬇️
instrumentations-instrumentation-cookie-parser 34.24% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-express 34.55% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-express-mongo-sanitize 34.37% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-express-session 40.07% <18.18%> (-0.18%) ⬇️
instrumentations-instrumentation-fs 31.89% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-generic-pool 29.46% <5.88%> (-0.07%) ⬇️
instrumentations-instrumentation-http 39.71% <18.18%> (-0.19%) ⬇️
instrumentations-instrumentation-knex 32.28% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-mongoose 33.40% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-multer 40.19% <18.18%> (-0.18%) ⬇️
instrumentations-instrumentation-mysql2 38.21% <18.18%> (-0.18%) ⬇️
instrumentations-instrumentation-passport 43.96% <18.18%> (-0.18%) ⬇️
instrumentations-instrumentation-passport-http 43.64% <18.18%> (-0.18%) ⬇️
instrumentations-instrumentation-passport-local 44.17% <18.18%> (-0.18%) ⬇️
instrumentations-instrumentation-pg 37.65% <18.18%> (-0.18%) ⬇️
instrumentations-instrumentation-promise 32.20% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-promise-js 32.21% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-q 32.25% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-url 32.18% <18.18%> (-0.16%) ⬇️
instrumentations-instrumentation-when 32.22% <18.18%> (-0.16%) ⬇️
llmobs-ai 42.17% <18.18%> (-0.19%) ⬇️
llmobs-anthropic 40.21% <18.18%> (-0.18%) ⬇️
llmobs-bedrock 39.15% <15.51%> (-0.18%) ⬇️
llmobs-google-genai 39.69% <15.51%> (-0.19%) ⬇️
llmobs-langchain 40.06% <15.51%> (-0.06%) ⬇️
llmobs-openai 43.88% <18.18%> (-0.18%) ⬇️
llmobs-vertex-ai 39.94% <15.51%> (-0.20%) ⬇️
platform-core 31.47% <ø> (ø)
platform-esbuild 34.42% <ø> (ø)
platform-instrumentations-misc 48.41% <ø> (ø)
platform-shimmer 37.56% <ø> (ø)
platform-unit-guardrails 32.89% <ø> (ø)
plugins-azure-durable-functions 25.74% <ø> (ø)
plugins-azure-event-hubs 25.90% <ø> (ø)
plugins-azure-service-bus 25.26% <ø> (ø)
plugins-bullmq 44.18% <15.51%> (-0.32%) ⬇️
plugins-cassandra 37.69% <18.18%> (-0.31%) ⬇️
plugins-cookie 26.96% <ø> (ø)
plugins-cookie-parser 26.75% <ø> (ø)
plugins-crypto 26.73% <ø> (ø)
plugins-dd-trace-api 38.22% <18.18%> (-0.19%) ⬇️
plugins-express-mongo-sanitize 26.89% <ø> (ø)
plugins-express-session 26.70% <ø> (ø)
plugins-fastify 42.15% <18.18%> (-0.19%) ⬇️
plugins-fetch 38.28% <18.18%> (-0.17%) ⬇️
plugins-fs 38.56% <18.18%> (-0.19%) ⬇️
plugins-generic-pool 25.94% <ø> (ø)
plugins-google-cloud-pubsub 45.34% <15.51%> (-0.21%) ⬇️
plugins-grpc 40.82% <18.18%> (-0.18%) ⬇️
plugins-handlebars 26.94% <ø> (ø)
plugins-hapi 40.07% <18.18%> (-0.19%) ⬇️
plugins-hono 40.33% <18.18%> (-0.32%) ⬇️
plugins-ioredis 38.37% <18.18%> (-0.19%) ⬇️
plugins-knex 26.57% <ø> (ø)
plugins-langgraph 38.38% <18.18%> (-0.18%) ⬇️
plugins-ldapjs 24.43% <ø> (ø)
plugins-light-my-request 26.30% <ø> (ø)
plugins-limitd-client 32.40% <18.18%> (-0.31%) ⬇️
plugins-lodash 26.03% <ø> (ø)
plugins-mariadb 39.41% <18.18%> (-0.19%) ⬇️
plugins-memcached 38.07% <18.18%> (-0.19%) ⬇️
plugins-microgateway-core 39.21% <18.18%> (-0.11%) ⬇️
plugins-moleculer 40.43% <15.51%> (-0.20%) ⬇️
plugins-mongodb 39.08% <18.18%> (-0.18%) ⬇️
plugins-mongodb-core 38.92% <18.18%> (-0.19%) ⬇️
plugins-mongoose 38.80% <18.18%> (-0.18%) ⬇️
plugins-multer 26.70% <ø> (ø)
plugins-mysql 39.11% <18.18%> (-0.19%) ⬇️
plugins-mysql2 39.20% <18.18%> (-0.19%) ⬇️
plugins-node-serialize 27.00% <ø> (ø)
plugins-opensearch 37.52% <18.18%> (-0.17%) ⬇️
plugins-passport-http 26.76% <ø> (ø)
plugins-postgres 35.50% <15.51%> (-0.16%) ⬇️
plugins-process 26.73% <ø> (ø)
plugins-pug 26.96% <ø> (ø)
plugins-redis 38.82% <18.18%> (-0.20%) ⬇️
plugins-router 42.87% <18.18%> (-0.19%) ⬇️
plugins-sequelize 25.55% <ø> (ø)
plugins-test-and-upstream-amqp10 38.42% <18.18%> (-0.19%) ⬇️
plugins-test-and-upstream-amqplib 43.79% <18.18%> (-0.21%) ⬇️
plugins-test-and-upstream-apollo 39.06% <18.18%> (-0.17%) ⬇️
plugins-test-and-upstream-avsc 38.52% <18.18%> (-0.19%) ⬇️
plugins-test-and-upstream-bunyan 33.80% <18.18%> (-0.17%) ⬇️
plugins-test-and-upstream-connect 40.73% <18.18%> (-0.19%) ⬇️
plugins-test-and-upstream-graphql 40.01% <18.18%> (-0.19%) ⬇️
plugins-test-and-upstream-koa 40.32% <18.18%> (-0.19%) ⬇️
plugins-test-and-upstream-protobufjs 38.74% <18.18%> (-0.19%) ⬇️
plugins-test-and-upstream-rhea 43.96% <18.18%> (-0.21%) ⬇️
plugins-undici 39.05% <18.18%> (-0.17%) ⬇️
plugins-url 26.73% <ø> (ø)
plugins-valkey 38.04% <18.18%> (-0.19%) ⬇️
plugins-vm 26.73% <ø> (ø)
plugins-winston 33.99% <18.18%> (-0.16%) ⬇️
plugins-ws 41.81% <18.18%> (-0.19%) ⬇️
profiling-macos 40.46% <18.18%> (-0.19%) ⬇️
profiling-ubuntu 40.58% <18.18%> (-0.19%) ⬇️
profiling-windows 42.13% <18.18%> (-0.19%) ⬇️
serverless-azure-functions-client 25.62% <ø> (ø)
serverless-azure-functions-eventhubs 25.62% <ø> (ø)
serverless-azure-functions-servicebus 25.62% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

khanayan123 and others added 11 commits March 19, 2026 12:58
Instead of double-shimmer-wrapping child_process methods, use the
existing diagnostic channel infrastructure. child_session.js now
subscribes to datadog:child_process:execution start events and injects
session env vars via context.callArgs. Also adds fork to the
instrumented async methods.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
…try.enabled

- Rename child_session.js → session-propagation.js for clarity
- Guard start() with config.telemetry?.enabled check
- Add test for telemetry-disabled case

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Match the import pattern used by dependencies, endpoints, and
telemetryLogger instead of using an inline require.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
…tation

- Add dedicated fork test section with success, arguments, and error cases
- Add callArgs context tests verifying it's present for async and sync methods
- Add end-to-end callArgs mutation tests proving subscribers can inject env
  vars into spawn, spawnSync, and fork

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Fix Windows test failure: process.env keys have different casing on
  Windows (Path vs PATH), use key count check instead
- Remove unused hadSubscribers variable and redundant comments
- Simplify config.telemetry && config.telemetry.debug to optional chain
- Remove duplicate sinon.assert.calledOnce(start) in child_process test

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Remove obvious comments in child_process.js instrumentation
- Simplify createBatchPayload arrow function to implicit return
- Fix stray `/` after sendData call in send-data.spec.js

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Remove fork-like callArgs tests from session-propagation (same branches
  as spawn tests since they share one subscriber)
- Remove fork callArgs mutation test (same async wrapper as spawn)
- Extract shared injectTestEnv helper in child_process tests

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Break long lines under 120 char max-len limit
- Remove blank line before closing brace (padded-blocks)
- Remove unnecessary eslint-disable directive in test file

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Reverts unrelated comment removals and code style changes in
send-data.js, telemetry.js, and child_process.js that were
introduced by the code simplifier.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Extract argument shape detection into getArgShape() helper and
use a switch statement for clearer control flow.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Export internal functions and call them directly in tests so codecov
can track coverage through the source file. Add explicit reason to
eslint-disable comments for process.env access.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
@khanayan123 khanayan123 marked this pull request as ready for review March 19, 2026 19:14
@khanayan123 khanayan123 requested a review from a team as a code owner March 19, 2026 19:14
@khanayan123 khanayan123 requested a review from mabdinur March 19, 2026 19:15
@khanayan123
Copy link
Copy Markdown
Collaborator Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5634511ede

ℹ️ 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".

execFile supports callback-style calls like execFile(file, args, cb)
and execFile(file, cb). The previous implementation would overwrite
the callback slot with the options object. Now uses splice to insert
options before any trailing callback, preserving the original call
semantics.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
@khanayan123
Copy link
Copy Markdown
Collaborator Author

@codex review

khanayan123 and others added 2 commits March 19, 2026 15:31
Replace getArgShape switch with a single findOptionsIndex() that
locates or determines where the options object belongs. The handler
then has two paths: update existing options, or insert new ones
(preserving callbacks via splice).

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 09bad69bd0

ℹ️ 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".

khanayan123 and others added 2 commits March 19, 2026 15:43
Unsubscribes from the child_process channel and clears state so
the module can be cleanly restarted with new config. Wired into
telemetry.stop() alongside endpoints.stop().

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Check args[2] for an existing options object when args[1] is
skipped (undefined/null), preserving cwd, stdio, and other
flags the caller set.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
@khanayan123
Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@khanayan123
Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@khanayan123 khanayan123 requested a review from wconti27 March 19, 2026 20:08
Comment on lines +123 to +135
it('should not include dd-root-session-id header when rootSessionId equals runtime-id', () => {
sendDataModule.sendData({
url: '/test',
tags: { 'runtime-id': 'same-id' },
rootSessionId: 'same-id',
}, application, 'test', 'req-type')

sinon.assert.calledOnce(request)
const options = request.getCall(0).args[1]

assert.strictEqual(options.headers['dd-session-id'], 'same-id')
assert.strictEqual(options.headers['dd-root-session-id'], undefined)
})
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we want a fork test here as well?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't say so, this is testing the header logic in send-data.js, the fork propagation is covered in session-propagation.spec.js and child_process.spec.js

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and also the linked system tests

Copy link
Copy Markdown
Contributor

@wconti27 wconti27 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, just the question about if you want / can test session id being present for forks. Not blocking

@gh-worker-ownership-write-b05516 gh-worker-ownership-write-b05516 bot removed the request for review from mabdinur March 19, 2026 20:10
@khanayan123 khanayan123 merged commit 8eac0cd into master Mar 20, 2026
787 checks passed
@khanayan123 khanayan123 deleted the ayan.khan/stable-session-id-headers branch March 20, 2026 14:19
gh-worker-dd-mergequeue-cf854d bot pushed a commit to DataDog/dd-trace-go that referenced this pull request Mar 20, 2026
## Summary

Implements the [Stable Service Instance Identifier RFC](https://docs.google.com/document/d/1ECKj9_NnwaKYtFqm3p3Rlpicx5d-OQcdj9kI2jvRqVU) for Go instrumentation telemetry.

- **`DD-Session-ID`**: always present on every telemetry request, set to the current `runtime_id`
- **`DD-Root-Session-ID`**: present only in child processes, inherited via `_DD_ROOT_GO_SESSION_ID` env var. Omitted when equal to session ID — backend infers root = self when absent
- **Auto-propagation**: `globalconfig.init()` sets `_DD_ROOT_GO_SESSION_ID` in `os.Environ()` so child processes spawned via `os/exec` inherit it automatically without any user-side calls

## Changes

- `internal/globalconfig/globalconfig.go`: adds `rootSessionID` field, `init()` reads/sets `_DD_ROOT_GO_SESSION_ID` (internal env var, not in supported_configurations), `RootSessionID()` getter
- `internal/telemetry/internal/writer.go`: adds `DD-Session-ID` (always) and `DD-Root-Session-ID` (child processes only) to pre-baked telemetry headers
- Tests for both globalconfig (including cross-process propagation) and writer

## Related

- System-tests PR: DataDog/system-tests#6510
- Node.js PR: DataDog/dd-trace-js#7821
- dd-trace-py fork tracking: DataDog/dd-trace-py#16839
- dd-trace-py spawn tracking: DataDog/dd-trace-py#16842

Co-authored-by: ayan.khan <[email protected]>
dd-octo-sts bot pushed a commit that referenced this pull request Mar 21, 2026
* feat(telemetry): add stable session identifier headers

adds DD-Session-ID and DD-Root-Session-ID headers to telemetry requests so backend can correlate telemetry across parent/child processes without runtime_id fragmentation
@dd-octo-sts dd-octo-sts bot mentioned this pull request Mar 21, 2026
bengl pushed a commit that referenced this pull request Mar 23, 2026
* feat(telemetry): add stable session identifier headers

adds DD-Session-ID and DD-Root-Session-ID headers to telemetry requests so backend can correlate telemetry across parent/child processes without runtime_id fragmentation
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants