chore: merge main#18
Merged
Merged
Conversation
…n logger (DataDog#1042) ## Summary Root cause: commit 3b533a0 introduced `serde_json::json!()` for JSON formatting, adding per-call heap pressure and a new crate dependency that contributes to Lambda init duration regression JIRA: https://datadoghq.atlassian.net/browse/SVLS-8619 - Replaces `serde_json::json!()` in `logger.rs` with direct `write!`/`writeln!` calls to the tracing `Writer`, eliminating two heap allocations (a `Map` + `Value`) per log call - Adds a `write_json_escaped` helper that handles all 6 mandatory JSON escape sequences inline (`"`, `\`, `\n`, `\r`, `\t`, U+0000–U+001F) - Removes the `"json"` feature from `tracing-subscriber`, dropping `tracing-serde` as a transitive dependency and reducing binary size - The JSON output format is **identical** — no observable behavior change ## Test plan - unit tests - self-monitoring tests
DataDog#1043) https://datadoghq.atlassian.net/browse/SVLS-8619 ## Summary - Bumps `opentelemetry-proto` from `0.29` to `0.30.0` - Bumps `tonic-types` from `0.12` to `0.13` - Removes stale `LICENSE-3rdparty.csv` entries for `glob`, `indexmap` (bluss repo), and the now-absent duplicate `indexmap` entry ## Why `opentelemetry-proto 0.29` required `tonic ^0.12`, which forced a second copy of the full tonic gRPC stack into the Lambda binary alongside the `tonic 0.13` already pulled in by `dogstatsd`/`datadog-protos` (saluki, introduced in `674cd358`). This duplicate adds binary size and contributes to Lambda init duration regression (SVLS-8619). `opentelemetry-proto 0.30.0` requires `tonic ^0.13` and `prost ^0.13`, aligning with what saluki already brings in. No external dependency changes (saluki, libdatadog) are required for this fix. ## Result - `tonic 0.12` removed from binary — single `tonic 0.13` copy remaining - `Cargo.lock` shrinks by ~58 lines (removed crates: `glob`, one `indexmap` duplicate, `tonic 0.12` stack) - No API breakage — `opentelemetry 0.29 → 0.30` is a single minor bump with no changes to the APIs used in `bottlecap/src/otlp/` ## Test plan - unit tests passed - Self-monitoring tests
## Overview Regression on performance because `[email protected]` checks for multiple folders as opposed to only one ## Testing Manual testing in AWS Lambda and Self Monitoring Data
…ds (DataDog#1044) https://datadoghq.atlassian.net/browse/SVLS-8609 Issue reported: DataDog#1041 ## Summary - axum 0.7+ applies a 2 MB default body limit globally; the `/lambda/start-invocation` endpoint was rejecting payloads larger than 2 MB with `length limit exceeded` - Raises the limit to 6 MB (`DefaultBodyLimit::max(6 * 1024 * 1024)`) to match [Lambda's maximum synchronous invocation payload size](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) - Adds three unit tests covering: accept above the old 2 MB default, accept at boundary (6 MB − 1 byte), reject above 6 MB (413) ## Test plan - Unit tests - Run `bash local_tests/repro-large-payload.sh` which sets up the local test env and sends a 3 MB payload to `/lambda/start-invocation` and verifies HTTP 200 with no `length limit exceeded` error | Scenario|Log| |--------|--------| | Without the fix|```{"level":"ERROR","message":"DD_EXTENSION \| ERROR \| Failed to extract request body: Failed to buffer the request body: length limit exceeded"}``` | | With the fix| ```{"level":"DEBUG","message":"DD_EXTENSION \| DEBUG \| Received start invocation request from headers:{\"datadog-meta-lang\": \"java\", \"user-agent\": \"curl/8.3.0\", \"host\": \"localhost:8124\", \"lambda-runtime-aws-request-id\": \"test-large-payload-request\", \"expect\": \"100-continue\", \"accept\": \"*/*\", \"content-length\": \"3200074\", \"content-type\": \"application/json\"}"}``` |
…ARN (DataDog#1046) JIRA: https://datadoghq.atlassian.net/browse/SLES-2729 Issue: DataDog#1000 **Overview** When AWS Lambda freezes or terminates a function instance, the OS immediately closes all TCP sockets. The extension's proxy HTTP handler (handle_proxy) was mid-read on the request body — this read fails with error reading a body from connection and was logged at ERROR level, generating noise with no actionable signal. This is expected Lambda lifecycle behaviour: the Lambda function completed successfully and nothing in the extension is broken. The ERROR level implies an extension fault, which misleads operators. **Change** Introduce a warn_response helper (mirroring the existing error_response / success_response trio) and use it for body-read failures in handle_proxy. The log message content is unchanged — only the severity is downgraded from ERROR to WARN. Testing - unit tests
…ataDog#1048) ## Overview When the Lambda function's runtime version contains "RuntimeVersion", add the tag `durable_function:true` to enhanced metrics generated by the extension, so the facet `durable_function` appears on Serverless View. Sample value of runtime version: - Python: `python:3.14.DurableFunction.v9` - Node.js: `nodejs:24.DurableFunction.v10` ## Testing ### Steps 1. Build a layer and install it on a durable function 2. Invoke it 3. Check Serverless view ### Result 1. When I search by `durable_function:true`, the function appears in the result. <img width="446" height="210" alt="image" src="https://github.com/user-attachments/assets/2fa14641-fd37-4b27-90bb-85cfce2570e3" /> 2. A facet `durable_function` appears on the sidebar. <img width="437" height="151" alt="image" src="https://github.com/user-attachments/assets/2dcc4113-5caa-4376-a92e-ed54b29dd453" /> 3. When I search by `-durable_function:true`, other functions appear in the result. <img width="500" height="240" alt="image" src="https://github.com/user-attachments/assets/5b1308ff-5a7d-4c9f-9593-93dfb26d625d" /> --------- Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…1055) ## Overview Fixes an issue where AWS filters out by logs with "level" in a structured JSON. So any DD_LOG_LEVEL logs won't show up in CWL, but they will be sent to Datadog correctly. This changes it to "status" so they can be displayed in CWL and they can also arrive to Datadog. ## Testing Tested manually in AWS Lambda.
…to 1.15.3 (DataDog#1051) Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.15.2 to 1.15.3. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions-rust-lang/setup-rust-toolchain/releases">actions-rust-lang/setup-rust-toolchain's releases</a>.</em></p> <blockquote> <h2>v1.15.3</h2> <h2>What's Changed</h2> <ul> <li>Bump Swatinem/rust-cache from 2.8.1 to 2.8.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions-rust-lang/setup-rust-toolchain/pull/83">actions-rust-lang/setup-rust-toolchain#83</a></li> <li>Add .gitignore to exclude <code>test-workspace/target/</code> by <a href="https://github.com/xtqqczze"><code>@xtqqczze</code></a> in <a href="https://redirect.github.com/actions-rust-lang/setup-rust-toolchain/pull/85">actions-rust-lang/setup-rust-toolchain#85</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/xtqqczze"><code>@xtqqczze</code></a> made their first contribution in <a href="https://redirect.github.com/actions-rust-lang/setup-rust-toolchain/pull/85">actions-rust-lang/setup-rust-toolchain#85</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions-rust-lang/setup-rust-toolchain/compare/v1.15.2...v1.15.3">https://github.com/actions-rust-lang/setup-rust-toolchain/compare/v1.15.2...v1.15.3</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md">actions-rust-lang/setup-rust-toolchain's changelog</a>.</em></p> <blockquote> <h2>[1.15.3] - 2026-03-01</h2> <ul> <li>Bump Swatinem/rust-cache from 2.8.1 to 2.8.2</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions-rust-lang/setup-rust-toolchain/commit/a0b538fa0b742a6aa35d6e2c169b4bd06d225a98"><code>a0b538f</code></a> Update changelog</li> <li><a href="https://github.com/actions-rust-lang/setup-rust-toolchain/commit/e0e53f12ac5bec14f26e3523eaccc43995e0dd49"><code>e0e53f1</code></a> Merge pull request <a href="https://redirect.github.com/actions-rust-lang/setup-rust-toolchain/issues/85">#85</a> from xtqqczze/gitignore</li> <li><a href="https://github.com/actions-rust-lang/setup-rust-toolchain/commit/a0004163461e62eec251aed6b418efc614375db3"><code>a000416</code></a> Add .gitignore to exclude <code>test-workspace/target/</code></li> <li><a href="https://github.com/actions-rust-lang/setup-rust-toolchain/commit/806aa7ddf5d59f36fb30048411f6bde29364a53f"><code>806aa7d</code></a> Add dependabot cooldown</li> <li><a href="https://github.com/actions-rust-lang/setup-rust-toolchain/commit/b598bed351cb8d159adfaa2ea4989c797082620f"><code>b598bed</code></a> Merge pull request <a href="https://redirect.github.com/actions-rust-lang/setup-rust-toolchain/issues/83">#83</a> from actions-rust-lang/dependabot/github_actions/Swati...</li> <li><a href="https://github.com/actions-rust-lang/setup-rust-toolchain/commit/e541adf9901fbab8b9379aee33a999f5cd02a33d"><code>e541adf</code></a> Bump Swatinem/rust-cache from 2.8.1 to 2.8.2</li> <li><a href="https://github.com/actions-rust-lang/setup-rust-toolchain/commit/ca4a6432af353637602348dec3df861ef02ed8a6"><code>ca4a643</code></a> Merge pull request <a href="https://redirect.github.com/actions-rust-lang/setup-rust-toolchain/issues/82">#82</a> from actions-rust-lang/dependabot/github_actions/actio...</li> <li><a href="https://github.com/actions-rust-lang/setup-rust-toolchain/commit/c103666ab0e01f766d777b5464cd974d8ca1f711"><code>c103666</code></a> Bump actions/checkout from 5 to 6</li> <li>See full diff in <a href="https://github.com/actions-rust-lang/setup-rust-toolchain/compare/v1.15.2...v1.15.3">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: jordan gonzález <[email protected]>
…taDog#1054) Bumps [aquasecurity/trivy-action](https://github.com/aquasecurity/trivy-action) from 0.34.1 to 0.34.2. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/aquasecurity/trivy-action/releases">aquasecurity/trivy-action's releases</a>.</em></p> <blockquote> <h2>v0.34.2</h2> <h2>What's Changed</h2> <ul> <li>feat: add YAML support for trivyignores by <a href="https://github.com/nikpivkin"><code>@nikpivkin</code></a> in <a href="https://redirect.github.com/aquasecurity/trivy-action/pull/508">aquasecurity/trivy-action#508</a></li> <li>chore: bump default Trivy version to v0.69.2 by <a href="https://github.com/nick-the-nuke"><code>@nick-the-nuke</code></a> in <a href="https://redirect.github.com/aquasecurity/trivy-action/pull/513">aquasecurity/trivy-action#513</a></li> <li>chore: bump Trivy version to v0.69.2 in test workflow and README by <a href="https://github.com/DmitriyLewen"><code>@DmitriyLewen</code></a> in <a href="https://redirect.github.com/aquasecurity/trivy-action/pull/515">aquasecurity/trivy-action#515</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/nick-the-nuke"><code>@nick-the-nuke</code></a> made their first contribution in <a href="https://redirect.github.com/aquasecurity/trivy-action/pull/513">aquasecurity/trivy-action#513</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/aquasecurity/trivy-action/compare/0.34.1...0.34.2">https://github.com/aquasecurity/trivy-action/compare/0.34.1...0.34.2</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/aquasecurity/trivy-action/commit/97e0b3872f55f89b95b2f65b3dbab56962816478"><code>97e0b38</code></a> chore: bump Trivy version to v0.69.2 in test workflow and README (<a href="https://redirect.github.com/aquasecurity/trivy-action/issues/515">#515</a>)</li> <li><a href="https://github.com/aquasecurity/trivy-action/commit/4c61e6329bab9be735ca35291551614bc663dff3"><code>4c61e63</code></a> chore: bump default Trivy version to v0.69.2 (<a href="https://redirect.github.com/aquasecurity/trivy-action/issues/513">#513</a>)</li> <li><a href="https://github.com/aquasecurity/trivy-action/commit/1bd062560b422f5944df1de50abd05162bea079e"><code>1bd0625</code></a> Merge pull request <a href="https://redirect.github.com/aquasecurity/trivy-action/issues/508">#508</a> from nikpivkin/feat/pass-yaml-ignore-file</li> <li><a href="https://github.com/aquasecurity/trivy-action/commit/bce3086c4aa186dadd6671d45ad6dd5d1b8440ac"><code>bce3086</code></a> remove unused init-cache target</li> <li><a href="https://github.com/aquasecurity/trivy-action/commit/5a9fbb1236dc1b5ee9e73b5a515009a1dc684548"><code>5a9fbb1</code></a> supress progress bar when download db</li> <li><a href="https://github.com/aquasecurity/trivy-action/commit/16154502cae788884830e8df2671639b8cbaa03f"><code>1615450</code></a> update trivyignores input description</li> <li><a href="https://github.com/aquasecurity/trivy-action/commit/df85774a457f1f0a32a8e5744c2bced057257d65"><code>df85774</code></a> add comment about fd3</li> <li><a href="https://github.com/aquasecurity/trivy-action/commit/56c8daebb96c35cabeeda8187a6dd3ec711d0a72"><code>56c8dae</code></a> remove unused variable</li> <li><a href="https://github.com/aquasecurity/trivy-action/commit/6476b939eabc74a8cbd2f6dceb44968c3187134c"><code>6476b93</code></a> feat: support for YAML ignore file</li> <li>See full diff in <a href="https://github.com/aquasecurity/trivy-action/compare/e368e328979b113139d6f9068e03accaed98a518...97e0b3872f55f89b95b2f65b3dbab56962816478">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: jordan gonzález <[email protected]>
…og#1059) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.7.0 to 4.0.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/docker/setup-qemu-action/releases">docker/setup-qemu-action's releases</a>.</em></p> <blockquote> <h2>v4.0.0</h2> <ul> <li>Node 24 as default runtime (requires <a href="https://github.com/actions/runner/releases/tag/v2.327.1">Actions Runner v2.327.1</a> or later) by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/setup-qemu-action/pull/245">docker/setup-qemu-action#245</a></li> <li>Switch to ESM and update config/test wiring by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/setup-qemu-action/pull/241">docker/setup-qemu-action#241</a></li> <li>Bump <code>@actions/core</code> from 1.11.1 to 3.0.0 in <a href="https://redirect.github.com/docker/setup-qemu-action/pull/244">docker/setup-qemu-action#244</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.67.0 to 0.77.0 in <a href="https://redirect.github.com/docker/setup-qemu-action/pull/243">docker/setup-qemu-action#243</a></li> <li>Bump <code>@isaacs/brace-expansion</code> from 5.0.0 to 5.0.1 in <a href="https://redirect.github.com/docker/setup-qemu-action/pull/240">docker/setup-qemu-action#240</a></li> <li>Bump js-yaml from 3.14.1 to 3.14.2 in <a href="https://redirect.github.com/docker/setup-qemu-action/pull/231">docker/setup-qemu-action#231</a></li> <li>Bump lodash from 4.17.21 to 4.17.23 in <a href="https://redirect.github.com/docker/setup-qemu-action/pull/238">docker/setup-qemu-action#238</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/setup-qemu-action/compare/v3.7.0...v4.0.0">https://github.com/docker/setup-qemu-action/compare/v3.7.0...v4.0.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/docker/setup-qemu-action/commit/ce360397dd3f832beb865e1373c09c0e9f86d70a"><code>ce36039</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-qemu-action/issues/245">#245</a> from crazy-max/node24</li> <li><a href="https://github.com/docker/setup-qemu-action/commit/63863443c130689b5b352363f362c820cf73b26d"><code>6386344</code></a> node 24 as default runtime</li> <li><a href="https://github.com/docker/setup-qemu-action/commit/1ea3db7bfb6d247e5e3511955d6e476a8d400ef3"><code>1ea3db7</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-qemu-action/issues/243">#243</a> from docker/dependabot/npm_and_yarn/docker/actions-to...</li> <li><a href="https://github.com/docker/setup-qemu-action/commit/b56a0022b9d517f4d4f8f8357e107e587548db78"><code>b56a002</code></a> chore: update generated content</li> <li><a href="https://github.com/docker/setup-qemu-action/commit/c43f02d0c908d30161ad4230a59285d9e442956d"><code>c43f02d</code></a> build(deps): bump <code>@docker/actions-toolkit</code> from 0.67.0 to 0.77.0</li> <li><a href="https://github.com/docker/setup-qemu-action/commit/ce10c58dd1801e20f2e65c72aff588c6fc5f6609"><code>ce10c58</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-qemu-action/issues/244">#244</a> from docker/dependabot/npm_and_yarn/actions/core-3.0.0</li> <li><a href="https://github.com/docker/setup-qemu-action/commit/429fc9dbdab394ec482946ef7f7b60be3a169336"><code>429fc9d</code></a> chore: update generated content</li> <li><a href="https://github.com/docker/setup-qemu-action/commit/060e5f8b59ae7d2a0e4dcf681f8625f0e54e2024"><code>060e5f8</code></a> build(deps): bump <code>@actions/core</code> from 1.11.1 to 3.0.0</li> <li><a href="https://github.com/docker/setup-qemu-action/commit/44be13e7d9ba38145b648950e52ac18e2a4efd3a"><code>44be13e</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-qemu-action/issues/231">#231</a> from docker/dependabot/npm_and_yarn/js-yaml-3.14.2</li> <li><a href="https://github.com/docker/setup-qemu-action/commit/1897438ed3baad455b19c89cda913ca4f31dd079"><code>1897438</code></a> chore: update generated content</li> <li>Additional commits viewable in <a href="https://github.com/docker/setup-qemu-action/compare/c7c53464625b32c7a7e944ae62b3e17d2b600130...ce360397dd3f832beb865e1373c09c0e9f86d70a">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/docker/login-action/releases">docker/login-action's releases</a>.</em></p> <blockquote> <h2>v4.0.0</h2> <ul> <li>Node 24 as default runtime (requires <a href="https://github.com/actions/runner/releases/tag/v2.327.1">Actions Runner v2.327.1</a> or later) by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/929">docker/login-action#929</a></li> <li>Switch to ESM and update config/test wiring by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/927">docker/login-action#927</a></li> <li>Bump <code>@actions/core</code> from 1.11.1 to 3.0.0 in <a href="https://redirect.github.com/docker/login-action/pull/919">docker/login-action#919</a></li> <li>Bump <code>@aws-sdk/client-ecr</code> from 3.890.0 to 3.1000.0 in <a href="https://redirect.github.com/docker/login-action/pull/909">docker/login-action#909</a> <a href="https://redirect.github.com/docker/login-action/pull/920">docker/login-action#920</a></li> <li>Bump <code>@aws-sdk/client-ecr-public</code> from 3.890.0 to 3.1000.0 in <a href="https://redirect.github.com/docker/login-action/pull/909">docker/login-action#909</a> <a href="https://redirect.github.com/docker/login-action/pull/920">docker/login-action#920</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.63.0 to 0.77.0 in <a href="https://redirect.github.com/docker/login-action/pull/910">docker/login-action#910</a> <a href="https://redirect.github.com/docker/login-action/pull/928">docker/login-action#928</a></li> <li>Bump <code>@isaacs/brace-expansion</code> from 5.0.0 to 5.0.1 in <a href="https://redirect.github.com/docker/login-action/pull/921">docker/login-action#921</a></li> <li>Bump js-yaml from 4.1.0 to 4.1.1 in <a href="https://redirect.github.com/docker/login-action/pull/901">docker/login-action#901</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v3.7.0...v4.0.0">https://github.com/docker/login-action/compare/v3.7.0...v4.0.0</a></p> <h2>v3.7.0</h2> <ul> <li>Add <code>scope</code> input to set scopes for the authentication token by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/912">docker/login-action#912</a></li> <li>Add support for AWS European Sovereign Cloud ECR by <a href="https://github.com/dphi"><code>@dphi</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/914">docker/login-action#914</a></li> <li>Ensure passwords are redacted with <code>registry-auth</code> input by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/911">docker/login-action#911</a></li> <li>build(deps): bump lodash from 4.17.21 to 4.17.23 in <a href="https://redirect.github.com/docker/login-action/pull/915">docker/login-action#915</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v3.6.0...v3.7.0">https://github.com/docker/login-action/compare/v3.6.0...v3.7.0</a></p> <h2>v3.6.0</h2> <ul> <li>Add <code>registry-auth</code> input for raw authentication to registries by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/887">docker/login-action#887</a></li> <li>Bump <code>@aws-sdk/client-ecr</code> to 3.890.0 in <a href="https://redirect.github.com/docker/login-action/pull/882">docker/login-action#882</a> <a href="https://redirect.github.com/docker/login-action/pull/890">docker/login-action#890</a></li> <li>Bump <code>@aws-sdk/client-ecr-public</code> to 3.890.0 in <a href="https://redirect.github.com/docker/login-action/pull/882">docker/login-action#882</a> <a href="https://redirect.github.com/docker/login-action/pull/890">docker/login-action#890</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.62.1 to 0.63.0 in <a href="https://redirect.github.com/docker/login-action/pull/883">docker/login-action#883</a></li> <li>Bump brace-expansion from 1.1.11 to 1.1.12 in <a href="https://redirect.github.com/docker/login-action/pull/880">docker/login-action#880</a></li> <li>Bump undici from 5.28.4 to 5.29.0 in <a href="https://redirect.github.com/docker/login-action/pull/879">docker/login-action#879</a></li> <li>Bump tmp from 0.2.3 to 0.2.4 in <a href="https://redirect.github.com/docker/login-action/pull/881">docker/login-action#881</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v3.5.0...v3.6.0">https://github.com/docker/login-action/compare/v3.5.0...v3.6.0</a></p> <h2>v3.5.0</h2> <ul> <li>Support dual-stack endpoints for AWS ECR by <a href="https://github.com/Spacefish"><code>@Spacefish</code></a> <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/874">docker/login-action#874</a> <a href="https://redirect.github.com/docker/login-action/pull/876">docker/login-action#876</a></li> <li>Bump <code>@aws-sdk/client-ecr</code> to 3.859.0 in <a href="https://redirect.github.com/docker/login-action/pull/860">docker/login-action#860</a> <a href="https://redirect.github.com/docker/login-action/pull/878">docker/login-action#878</a></li> <li>Bump <code>@aws-sdk/client-ecr-public</code> to 3.859.0 in <a href="https://redirect.github.com/docker/login-action/pull/860">docker/login-action#860</a> <a href="https://redirect.github.com/docker/login-action/pull/878">docker/login-action#878</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.57.0 to 0.62.1 in <a href="https://redirect.github.com/docker/login-action/pull/870">docker/login-action#870</a></li> <li>Bump form-data from 2.5.1 to 2.5.5 in <a href="https://redirect.github.com/docker/login-action/pull/875">docker/login-action#875</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v3.4.0...v3.5.0">https://github.com/docker/login-action/compare/v3.4.0...v3.5.0</a></p> <h2>v3.4.0</h2> <ul> <li>Bump <code>@actions/core</code> from 1.10.1 to 1.11.1 in <a href="https://redirect.github.com/docker/login-action/pull/791">docker/login-action#791</a></li> <li>Bump <code>@aws-sdk/client-ecr</code> to 3.766.0 in <a href="https://redirect.github.com/docker/login-action/pull/789">docker/login-action#789</a> <a href="https://redirect.github.com/docker/login-action/pull/856">docker/login-action#856</a></li> <li>Bump <code>@aws-sdk/client-ecr-public</code> to 3.758.0 in <a href="https://redirect.github.com/docker/login-action/pull/789">docker/login-action#789</a> <a href="https://redirect.github.com/docker/login-action/pull/856">docker/login-action#856</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.35.0 to 0.57.0 in <a href="https://redirect.github.com/docker/login-action/pull/801">docker/login-action#801</a> <a href="https://redirect.github.com/docker/login-action/pull/806">docker/login-action#806</a> <a href="https://redirect.github.com/docker/login-action/pull/858">docker/login-action#858</a></li> <li>Bump cross-spawn from 7.0.3 to 7.0.6 in <a href="https://redirect.github.com/docker/login-action/pull/814">docker/login-action#814</a></li> <li>Bump https-proxy-agent from 7.0.5 to 7.0.6 in <a href="https://redirect.github.com/docker/login-action/pull/823">docker/login-action#823</a></li> <li>Bump path-to-regexp from 6.2.2 to 6.3.0 in <a href="https://redirect.github.com/docker/login-action/pull/777">docker/login-action#777</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v3.3.0...v3.4.0">https://github.com/docker/login-action/compare/v3.3.0...v3.4.0</a></p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/docker/login-action/commit/b45d80f862d83dbcd57f89517bcf500b2ab88fb2"><code>b45d80f</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/929">#929</a> from crazy-max/node24</li> <li><a href="https://github.com/docker/login-action/commit/176cb9c12abea98dfe844071c0999ff6ee9688a7"><code>176cb9c</code></a> node 24 as default runtime</li> <li><a href="https://github.com/docker/login-action/commit/cad89843109a11cb6f69f52fe695c42cf69d57d3"><code>cad8984</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/920">#920</a> from docker/dependabot/npm_and_yarn/aws-sdk-dependenc...</li> <li><a href="https://github.com/docker/login-action/commit/92cbcb231ed341e7dc71693351b21f5ba65f8349"><code>92cbcb2</code></a> chore: update generated content</li> <li><a href="https://github.com/docker/login-action/commit/5a2d6a71bd3e0cb4abb6faae33f3dde61ece8e5b"><code>5a2d6a7</code></a> build(deps): bump the aws-sdk-dependencies group with 2 updates</li> <li><a href="https://github.com/docker/login-action/commit/44512b6b2e08b878e82b107b394fcd1af5748e63"><code>44512b6</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/928">#928</a> from docker/dependabot/npm_and_yarn/docker/actions-to...</li> <li><a href="https://github.com/docker/login-action/commit/28737a5e46bc0c62910ef429b2e55f9cabbbd5df"><code>28737a5</code></a> chore: update generated content</li> <li><a href="https://github.com/docker/login-action/commit/dac079354afbd8db4c3b58b8cc6946573479b2a6"><code>dac0793</code></a> build(deps): bump <code>@docker/actions-toolkit</code> from 0.76.0 to 0.77.0</li> <li><a href="https://github.com/docker/login-action/commit/62029f315d6d05c8646343320e4a1552e5f1c77a"><code>62029f3</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/919">#919</a> from docker/dependabot/npm_and_yarn/actions/core-3.0.0</li> <li><a href="https://github.com/docker/login-action/commit/08c8f064bf22a1c55918ee608a81d87b13cc4461"><code>08c8f06</code></a> chore: update generated content</li> <li>Additional commits viewable in <a href="https://github.com/docker/login-action/compare/v3...v4">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## Summary - Delete `compile_go_agent.sh` and Go agent Dockerfiles (`Dockerfile.go_agent.compile`, `Dockerfile.go_agent.alpine.compile`) which are no longer needed since the extension was rewritten in Rust (bottlecap) - Remove the now-orphaned `AGENT_BRANCH` and `AGENT_VERSION` pipeline input variables from `.gitlab-ci.yml` ## Jira [SVLS-8636](https://datadoghq.atlassian.net/browse/SVLS-8636) [SVLS-8636]: https://datadoghq.atlassian.net/browse/SVLS-8636?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
## Overview Upgrades dogstatsd which allows us to use our own reqwest client instead of expecting the server to create one This gives us control over how we are building a specialized client which might need a proxy, certificates, and more. ## Testing Unit tests, integration tests, and self monitoring
fixing qemu flakiness.
## Overview The extension was constructing up to 6 separate HTTP clients across different subsystems (metrics, logs, trace proxy, trace flusher, stats flusher, and Lambda API). Three of the reqwest::Client instances (metrics, logs, trace proxy) were identically configured via get_client(config), and two HttpClient (hyper) instances (trace flusher, stats flusher) were identically configured via http_client::create_client(). Each independent client maintains its own connection pool and TLS sessions, which means: - Duplicate TLS handshakes to the same Datadog intake hosts - No connection reuse across subsystems hitting the same endpoints - Unnecessary memory overhead from redundant connection pools This change consolidates to 3 clients total: 1. reqwest::Client (no-proxy) — Lambda Extensions API (intentionally isolated, localhost only) 2. reqwest::Client (shared) — Metrics, Logs, Trace proxy 3. HttpClient (shared) — Trace flusher, Stats flusher Both reqwest::Client and HttpClient are Arc-based internally, so cloning is a refcount increment that shares the underlying connection pool. This also removes the lazy OnceCell initialization from TraceFlusher and StatsFlusher in favor of eager construction at startup. The lazy init was retrying on failure, but the only failure modes (bad proxy URL, unreadable cert file) are configuration errors that won't self-resolve between retries, so failing fast is preferable. ## Testing Unit tests, integration tests, and self monitoring
## Overview
Add DD_SKIP_SSL_VALIDATION support, parsed from both env and YAML,
matching the datadog-agent's behavior — applied to all outgoing HTTP
clients (reqwest via danger_accept_invalid_certs, hyper via custom
ServerCertVerifier).
## Motivation
Customers in environments with corporate proxies or custom CA setups
need the ability to disable TLS certificate validation, matching the
existing datadog-agent config option. The Go agent applies
tls.Config{InsecureSkipVerify: true} to all HTTP transports via a
central CreateHTTPTransport() — we mirror this by wiring the config
through to both client builders.
And [SLES-2710](https://datadoghq.atlassian.net/browse/SLES-2710)
## Changes
Config (config/mod.rs, config/env.rs, config/yaml.rs):
- Add skip_ssl_validation: bool to Config, EnvConfig, and YamlConfig
with default false
reqwest client (http.rs):
- .danger_accept_invalid_certs(config.skip_ssl_validation) on the shared
client builder
hyper client (traces/http_client.rs):
- Custom NoVerifier implementing
rustls::client::danger::ServerCertVerifier that accepts all certificates
- Uses CryptoProvider::get_default() (not hardcoded aws_lc_rs) for
FIPS-safe signature scheme reporting
- New skip_ssl_validation parameter on create_client()
## Testing
Unit tests and self monitoring
[SLES-2710]:
https://datadoghq.atlassian.net/browse/SLES-2710?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
…taDog#1024) ## Overview 1. The first thing [handle_end_invocation](https://github.com/DataDog/datadog-lambda-extension/blob/2c61aca453a3ab41df58d407e1659705cdcee273/bottlecap/src/lifecycle/listener.rs#L163) does is spawn a task, let's call it `anonymousTask` 2. `handle_end_invocation` then [immediately returns 200](https://github.com/DataDog/datadog-lambda-extension/blob/2c61aca453a3ab41df58d407e1659705cdcee273/bottlecap/src/lifecycle/listener.rs#L181) so the tracer can continue 3. `anonymousTask` is busy with a complex body in `extract_request_body` for the time being 4. Because the tracer has continued, eventually `PlatformRuntimeDone` [is processed](https://github.com/DataDog/datadog-lambda-extension/blob/2c61aca453a3ab41df58d407e1659705cdcee273/bottlecap/src/lifecycle/invocation/processor_service.rs#L481) 5. Given our customer is not managed (`initialization_type: SnapStart`) then `PlatformRuntimeDone` [tries to pair_platform_runtime_done_event](https://github.com/DataDog/datadog-lambda-extension/blob/2c61aca453a3ab41df58d407e1659705cdcee273/bottlecap/src/lifecycle/invocation/processor.rs#L496) which is `None` because `anonymousTask` is still busy with the body 6. We then [jump to process_on_platform_runtime_done](https://github.com/DataDog/datadog-lambda-extension/blob/2c61aca453a3ab41df58d407e1659705cdcee273/bottlecap/src/lifecycle/invocation/processor.rs#L506) 7. Span and trace ids [are not there yet](https://github.com/DataDog/datadog-lambda-extension/blob/2c61aca453a3ab41df58d407e1659705cdcee273/bottlecap/src/lifecycle/invocation/processor.rs#L517), and they are never checked again after this 8. `anonymousTask` finally completes, but that's irrelevant because `send_ctx_spans` is only run on `PlatformRuntimeDone` which assumes [universal_instrumentation_end has already been sent](https://github.com/DataDog/datadog-lambda-extension/blob/2c61aca453a3ab41df58d407e1659705cdcee273/bottlecap/src/lifecycle/listener.rs#L177) ## Why this looks likely In the customer's logs we can see * `05:11:48.463` `datadog.trace.agent.core.DDSpan - Finished span (WRITTEN): DDSpan [ t_id=2742542901019652192` * `05:11:48.489` PlatformRuntimeDone received * `05:11:48.630` REPORT RequestId `1db22159-7200-43c8-bec1-11b89df4f099` (last log emitted in an execution) * `05:11:53.784` START RequestId: `8c801767-e21b-43f7-bd11-078bb64bc430` (new request id, 5s later) * `05:11:53.789` [Received end invocation request from headers:{""x-datadog-trace-id"": ""2742542901019652192"...](https://github.com/DataDog/datadog-lambda-extension/blob/2c61aca453a3ab41df58d407e1659705cdcee273/bottlecap/src/lifecycle/listener.rs#L258) -> we are now trying to finish the span after the request is long gone 🙃 In this specific run, the lambda even had time to stop before continuin with the anonymous task from `handle_end_invocation`. ## Motivation [SLES-2666](https://datadoghq.atlassian.net/browse/SLES-2666) ## Performance This PR makes the reading of the body synchronous with the response. This will delay handing over execution to outside the extension until the body is read. But that is irrelevant because it is a requirement to read the body and send `universal_instrumentation_end` before relinquishing control. ## Testing Suggestions very welcome [SLES-2666]: https://datadoghq.atlassian.net/browse/SLES-2666?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Jordan Gonzalez <[email protected]>
## Summary - Sign the image for ci image jobs per [instruction](https://datadoghq.atlassian.net/wiki/spaces/SECENG/pages/2744681107/Image+Integrity+User+Guide) Fixes: https://datadoghq.atlassian.net/browse/SVLS-8644 Co-authored-by: tianning.li <[email protected]>
…revent memory leak (DataDog#1050) JIRA: https://datadoghq.atlassian.net/browse/SVLS-8625 Git issue reported: DataDog#1049 ## What does this PR do? Fixes a memory leak in the extension where `ContextBuffer` accumulated `Context` objects indefinitely across warm Lambda invocations. **Root cause:** `on_platform_report()` reads the `Context` for runtime duration and CPU/network enhanced metrics, but never called `context_buffer.remove()` afterwards. Each warm invocation appended a new `Context` to the buffer; none were ever freed. **Fix:** Call `self.context_buffer.remove(request_id)` at the end of `on_platform_report()`, after all processing for the invocation is complete. **Impact:** Most visible when `DD_CAPTURE_LAMBDA_PAYLOAD=true` — each retained `Context` holds the full captured request/response payload as span metadata (~500 KB per invocation). Without the fix, a Lambda function invoked thousands of times would accumulate hundreds of MB of leaked memory in the extension process. ## Testing - Unit tests - A test with 50+ invocations shows | without the fix | with the fix | |--------|--------| | `buffer size after remove: 52`|`buffer size after remove: 1`| Co-authored-by: Claude Sonnet 4.6 <[email protected]>
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/docker/setup-buildx-action/releases">docker/setup-buildx-action's releases</a>.</em></p> <blockquote> <h2>v4.0.0</h2> <ul> <li>Node 24 as default runtime (requires <a href="https://github.com/actions/runner/releases/tag/v2.327.1">Actions Runner v2.327.1</a> or later) by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/483">docker/setup-buildx-action#483</a></li> <li>Remove deprecated inputs/outputs by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/464">docker/setup-buildx-action#464</a></li> <li>Switch to ESM and update config/test wiring by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/481">docker/setup-buildx-action#481</a></li> <li>Bump <code>@actions/core</code> from 1.11.1 to 3.0.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/475">docker/setup-buildx-action#475</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.63.0 to 0.79.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/482">docker/setup-buildx-action#482</a> <a href="https://redirect.github.com/docker/setup-buildx-action/pull/485">docker/setup-buildx-action#485</a></li> <li>Bump js-yaml from 4.1.0 to 4.1.1 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/452">docker/setup-buildx-action#452</a></li> <li>Bump lodash from 4.17.21 to 4.17.23 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/472">docker/setup-buildx-action#472</a></li> <li>Bump minimatch from 3.1.2 to 3.1.5 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/480">docker/setup-buildx-action#480</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/setup-buildx-action/compare/v3.12.0...v4.0.0">https://github.com/docker/setup-buildx-action/compare/v3.12.0...v4.0.0</a></p> <h2>v3.12.0</h2> <ul> <li>Deprecate <code>install</code> input by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/455">docker/setup-buildx-action#455</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.62.1 to 0.63.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/434">docker/setup-buildx-action#434</a></li> <li>Bump brace-expansion from 1.1.11 to 1.1.12 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/436">docker/setup-buildx-action#436</a></li> <li>Bump form-data from 2.5.1 to 2.5.5 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/432">docker/setup-buildx-action#432</a></li> <li>Bump undici from 5.28.4 to 5.29.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/435">docker/setup-buildx-action#435</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/setup-buildx-action/compare/v3.11.1...v3.12.0">https://github.com/docker/setup-buildx-action/compare/v3.11.1...v3.12.0</a></p> <h2>v3.11.1</h2> <ul> <li>Fix <code>keep-state</code> not being respected by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/429">docker/setup-buildx-action#429</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/setup-buildx-action/compare/v3.11.0...v3.11.1">https://github.com/docker/setup-buildx-action/compare/v3.11.0...v3.11.1</a></p> <h2>v3.11.0</h2> <ul> <li>Keep BuildKit state support by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/427">docker/setup-buildx-action#427</a></li> <li>Remove aliases created when installing by default by <a href="https://github.com/hashhar"><code>@hashhar</code></a> in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/139">docker/setup-buildx-action#139</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.56.0 to 0.62.1 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/422">docker/setup-buildx-action#422</a> <a href="https://redirect.github.com/docker/setup-buildx-action/pull/425">docker/setup-buildx-action#425</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/setup-buildx-action/compare/v3.10.0...v3.11.0">https://github.com/docker/setup-buildx-action/compare/v3.10.0...v3.11.0</a></p> <h2>v3.10.0</h2> <ul> <li>Bump <code>@docker/actions-toolkit</code> from 0.54.0 to 0.56.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/408">docker/setup-buildx-action#408</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/setup-buildx-action/compare/v3.9.0...v3.10.0">https://github.com/docker/setup-buildx-action/compare/v3.9.0...v3.10.0</a></p> <h2>v3.9.0</h2> <ul> <li>Bump <code>@docker/actions-toolkit</code> from 0.48.0 to 0.54.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/402">docker/setup-buildx-action#402</a> <a href="https://redirect.github.com/docker/setup-buildx-action/pull/404">docker/setup-buildx-action#404</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/setup-buildx-action/compare/v3.8.0...v3.9.0">https://github.com/docker/setup-buildx-action/compare/v3.8.0...v3.9.0</a></p> <h2>v3.8.0</h2> <ul> <li>Make cloud prefix optional to download buildx if driver is cloud by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/390">docker/setup-buildx-action#390</a></li> <li>Bump <code>@actions/core</code> from 1.10.1 to 1.11.1 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/370">docker/setup-buildx-action#370</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.39.0 to 0.48.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/389">docker/setup-buildx-action#389</a></li> <li>Bump cross-spawn from 7.0.3 to 7.0.6 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/382">docker/setup-buildx-action#382</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/setup-buildx-action/compare/v3.7.1...v3.8.0">https://github.com/docker/setup-buildx-action/compare/v3.7.1...v3.8.0</a></p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/docker/setup-buildx-action/commit/4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd"><code>4d04d5d</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-buildx-action/issues/485">#485</a> from docker/dependabot/npm_and_yarn/docker/actions-to...</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/cd74e05d9bae4eeec789f90ba15dc6fb4b60ae5d"><code>cd74e05</code></a> chore: update generated content</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/eee38ec7b3ed034ee896d3e212e5d11c04562b84"><code>eee38ec</code></a> build(deps): bump <code>@docker/actions-toolkit</code> from 0.77.0 to 0.79.0</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/7a83f65b5a215b3c81b210dafdc20362bd2b4e24"><code>7a83f65</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-buildx-action/issues/484">#484</a> from docker/dependabot/github_actions/docker/setup-qe...</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/a5aa96747d67f62520b42af91aeb306e7374b327"><code>a5aa967</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-buildx-action/issues/464">#464</a> from crazy-max/rm-deprecated</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/e73d53fa4ed86ff46faaf2b13a228d6e93c51af3"><code>e73d53f</code></a> build(deps): bump docker/setup-qemu-action from 3 to 4</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/28a438e9ed9ef7ae2ebd0bf839039005c9501312"><code>28a438e</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-buildx-action/issues/483">#483</a> from crazy-max/node24</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/034e9d37dd436b56b0167bea5a11ab731413e8cf"><code>034e9d3</code></a> chore: update generated content</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/b4664d8fd0ba15ff14560ab001737c666076d5be"><code>b4664d8</code></a> remove deprecated inputs/outputs</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/a8257dec35f244ad06b4ff6c90fdd2ba97f262ba"><code>a8257de</code></a> node 24 as default runtime</li> <li>Additional commits viewable in <a href="https://github.com/docker/setup-buildx-action/compare/v3...v4">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…taDog#1090) Bumps [aquasecurity/trivy-action](https://github.com/aquasecurity/trivy-action) from 0.34.2 to 0.35.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/aquasecurity/trivy-action/releases">aquasecurity/trivy-action's releases</a>.</em></p> <blockquote> <h2>v0.35.0</h2> <h2>What's Changed</h2> <ul> <li>chore(deps): Update trivy to v0.69.3 by <a href="https://github.com/aqua-bot"><code>@aqua-bot</code></a> in <a href="https://redirect.github.com/aquasecurity/trivy-action/pull/519">aquasecurity/trivy-action#519</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/aquasecurity/trivy-action/compare/0.34.2...0.35.0">https://github.com/aquasecurity/trivy-action/compare/0.34.2...0.35.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/aquasecurity/trivy-action/commit/57a97c7e7821a5776cebc9bb87c984fa69cba8f1"><code>57a97c7</code></a> chore(deps): Update trivy to v0.69.3 (<a href="https://redirect.github.com/aquasecurity/trivy-action/issues/519">#519</a>)</li> <li>See full diff in <a href="https://github.com/aquasecurity/trivy-action/compare/97e0b3872f55f89b95b2f65b3dbab56962816478...57a97c7e7821a5776cebc9bb87c984fa69cba8f1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…race_stats_on_extension is enabled (DataDog#1060) ## Summary - When `compute_trace_stats_on_extension` is `true`, traces with sampling priority `<= 0` (`AUTO_DROP` / `USER_DROP`) are now dropped and **not** flushed to the Datadog backend. - When `compute_trace_stats_on_extension` is `false` (the current default), traces are not dropped because all traces need to be sent to Datadog so trace stats can be computed. - Trace stats computation is unaffected: dropped traces are still processed through `process_traces` and their stats are forwarded to the stats concentrator. ## Test plan - Passed the added unit test ### Manual test #### Steps - Add logging for trace payload flushed, and for traces being dropped - Build a layer and install it on a Lambda function - Invoke the function 6 times #### Result Logs show that - some traces were dropped. - the `aws.lambda` span for some of the 6 invocations were not flushed to Datadog. 🤖 Partially generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…aDog#1067) Instead of passing the whole Request into the spawned task and calling extract_request_body (which consumes the request and early-returns on failure), the fix: 1. Splits the request upfront with request.into_parts() — headers are preserved regardless of body extraction outcome 2. Attempts body buffering via Bytes::from_request 3. Falls back to Bytes::new() on failure (e.g. oversized payload) with a warn! log 4. Always calls universal_instrumentation_end — trace context, span finalization, and status code extraction proceed with degraded (empty) payload rather than being silently dropped The FromRequest import was added to the module-level axum imports to support calling Bytes::from_request directly. --------- Co-authored-by: Claude Opus 4.6 <[email protected]>
https://datadoghq.atlassian.net/browse/SVLS-8626 ## Overview OTLP currently expects protobuf payload. Update to allow for protobuf and json. ## Testing Add integration tests which sends json payload. --------- Co-authored-by: Claude Opus 4.5 <[email protected]>
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/docker/build-push-action/releases">docker/build-push-action's releases</a>.</em></p> <blockquote> <h2>v7.0.0</h2> <ul> <li>Node 24 as default runtime (requires <a href="https://github.com/actions/runner/releases/tag/v2.327.1">Actions Runner v2.327.1</a> or later) by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1470">docker/build-push-action#1470</a></li> <li>Remove deprecated <code>DOCKER_BUILD_NO_SUMMARY</code> and <code>DOCKER_BUILD_EXPORT_RETENTION_DAYS</code> envs by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1473">docker/build-push-action#1473</a></li> <li>Remove legacy export-build tool support for build summary by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1474">docker/build-push-action#1474</a></li> <li>Switch to ESM and update config/test wiring by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1466">docker/build-push-action#1466</a></li> <li>Bump <code>@actions/core</code> from 1.11.1 to 3.0.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1454">docker/build-push-action#1454</a></li> <li>Bump <code>@docker/actions-toolkit</code> from 0.62.1 to 0.79.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1453">docker/build-push-action#1453</a> <a href="https://redirect.github.com/docker/build-push-action/pull/1472">docker/build-push-action#1472</a> <a href="https://redirect.github.com/docker/build-push-action/pull/1479">docker/build-push-action#1479</a></li> <li>Bump minimatch from 3.1.2 to 3.1.5 in <a href="https://redirect.github.com/docker/build-push-action/pull/1463">docker/build-push-action#1463</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/build-push-action/compare/v6.19.2...v7.0.0">https://github.com/docker/build-push-action/compare/v6.19.2...v7.0.0</a></p> <h2>v6.19.2</h2> <ul> <li>Preserve port in <code>GIT_AUTH_TOKEN</code> host by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1458">docker/build-push-action#1458</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/build-push-action/compare/v6.19.1...v6.19.2">https://github.com/docker/build-push-action/compare/v6.19.1...v6.19.2</a></p> <h2>v6.19.1</h2> <ul> <li>Derive <code>GIT_AUTH_TOKEN</code> host from GitHub server URL by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1456">docker/build-push-action#1456</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/build-push-action/compare/v6.19.0...v6.19.1">https://github.com/docker/build-push-action/compare/v6.19.0...v6.19.1</a></p> <h2>v6.19.0</h2> <ul> <li>Scope default git auth token to <code>github.com</code> by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1451">docker/build-push-action#1451</a></li> <li>Bump brace-expansion from 1.1.11 to 1.1.12 in <a href="https://redirect.github.com/docker/build-push-action/pull/1396">docker/build-push-action#1396</a></li> <li>Bump form-data from 2.5.1 to 2.5.5 in <a href="https://redirect.github.com/docker/build-push-action/pull/1391">docker/build-push-action#1391</a></li> <li>Bump js-yaml from 3.14.1 to 3.14.2 in <a href="https://redirect.github.com/docker/build-push-action/pull/1429">docker/build-push-action#1429</a></li> <li>Bump lodash from 4.17.21 to 4.17.23 in <a href="https://redirect.github.com/docker/build-push-action/pull/1446">docker/build-push-action#1446</a></li> <li>Bump tmp from 0.2.3 to 0.2.4 in <a href="https://redirect.github.com/docker/build-push-action/pull/1398">docker/build-push-action#1398</a></li> <li>Bump undici from 5.28.4 to 5.29.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1397">docker/build-push-action#1397</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/build-push-action/compare/v6.18.0...v6.19.0">https://github.com/docker/build-push-action/compare/v6.18.0...v6.19.0</a></p> <h2>v6.18.0</h2> <ul> <li>Bump <code>@docker/actions-toolkit</code> from 0.61.0 to 0.62.1 in <a href="https://redirect.github.com/docker/build-push-action/pull/1381">docker/build-push-action#1381</a></li> </ul> <blockquote> <p>[!NOTE] <a href="https://docs.docker.com/build/ci/github-actions/build-summary/">Build summary</a> is now supported with <a href="https://docs.docker.com/build-cloud/">Docker Build Cloud</a>.</p> </blockquote> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/build-push-action/compare/v6.17.0...v6.18.0">https://github.com/docker/build-push-action/compare/v6.17.0...v6.18.0</a></p> <h2>v6.17.0</h2> <ul> <li>Bump <code>@docker/actions-toolkit</code> from 0.59.0 to 0.61.0 by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1364">docker/build-push-action#1364</a></li> </ul> <blockquote> <p>[!NOTE] Build record is now exported using the <a href="https://docs.docker.com/reference/cli/docker/buildx/history/export/"><code>buildx history export</code></a> command instead of the legacy export-build tool.</p> </blockquote> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/build-push-action/compare/v6.16.0...v6.17.0">https://github.com/docker/build-push-action/compare/v6.16.0...v6.17.0</a></p> <h2>v6.16.0</h2> <ul> <li>Handle no default attestations env var by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1343">docker/build-push-action#1343</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/docker/build-push-action/commit/d08e5c354a6adb9ed34480a06d141179aa583294"><code>d08e5c3</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1479">#1479</a> from docker/dependabot/npm_and_yarn/docker/actions-t...</li> <li><a href="https://github.com/docker/build-push-action/commit/cbd2dff9a0f0ef650dcce9c635bb2f877ab37be5"><code>cbd2dff</code></a> chore: update generated content</li> <li><a href="https://github.com/docker/build-push-action/commit/f76f51f12900bb84aa9d1a498f35870ef1f76675"><code>f76f51f</code></a> chore(deps): Bump <code>@docker/actions-toolkit</code> from 0.78.0 to 0.79.0</li> <li><a href="https://github.com/docker/build-push-action/commit/7d03e66b5f24d6b390ab64b132795fd3ef4152c8"><code>7d03e66</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1473">#1473</a> from crazy-max/rm-deprecated-envs</li> <li><a href="https://github.com/docker/build-push-action/commit/98f853d923dd281a3bcbbb98a0712a91aa913322"><code>98f853d</code></a> chore: update generated content</li> <li><a href="https://github.com/docker/build-push-action/commit/cadccf6e8c7385c86d9cb0800cf07672645cc238"><code>cadccf6</code></a> remove deprecated envs</li> <li><a href="https://github.com/docker/build-push-action/commit/03fe8775e325e34fffbda44c73316f8287aea372"><code>03fe877</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1478">#1478</a> from docker/dependabot/github_actions/docker/setup-b...</li> <li><a href="https://github.com/docker/build-push-action/commit/827e36650e1fa7386d09422b5ba3c068fdbe0a1d"><code>827e366</code></a> chore(deps): Bump docker/setup-buildx-action from 3 to 4</li> <li><a href="https://github.com/docker/build-push-action/commit/e25db879d025485a4eebd64fea9bb88a43632da6"><code>e25db87</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1474">#1474</a> from crazy-max/rm-export-build-tool</li> <li><a href="https://github.com/docker/build-push-action/commit/1ac2573b5c8b4e4621d5453ab2a99e83725242bd"><code>1ac2573</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1470">#1470</a> from crazy-max/node24</li> <li>Additional commits viewable in <a href="https://github.com/docker/build-push-action/compare/v6...v7">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## This PR After dropping sampled-out traces, recompute `body_size`. This ensures the `TraceAggregator`'s 3.2 MB batch limit is evaluated against only the data that will actually be sent to the backend. Upgrades the version of some external crates because those are the versions used in libdatadog. ## Testing - Unit tests ## Note The recomputed size uses the protobuf encoded payload size, different from the original size, computed from: (from Claude) > - Datadog tracer path: src/traces/trace_agent.rs:506 — body_size is the first element of the tuple returned by get_traces_from_request_body() / get_v05_traces_from_request_body(), which is the raw HTTP request body byte count (msgpack-encoded bytes). > - OTLP path: src/otlp/agent.rs:167 — let body_size = size_of_val(&traces) where traces is a TracerPayloadCollection, giving only the stack size of the Rust enum (~32 bytes). The new approach be more accurate because it's computed at a later point for the size of protobuf data, which is what's finally sent to Datadog. By the way, the size doesn't need to be accurate. An approximate size is good enough. See: https://github.com/DataDog/libdatadog/blob/3f3efefb2ff45d7a5491b770480396d001b87631/libdd-trace-utils/src/send_data/mod.rs#L148 Also here are some sample logs (logging node not included in the PR) showing the different sizes computed in different ways: > body_size (original): 582, body_size (encoded_len): 1355 > body_size (original): 373, body_size (encoded_len): 1269 > body_size (original): 336, body_size (encoded_len): 899 --------- Co-authored-by: Claude Sonnet 4.6 <[email protected]>
… Lambda (DataDog#1094) ## Summary Fixes a regression introduced in v93 where customers see a sharp increase in "Max retries exceeded, returning request error" errors after upgrading from v92. - Disables HTTP connection pooling for the trace/stats flusher by setting `pool_max_idle_per_host(0)` - Prevents stale connections from being reused after Lambda freeze/resume cycles ## Problem PR DataDog#1018 introduced HTTP client caching for performance improvements. However, the cached client maintains a connection pool that doesn't work well with Lambda's freeze/resume execution model: 1. Lambda executes, HTTP client created with connection pool 2. Extension flushes traces, connections remain open in pool 3. Lambda **freezes** (paused between invocations - can be seconds to minutes) 4. Lambda **resumes**, cached client reuses stale connections 5. TCP errors → "Max retries exceeded" In v92, a new HTTP client was created per-flush, so there were never stale connections to reuse. ## Solution Disable connection pooling by setting `pool_max_idle_per_host(0)`. This ensures each request gets a fresh connection, avoiding stale connection issues while still benefiting from client caching (TLS session reuse, configuration reuse, etc.). This matches the pattern used in libdatadog's `new_client_periodic()` which explicitly disables pooling with the comment: > "This client does not keep connections because otherwise we would get a pipe closed every second connection because of low keep alive in the agent." ## Related - Fixes [SVLS-8672](https://datadoghq.atlassian.net/browse/SVLS-8672) - Fixes DataDog#1092 - Regression introduced in DataDog#1018 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <[email protected]> Co-authored-by: jordan gonzález <[email protected]>
…vars (DataDog#1097) Allow passing custom tracer library versions via environment variables (`NODE_TRACER_LAYER_ARN`, `PYTHON_TRACER_LAYER_ARN`, `JAVA_TRACER_LAYER_ARN`, `DOTNET_TRACER_LAYER_ARN`). Current hardcoded values remain as defaults. No updates were made to actual extension code. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <[email protected]>
…DataDog#1095) Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.13.0 to 0.13.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/styfle/cancel-workflow-action/releases">styfle/cancel-workflow-action's releases</a>.</em></p> <blockquote> <h2>0.13.1</h2> <h3>Patches</h3> <ul> <li>Fix: update Node.js runtime from 20 to 24: <a href="https://redirect.github.com/styfle/cancel-workflow-action/issues/217">#217</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/styfle/cancel-workflow-action/commit/d07a454dad7609a92316b57b23c9ccfd4f59af66"><code>d07a454</code></a> 0.13.1</li> <li><a href="https://github.com/styfle/cancel-workflow-action/commit/2838e032676d58d98ce3e3161f323f8164018142"><code>2838e03</code></a> fix: update Node.js runtime from 20 to 24 (<a href="https://redirect.github.com/styfle/cancel-workflow-action/issues/217">#217</a>)</li> <li>See full diff in <a href="https://github.com/styfle/cancel-workflow-action/compare/0.13.0...0.13.1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…g#1240) ## What Log the `handle_traces` request-body-read failure at **DEBUG** instead of **ERROR**. Fixes DataDog#1232. ## Why This failure happens probably because the execution environment is frozen when tracer sends traces to extension, causing timeout for TCP connections, which is not actionable on extension side. Lowering the log level to reduce noise. ## Notes If any customer sees other issues such as missing traces, let us know and we will treat it as a separate issue. --------- Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
DataDog#1224) ## Overview Introduce a team-shared coding-agent configuration so any agent (Claude Code, Codex, etc.) gets the same project-level guidance, while still allowing personal overrides. - `AGENTS.md` — agent-agnostic project guide (architecture, data flow, source-tree map, PR conventions). Reviewed against the codebase: corrected the `proxy/` and `metrics/` descriptions and replaced the simplistic data-flow diagram with one that lists the real event sources (Lambda Extension API polling, telemetry listener, lifecycle listener, DogStatsD, trace/OTLP agents). - `CLAUDE.md` — single-line entrypoint that loads both `@AGENTS.md` (shared) and `@CLAUDE_PERSONAL.md` (personal, untracked). - `.gitignore` — now ignores `/CLAUDE_PERSONAL.md` instead of the shared files. - `.claude/settings.json` — `PreToolUse` hook that runs `cd bottlecap && cargo clippy --workspace --all-targets --features default && cargo fmt --all -- --check` before any `git commit` Bash call. Failures exit 2 and block the commit. Timeout 60s; matches via `if: "Bash(git commit*)"` so chained commands won't bypass it. The settings split mirrors the CLAUDE.md/CLAUDE_PERSONAL.md pattern via Claude Code's built-in convention: `.claude/settings.json` is committed (team-wide), `.claude/settings.local.json` is gitignored (personal overrides). ## Testing The team will test this in daily work and iterate as needed.
…#1234) ## Overview Adds support for excluding specific auto-injected tags from customer DogStatsD metrics enrichment via a new `DD_CUSTOMER_METRICS_EXCLUDE_TAGS` environment variable. This lets users drop high-cardinality enrichment tags (e.g. `function_arn`, `region`) from custom metrics to reduce billing. ## Changes - New `customer_metrics_exclude_tags` config (comma-separated list of tag keys) parsed from `DD_CUSTOMER_METRICS_EXCLUDE_TAGS`, with default empty - `start_dogstatsd()` filters the enrichment tag list against the exclusion set when initializing the metrics aggregator - Config parsing + merging support in `bottlecap/src/config/env.rs` and `mod.rs` - Unit tests cover env-var parsing and default behavior - New integration suite (`tests/custom-metrics.test.ts`) deploys two Lambdas — one with no exclusions, one with `function_arn,region` excluded — invokes them, and asserts via the Datadog metrics API that the enrichment tags are present/absent as expected ## Testing - `cargo fmt`, `cargo check`, `cargo clippy --features default`, `cargo test --workspace` all pass locally - Integration test deployed to sandbox and validated against the live Datadog API --------- Co-authored-by: datadog-bits <[email protected]> Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
remove mention of serverless-init
… dedup (DataDog#1241) ## Background From our knowledge (before this PR), here's the behavior when each runtime OOMs: - emits runtime-specific error message. This can happen on **Java**, **Node** (case 1 in the table below) and **.NET** - In `PlatformRuntimeDone` event, `error_type` is `Runtime.OutOfMemory`. This can happen on **Python** and **Ruby**. - In `PlatformReport` event, `max_memory_used == memory_size`. This can happen on **Python**, **Ruby**, **Node** and **Go**. To capture OOM for all these scenarios (except Node case 2, which was just called out in DataDog#1237) without double counting, right now the extension emits `aws.lambda.enhanced.out_of_memory` metric in these scenarios: - when we see runtime-specific error messages for Java, Node and .NET - when we see `Runtime.OutOfMemory` - when we see `max_memory_used == memory_size` for Go, i.e. only when runtime is `provided.al2`. We don't do this for other runtimes (Python, Ruby, Node) to avoid double counting. <img width="768" height="323" alt="image" src="https://github.com/user-attachments/assets/549a8820-6b86-462d-a857-0269d2990a02" /> ## Problem In issue DataDog#1237, a customer called out a new scenario: "Node (case 2)" in the table. The only evidence of OOM is `max_memory_used == memory_size`, and there is no runtime-specific log message. As a result, OOMs like this are not captured by the OOM enhanced metric. ## This PR - Regardless of runtime, use all the three ways to capture OOM. - In addition, dedup by request_id to avoid double counting. - Add one integration test per runtime (except for Node, which has 2 tests) ## Test plan Passed the added unit tests and integration tests. ## To reviewers Most of the code changes are for integration tests. ## Details (generated by Claude Code) Closes the gap surfaced in DataDog#1237: a Node.js Lambda that hit its memory limit (`Memory Size 192 MB / Max Memory Used 192 MB`, `Status: timeout`) did not emit `aws.lambda.enhanced.out_of_memory` because none of the three existing detection paths matched. - **Why the existing paths missed it.** V8 spent its budget in GC rather than declaring `JavaScript heap out of memory`, so the runtime log-line match never fired. The runtime crashed on a wall-clock timeout, so `PlatformRuntimeDone` reported no `error_type`. And the `max_memory_used_mb == memory_size_mb` check in `PlatformReport` was gated on `runtime.starts_with("provided.al")` to avoid double-counting against the log path, so Node was excluded. - **What changes.** Drop the `provided.al*` restriction so the equality check applies to every runtime. To avoid double-counting against the two pre-existing paths (some invocations satisfy both equality and `Runtime.OutOfMemory` simultaneously), add a per-`Context` `oom_emitted` flag. All three detection paths funnel through a new `Processor::try_increment_oom_metric`, which checks/sets the flag and is a no-op on subsequent calls for the same `request_id`. - **Plumbing.** `Event::OutOfMemory` now carries an `Option<String> request_id`. The log-path detector reads it from `LambdaProcessor::invocation_context.request_id` (set on `PlatformStart`, cleared on `PlatformRuntimeDone`/`PlatformReport`). `None` is only realistic in Managed Instance mode (extensions can't subscribe to INVOKE there); the helper falls back to a best-effort emit without dedup in that case. --------- Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
…r fix (DataDog#1244) ## Overview Bump all `libdd-*` dependencies from `db05e1f` to `48da0d8` to pick up [libdatadog PR #2071](DataDog/libdatadog#2071), which fixes how the `datadog-client-computed-stats` and `datadog-client-computed-top-level` headers are parsed so the behavior matches the Go trace-agent. Bottlecap consumes this exact path in `bottlecap/src/traces/trace_agent.rs` via `(&parts.headers).into()`, so it directly benefits from the fix. ### Adapting to breaking API changes between the two revisions - `HttpClientTrait` was renamed to `HttpClientCapability` - `SendData::send` now requires `C: HttpClientCapability + SleepCapability`, so implemented `SleepCapability` for `HttpClient` ### Testing Added Tier 0 coverage in `trace_agent.rs` pinning the new header-parsing behavior at the `(&headers).into()` boundary `handle_traces` uses: - `true`, `yes`, `t`, `1` -> flag set - `false`, `0`, `f`, `F`, `FALSE`, `False` -> flag clear - absent/empty -> clear - `client_computed_top_level` no longer set by presence alone (pre-bump regression) These test would fail on the pre-bump rev (`db05e1f`), so they lock in the fix. > *"Turns out `yes` means yes and `false` means false. Took a whole PR to teach the parser what every toddler already knows."* — Claude 🤖 [APMSVLS-487](https://datadoghq.atlassian.net/browse/APMSVLS-487) [APMSVLS-487]: https://datadoghq.atlassian.net/browse/APMSVLS-487?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
…ataDog#1248) ## Overview Fixes the remaining cases of [DataDog#1092](DataDog#1092) — customers continuing to see `Max retries exceeded, returning request error` and `TRACES | Request failed: No requests sent` after the v94 patch in DataDog#1094. PR DataDog#1094 disabled connection pooling on the **hyper** `HttpClient` used by the trace flusher and stats flusher. It did not touch the **reqwest** `Client` in `bottlecap/src/http.rs`, which is used by: - the trace proxy (`proxy_flusher`) — the path AppSec and many tracer configurations route through - the metrics flusher - the logs flusher That client was still configured with `pool_idle_timeout(270s)` and `tcp_keepalive(120s)`, leaving idle connections in the pool across Lambda freeze/resume cycles. Connections go stale during a freeze (the OS tears down the remote side while the local kernel still considers them established), and the next request after resume fails with broken pipe / RST → retries exhaust → the user-visible errors. ## Change `bottlecap/src/http.rs`: replace `pool_idle_timeout(270s) + tcp_keepalive(120s)` with `pool_max_idle_per_host(0)`. Mirrors the fix in `bottlecap/src/traces/http_client.rs` and the pattern in libdatadog's `new_client_periodic`. Each request opens a fresh connection; TLS session resumption inside the client still amortizes the handshake. Trade-off: one extra TLS handshake per flush. Matches the pre-v93 behavior that customers had no complaints about. ## Testing - New unit test `shared_client_does_not_pool_connections` in `bottlecap/src/http.rs`: - Spawns a minimal HTTP/1.1 keep-alive server that counts accepted TCP connections. - Issues two sequential GETs through `get_client(...)`. - Asserts the server saw **2** connections. - Verified the test **fails** against the unpatched code (`opened=1`, connection reused from pool) — proves it catches the regression. - Verified the test **passes** against the patched code (`opened=2`, fresh connection each time). - `cargo test --lib` — 547 tests pass. - `cargo clippy --lib --tests -- -D warnings` — clean. - `cargo fmt --check` — clean. ## Other clients (unchanged) | Client | File | Pooling | Notes | |---|---|---|---| | hyper `HttpClient` | `traces/http_client.rs` | already disabled (DataDog#1094) | trace + stats flushers | | reqwest `Client` (shared) | `bottlecap/src/http.rs` | **disabled here** | trace proxy, metrics, logs | | reqwest `Client` (Lambda Extensions API) | `bin/bottlecap/main.rs` | unchanged | localhost-only; pooling irrelevant |
…#1245) ## Overview Makes the extension respect the tracer's `Datadog-Client-Computed-Stats` header and moves `_dd.compute_stats` from a baked-in function tag to a per-span backend directive. We tried supporting the `Datadog-Client-Computed-Stats` header before in DataDog#1118, but that was reverted in DataDog#1176. ### Background Span attribute `_dd.compute_stats` asks the backend to compute trace stats. It must be set to `"1"` only when nobody else computed them — neither the extension (agent) nor the tracer. Previously the extension: 1. **Baked `_dd.compute_stats` into the function tags** unconditionally (`tags_from_env`), which also leaked the key into `_dd.tags.function`. 2. **Ignored `Datadog-Client-Computed-Stats`** entirely, so when a tracer computed stats client-side, the backend was still asked to compute them. ### Canonical semantics (validated against the Go agent) The Go agent (`pkg/serverless/tags/tags.go`) only ever sets `_dd.compute_stats = "1"`, never `"0"`, and leaves the key absent otherwise. This PR matches that: > Set `_dd.compute_stats="1"` iff `!compute_trace_stats_on_extension && !client_computed_stats`; otherwise leave it absent. | `client_computed_stats` (header from tracer) | `compute_on_extension` (extension config) | who computes | stamp `_dd.compute_stats="1"`? | -------------------- | --------------------- | --------------- | --- | true | (ignored) | tracer | ❌ no | false | true | extension | ❌ no | false | false | backend | ✅ yes ### Changes - **`tags/lambda/tags.rs`** — stop baking `_dd.compute_stats` in `tags_from_env` (no longer leaks into `_dd.tags.function`); `COMPUTE_STATS_KEY` is now `pub` so the integration test can reuse it instead of re-declaring the literal. - **Path A: `traces/trace_processor.rs`** — `ChunkProcessor` gains `client_computed_stats` and stamps `_dd.compute_stats="1"` per-span only when neither side computes stats; the extension-side stats-generation guard in `send_processed_traces` now also skips when `client_computed_stats` is set. - **Path B (extension-generated `aws.lambda` span)** — `client_computed_stats` is propagated from the tracer's placeholder span through `context.rs` → `processor.rs` → `processor_service.rs` → `trace_agent.rs`, so Path B reuses the same `ChunkProcessor` stamping (single source of truth). - **OTLP: `otlp/agent.rs`** — the OTLP stats-generation guard previously checked only `compute_trace_stats_on_extension`, so an OTLP request carrying `Datadog-Client-Computed-Stats` would still generate extension-side stats and double-count against the tracer. It now also skips when `client_computed_stats` is set, mirroring the `send_processed_traces` guard. - **Single source of truth: `traces/trace_processor.rs`** — the three decisions over the same two inputs (the per-span `_dd.compute_stats` stamp, plus the extension-side stats-generation guards in `send_processed_traces` and `otlp/agent.rs`) are now derived from one `StatsComputedBy::resolve(compute_on_extension, client_computed_stats)` helper, so the stamp and the guards can't silently drift apart. ### Note on the header value (cross-runtime) `Datadog-Client-Computed-Stats` is not standardized (`"true"` .NET/Java/PHP/Python, `"yes"` JS/Ruby/C++, `"t"` Go). bottlecap consumes the already-parsed `client_computed_stats` bool from `libdd_trace_utils`, where any non-empty value → `true`, so the fix triggers on every runtime. A separate libdatadog PR ([DataDog/libdatadog#2071](DataDog/libdatadog#2071)) aligns the header parsing with the Go agent's `isHeaderTrue`/`ParseBool` rules; this PR only consumes the bool and does not depend on that change. ## Testing - ~**Tier 0** (header-parsing contract)~ — moved to the libdatadog bump PR DataDog#1244, since those tests assert libdatadog parsing behavior that the `db05e1f → 48da0d8` bump changes. This branch keeps Tiers 1–3 and rebases onto [DataDog#1244](/DataDog/pull/1244) after it merges. - **Tier 1** (`trace_processor.rs`) — truth-table on `Span.meta`, stats-skip guard via the real `StatsConcentratorService`, and updated `tags.rs` unit tests asserting the key no longer appears in the tags map. Fixed the logs/metrics integration tests that asserted the old leak. - **Tier 2** (`context.rs`, `processor.rs`) — context-level flag recording and an end-to-end Path B test driving `send_ctx_spans` through the `trace_tx` channel, asserting `_dd.compute_stats` on the `aws.lambda` span across the truth table. - **Tier 3** (`apm_integration_test.rs`) — full fake-intake E2E routing a trace through `SendingTraceProcessor::send_processed_traces`: asserts on the captured `AgentPayload` span meta and on `stats_payloads()` (stats suppressed unless the extension computes and the tracer did not). ###⚠️ TODO before merging - [x] Rebase onto the libdatadog bump PR ([DataDog#1244](DataDog#1244)) after it merges. - [ ] E2E tests. --- > *"Computing stats twice doesn't make them twice as true, it just makes the backend twice as grumpy."* — Claude 🤖 [APMSVLS-487](https://datadoghq.atlassian.net/browse/APMSVLS-487) [APMSVLS-487]: https://datadoghq.atlassian.net/browse/APMSVLS-487?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
…ataDog#1252) The `clippy` + `fmt` pre-commit hook in `.claude/settings.json` used a bare `cd bottlecap`, which only resolved from the repo root. Switched to `cd "$CLAUDE_PROJECT_DIR/bottlecap"` so it works from subdirectories too.
<!-- dd-meta
{"pullId":"1ed3ba02-a71f-4597-8cbd-35993feb9b5c","source":"chat","resourceId":"9495ef61-5bdd-4785-95d4-5b9ecf23d513","workflowId":"1b9b5580-ec78-4745-8503-f4b6c6d04285","codeChangeId":"1b9b5580-ec78-4745-8503-f4b6c6d04285","sourceType":"slack"}
-->
## Overview
Motivation: Customers without an application tracer can hit Lambda
timeouts where the extension synthesizes an `aws.lambda` trace ID for
timeout handling. That generated trace ID was also copied onto the cold
start span, making the extension send a cold start span even though no
tracer had established an APM trace.
Changes:
- Only copy the invocation trace ID to the cold start span when tracer
instrumentation was detected.
- Preserve the Node/Python behavior where `aws.lambda.load` sets the
cold start trace ID directly before the cold start span is sent.
- Added regression coverage for timeout handling without a tracer and
for preserving tracer-provided cold start trace IDs.
## Testing
- `RUSTUP_TOOLCHAIN=stable cargo fmt --check`
- Attempted `RUSTUP_TOOLCHAIN=stable cargo test --lib cold_start
--no-default-features`; blocked before compilation because the sandbox
allowlist returned 403 fetching `DataDog/serverless-components` for the
`datadog-fips` git dependency.
---
PR by Bits - [View session in
Datadog](https://app.datadoghq.com/code/9495ef61-5bdd-4785-95d4-5b9ecf23d513)
Comment @DataDog to request changes
Co-authored-by: datadog-bits <[email protected]>
…uest id for on-demand (DataDog#1250) ## Overview When the tracer sends the `lambda-runtime-aws-request-id` header (in the start-invocation and end-invocation requests), use request ID based pairing instead of FIFO for both `UniversalInstrumentationStart` and `UniversalInstrumentationEnd` in On Demand mode in addition to Managed Instance mode. FIFO pairing is preserved as a fallback for tracers that do not send the header. Motivation: [SLES-2877](https://datadoghq.atlassian.net/browse/SLES-2877) [SLES-2877]: https://datadoghq.atlassian.net/browse/SLES-2877?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
…OG_BUFFER_SIZE (DataDog#1239) ## Background For durable functions, the extension holds logs and waits to get the invocation context from the tracer so the extension can enrich the logs. ## Problem When tracing is off (which is not recommended for durable functions), logs are flushed when: 1. the buffer is full (buffer size is all logs for 50 invocations). This increases delay. Or 2. when extension shuts down. However, this is not guaranteed to happen due to race conditions, causing missing logs. ## This PR - Adds `lambda_durable_function_log_buffer_size` config field (env var `DD_LAMBDA_DURABLE_FUNCTION_LOG_BUFFER_SIZE`, default: `0`) controlling the max number of request ID keys held in `held_logs`. - When set to `0`, logs bypass the hold mechanism and are sent immediately without durable execution context enrichment. - Setting the default to 0 for now because the tracer changes for durable functions are not released. Later, after tracer changes are released, we can change the default back to 50 and ask customers to install the tracer for durable functions. ## Test plan ### Steps - Build an extension layer - install it on a durable function - execute the function - wait for a few minutes until the environment shuts down ### Result Before: - No log appears in Datadog - and the invocation doesn't appear either After: - The invocation appears <img width="407" height="106" alt="image" src="https://github.com/user-attachments/assets/f2679f37-a80e-48ef-b84c-049beeb0f7b3" /> - Logs also appear <img width="578" height="562" alt="image" src="https://github.com/user-attachments/assets/55ac197e-22fa-455e-a8eb-40a46ad99dce" /> --------- Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
…1255) ## Overview Two tests added in DataDog#1254 were failing on `main`. The Rust "Test Suite" CI job is not a required check (only `devflow/mergegate` is), so the red suite did not block DataDog#1254 from merging. ### 1. `enrich_ctx_keeps_tracer_set_cold_start_trace_id_without_tracer_detected` Annotated `#[test]` but calls `setup()`, which spawns a Tokio task via `tokio::spawn(service.run())`. Running it panicked with `there is no reactor running, must be called from the context of a Tokio 1.x runtime`. Changed to `#[tokio::test] async fn` to match its sibling tests. ### 2. `timeout_without_tracer_does_not_send_cold_start_span` Passed its `trace_sender` by value into `on_platform_runtime_done`, dropping the only `Arc<SendingTraceProcessor>` before `try_recv()`. The receiver then reported `Disconnected`, but the test asserted `Empty`, so it failed even though the production code correctly never sent the cold start span. Fixed by passing a clone and holding the sender until after the assertion so the channel stays connected. No production code changes; both fixes are test-only. > *"A test that drops its own sender and then complains the line went dead: the unit-testing equivalent of cutting the phone cord and filing a complaint about the silence."* — Claude 🤖
…ake (DataDog#1256) - [x] ~Note: stacked on DataDog#1255. Merge that PR first.~ ## Overview Extends the in-process fake-intake APM tests (added in DataDog#1194) with **value-level** coverage of trace stats aggregation. The existing stats tests assert serialization fidelity (a hand-built `ClientStatsPayload` survives the roundtrip) and stats presence/suppression (`_dd.compute_stats` truth table). None assert that the *computed* aggregates reaching the intake are correct. This PR routes concrete spans through the real pipeline (`SendingTraceProcessor` → `StatsConcentratorService` → `StatsFlusher` → fake-intake) and asserts on the decoded `ClientGroupedStats`: - `e2e_stats_count_aggregates_identical_spans` — 3 identical top-level spans collapse into one group with `hits == 3`, `top_level_hits == 3`. - `e2e_stats_counts_errors_separately_from_hits` — `errors` counts only `error != 0`; `hits` counts all. - `e2e_stats_sums_span_durations` — `duration` is the nanosecond sum of aggregated spans. - `e2e_stats_groups_by_resource` — distinct resources stay in separate groups. - `e2e_stats_groups_by_span_kind` — distinct `span.kind` stay in separate groups. - `e2e_stats_groups_by_http_status_code` — distinct `http.status_code` stay in separate groups. These verify bottlecap's wiring and serialization end-to-end (a span entering the trace path comes out the intake correctly aggregated), which libdatadog's concentrator unit tests cannot see. The aggregation *math* itself is owned and exhaustively tested upstream in `libdd-trace-stats`. To support multiple spans, `run_processor_pipeline` was generalized into `run_processor_pipeline_with_traces(.., traces)`, with a thin single-span wrapper preserving the existing `_dd.compute_stats` tests unchanged. ### Out of scope: time-bucketing Deliberately not added. Bucket assignment lives entirely inside `SpanConcentrator` and is thoroughly tested in `libdd-trace-stats` (`test_concentrator_stats_counts` over multiple buckets, `test_concentrator_oldest_timestamp_cold/hot`, `test_force_flush`). bottlecap's wiring does not touch bucketing, so a test here would duplicate upstream coverage and require a production clock seam (the concentrator seeds `oldest_timestamp` from wall-clock) for no unique coverage. ## Testing This PR is only adding more tests. If they pass, we're good. Ran locally: - `cargo test --test apm_integration_test` - `cargo fmt --all -- --check` - `cargo clippy --workspace --all-targets --features default` > *"Six tests walk into a bucket. They all collapse into one group — turns out they were identical the whole time."* — Claude 🤖
…ts (DataDog#1189) ## Overview Configure `SpanConcentrator` in bottlecap with the Go agent's default `ComputeStatsBySpanKind` span kinds and `basePeerTags` peer tag keys, fixing two gaps in agent-side trace stats computation: - [`APMSVLS-464`](https://datadoghq.atlassian.net/browse/APMSVLS-464): `span_kinds_stats_computed` was empty, so non-top-level, non-measured spans with `span.kind` = `server`/`client`/`producer`/`consumer`) were silently excluded from stats. - [`APMSVLS-463`](https://datadoghq.atlassian.net/browse/APMSVLS-463): `peer_tag_keys` was empty, so client/producer/consumer spans had no per-dependency granularity in stats output (e.g., all S3 buckets, DynamoDB tables, Kafka topics lumped together). ### Changes - Add `STATS_ELIGIBLE_SPAN_KINDS` constant (4 span kinds matching the Go agent's `KindsComputed`) - Add `DEFAULT_PEER_TAG_KEYS` constant (43 peer tag keys matching the Go agent's `basePeerTags` from `mappings.json`) - Pass both to `SpanConcentrator::new()` instead of empty vecs - Add unit tests that exercise the `StatsConcentratorService` pipeline for both features - Add fake-intake integration tests that route real spans through the concentrator → flusher → intake path, verifying span kind and peer tags survive msgpack/gzip serialization end to end ### Follow-up Both constants are hand-copied from the Go agent (`KindsComputed` and `basePeerTags`), which is the source of truth, and the same lists are also duplicated in `serverless-components`. A future refactor should keep the Rust agents in sync with the Go agent rather than each maintaining its own copy. ## Testing - `test_span_kind_stats_computed`: sends a non-root, non-measured client span through the service, verifies stats are produced with `span_kind="client"` - `test_peer_tags_populated`: sends a client span with `db.instance` and `db.system` meta, verifies `peer_tags` contains both in the stats output - `stats_span_kind_through_fake_intake`: feeds a non-root, non-measured `server` span through the full concentrator → flusher → fake-intake path, asserts the decoded `StatsPayload` carries `span_kind="server"` - `stats_peer_tags_through_fake_intake`: feeds a `client` span with `db.instance`/`db.system` meta through the same path, asserts the decoded `peer_tags` contain both keys after serialization - Tests were written first and confirmed failing before the fix was applied - Full test suite still passes > *"Turns out an empty vec is a great way to compute stats on absolutely nothing. Efficient, but not very useful."* — Claude 🤖
DataDog#1253) ## Overview The init duration metric is sent on the `PlatformInitReport` event. In the case of this event not being received / arriving late, this PR adds a fallback to use the init duration from the `PlatformReport` event on cold start invocations in On Demand mode. ## Motivation Saw failures on emitting the init duration metric in E2E tests. ## Testing Added unit tests and E2E tests no longer fail on sending the init duration metric on this PR.
https://datadoghq.atlassian.net/browse/SLES-2889 ## Overview Large single-invocation traces could be rejected by the trace intake with a 413, because the extension undercounted how big a payload would be once it left the extension. The extension enriches every span after the tracer posts it (adding the tags-provider map), so the protobuf payload it sends is larger than the raw msgpack it received. The trace aggregator's batch cap therefore undercounted the true outbound bytes and packed too much into a single request, whose combined size exceeded the intake limit → 413. The batch cap was below realistic enriched payload sizes. The cap was set to the old 3.2 MB documented limit. However, from [trace intake config](https://github.com/DataDog/logs-backend/blob/6b17c3834760efe43f0fc2ae09f8c03f893f32fb/domains/intake/apps/intake/src/main/resources/track-types.conf#L269), the limit is actually 15. This PR: - Computes `body_size` from the enriched, protobuf-encoded payload **unconditionally** (not only when on-extension stats are enabled), so the aggregator's batch cap reflects exactly what will be sent. - Raises the batch cap from 3.2 MB to 12 MB — kept below the trace intake's ~15 MB limit so a large enriched payload flushes in a single batch without a 413. - Adds debug logs for the post-enrichment payload size and per-batch coalesced size. ## Testing - **Unit:** new test asserting `body_size` equals the protobuf `encoded_len` of the payload actually sent, and exceeds the (smaller) ingress size — on the default config (no on-extension stats). - **Integration:** new `payload-size` suite deploys a Node Lambda that emits a ~10 MB single-invocation trace (400 spans carrying large captured payloads) and verifies it: enriches to >10 MB, flushes in a single batch >10 MB, arrives with no 413, and is delivered intact (one trace, root span present, all 400 spans). Run against a locally published extension layer in the serverless sandbox.
…g#1263) (DataDog#1264) ## Overview Consolidates the 6 open Dependabot/ADMS vulnerability PRs into a single PR. | Source PR | Manifest | Notes | |---|---|---| | DataDog#1258 | `integration-tests/lambda/otlp-java/pom.xml` | `io.opentelemetry:opentelemetry-api` 1.58.0 → 1.63.0 | | DataDog#1259 | `local_tests/golang/go.{mod,sum}` | `aws-sdk-go`, `golang.org/x/net`, `golang.org/x/sys` minor bumps | | DataDog#1260 | `integration-tests/lambda/otlp-node/package*.json` | Superseded by DataDog#1263 (lock already has `@grpc/[email protected]`, `@protobufjs/utf8` override carried over) | | DataDog#1261 | `integration-tests/package*.json` | `uuid` 9 → 14 (ported manually onto DataDog#1262 to avoid lock conflict) | | DataDog#1262 | `integration-tests/package*.json` | `axios` 1.15 → 1.18, plus overrides for `@opentelemetry/core`, `fast-xml-parser`, `fast-xml-builder`, `fast-uri`, `brace-expansion` | | DataDog#1263 | `integration-tests/lambda/otlp-node/package*.json` | Major OTel SDK bump (`@opentelemetry/sdk-node` 0.54 → 0.219, `protobufjs` 7.5.4 → 7.6.4) | Closes the following Dependabot alerts: DataDog#191, DataDog#192 (`@grpc/grpc-js`); DataDog#183–DataDog#190 + older axios alerts; protobufjs alerts via the major OTel SDK bump; uuid DataDog#180; OpenTelemetry Java DataDog#176. ## Testing GitHub Actions checks (Build All, Test Suite, Clippy, Audit, CodeQL) passed on each individual source PR. `dd-gitlab/*` checks failed identically on all 6 — appears to be an unrelated infra/permissions issue with the bot-authored branches. Re-running CI on this branch (created from a maintainer account) should clear them. The vendored deps live entirely under `integration-tests/` and `local_tests/`, so they have no impact on the shipped extension binary. --------- Co-authored-by: gh-worker-campaigns-3e9aa4[bot] <244854796+gh-worker-campaigns-3e9aa4[bot]@users.noreply.github.com>
…nt-config (DataDog#1249) ## Overview First step of migrating bottlecap's in-tree configuration module onto the shared `datadog-agent-config` crate (lives in [DataDog/serverless-components](https://github.com/DataDog/serverless-components/tree/main/crates/datadog-agent-config)). This PR adds the foundation only — it introduces a `LambdaConfig` extension struct (in `bottlecap/src/config/mod.rs`, alongside the existing legacy code) that implements the upstream `ConfigExtension` trait, plus a `LambdaConfigSource` deserialization shape that figment uses for both env-var and YAML loading (dual extraction). Nothing in bottlecap consumes the extension yet — the existing `bottlecap::config::Config` struct is untouched. The follow-up DataDog#1251 (stacked on this) replaces it with `Config<LambdaConfig>`, deletes the duplicated env.rs / yaml.rs / deserializer modules, and removes the legacy `#[macro_export]` `merge_*` macros at the top of `mod.rs` (`LambdaConfig::merge_from` deliberately uses fully-qualified upstream macro paths today to coexist with them). ### Why this shape The upstream crate is purpose-built for this migration — see PR DataDog/serverless-components#111 ("ConfigExtension trait") which landed exactly the extensibility hook we need. Each consumer (bottlecap here, future serverless agents elsewhere) supplies its own extension type for fields that don't generalize, while sharing one canonical implementation for all the core agent fields (site, api_key, logs/APM/OTLP/proxy/trace propagation, etc.). ### Fields in the extension The 19 Lambda-specific fields that have no upstream equivalent: - `api_key_secret_arn`, `kms_api_key`, `api_key_ssm_arn`, `api_key_secret_reload_interval` - `serverless_logs_enabled` (OR-merged with the `DD_LOGS_ENABLED` alias) - `serverless_flush_strategy` (custom `FlushStrategy` deserializer for `"end" | "end,N" | "periodically,N" | "continuously,N"`) - `enhanced_metrics`, `lambda_proc_enhanced_metrics` - `capture_lambda_payload`, `capture_lambda_payload_max_depth` - `compute_trace_stats_on_extension`, `span_dedup_timeout` - `dd_org_uuid` (sourced from `DD_ORG_UUID`, source field `org_uuid` → config field `dd_org_uuid`) - `serverless_appsec_enabled`, `appsec_rules`, `appsec_waf_timeout` - `api_security_enabled`, `api_security_sample_delay` - `custom_metrics_exclude_tags` (sourced from `DD_LAMBDA_CUSTOMER_METRICS_EXCLUDE_TAGS` / `lambda_customer_metrics_exclude_tags:` in YAML) Kept in the extension rather than upstreamed because they're Lambda-runtime concerns. `custom_metrics_exclude_tags` is arguably generalizable to other serverless targets but stays here for now; we can migrate it upstream when another consumer needs it. ### Pre-requisites that already merged - DataDog/serverless-components#135 — bumps libdatadog rev across all serverless-components crates from `0a3304c` to `48da0d8` to match bottlecap. - DataDog/serverless-components#136 — switches `datadog-agent-config`'s libdd transitive deps to `default-features = false` and exposes `https` / `fips` opt-in features. Without this, the FIPS dep tree was poisoned by an implicit `https` (ring) path. Bottlecap pins all three serverless-components crates (`dogstatsd`, `datadog-fips`, `datadog-agent-config`) to the merge SHA `bb4dedee` so cargo deduplicates `dogstatsd`. ## Testing 37 new tests in `bottlecap/src/config/mod.rs::lambda_config_tests` cover each extension field from both env vars and YAML where applicable, plus: - Per-field env round-trip (`api_key_secret_arn`, `kms_api_key`, `api_key_ssm_arn`, …) - YAML coverage for the two source-to-config renames: `org_uuid` → `dd_org_uuid` and `lambda_customer_metrics_exclude_tags` → `custom_metrics_exclude_tags` - `DD_LOGS_ENABLED` ↔ `DD_SERVERLESS_LOGS_ENABLED` OR-merge semantics - `FlushStrategy` — `"end"`, `"end,N"` (`EndPeriodically`), `"periodically,N"`, `"continuously,N"`, invalid → `Default` - Duration parsing — seconds, microseconds, `_ignore_zero` variant - env precedence over YAML - Forgiving fallback when a single field is malformed (default preserved instead of failing the whole extraction) ``` $ cargo test --lib config::lambda_config_tests test result: ok. 37 passed; 0 failed; 0 ignored ``` Existing bottlecap config behavior is unchanged (this PR adds; it doesn't replace yet). ## Follow-up - DataDog#1251 — stacked on this branch — does the actual wire-in: replaces `bottlecap::config::Config` with `Config<LambdaConfig>`, deletes the duplicated config files, and removes the legacy `#[macro_export]` macros at the top of `mod.rs`.
…aConfig> (DataDog#1251) ## Overview Stacked on top of DataDog#1249. Completes the migration to the shared `datadog-agent-config` crate: `bottlecap::config::Config` is now a type alias for `datadog_agent_config::Config<LambdaConfig>`, Lambda-specific fields live under `.ext`, and the 10 in-tree config submodules that duplicated upstream implementations are removed. ## Structural changes - `bottlecap/src/config/mod.rs` shrinks from **2243 → 602 lines**. The legacy `Config` struct, `ConfigBuilder`, `ConfigSource`, `ConfigError`, the `#[macro_export]` `merge_*` macros, all per-field deserializer helpers, and the test module that mirrored upstream's behavior — all gone. What remains: a `type Config` alias, a `get_config(path)` wrapper, the `LambdaConfig` extension itself (from the parent PR), and re-exports of upstream modules under the same `crate::config::*` paths so existing imports keep working. - New module **`bottlecap/src/config/propagation_wrapper.rs`** holds a newtype `PropConfig(Arc<Config>)` so we can implement the foreign `PropagationConfig` trait on the foreign `Config<E>` type without tripping Rust's orphan rule. The wrapper is scoped to the dd-trace-rs propagator boundary — nothing else uses it. - `bottlecap/src/traces/propagation/mod.rs` wraps the inner propagator in `PropConfig` instead of passing `Config` directly. All call sites that previously handed `Arc<Config>` to the propagator are unchanged — the wrapping happens inside `DatadogCompositePropagator::new`. - **Deleted files** (each redundant with upstream): - `additional_endpoints.rs`, `apm_replace_rule.rs`, `env.rs`, `flush_strategy.rs`, `log_level.rs`, `logs_additional_endpoints.rs`, `processing_rule.rs`, `service_mapping.rs`, `trace_propagation_style.rs`, `yaml.rs` - **~70 field-access sites** referencing Lambda-specific fields (`config.api_key_secret_arn`, `config.serverless_logs_enabled`, `config.enhanced_metrics`, etc.) updated to read through `config.ext.X`. Test struct literals that constructed `Config { ... }` with Lambda fields now nest them under `ext: LambdaConfig { ..., ..Default::default() }`. ## What stays the same - `LambdaConfig` itself (and its 33 tests) — already shipped in the parent PR; no behavior change in this commit. - All other tests pass: **501 lib + 5 integration tests green**. - The `.ext` indirection is invisible to callers that hold an `Arc<Config>` thanks to Rust's field-access auto-deref — they just go from `config.foo` to `config.ext.foo` for the 19 Lambda fields. ## Testing ``` $ cargo test --lib test result: ok. 501 passed; 0 failed; 0 ignored $ cargo test --tests test result: ok. (all integration suites green) ``` ## Follow-ups - Re-target this PR's base from `feat/use-datadog-agent-config-crate` to `main` once DataDog#1249 merges. - Optional: contribute `custom_metrics_exclude_tags` upstream so it becomes part of core `Config` rather than living in the Lambda extension (discussed in DataDog#1249).
…g#1246) ## What does this PR do? The usage-metrics monitoring loop polls `/proc` every 10ms and reads `/proc/{pid}/fd` for every PID each tick. When `read_dir` fails (e.g. `/proc/1/fd` is not readable by the extension), the existing code logged a `trace!` message per unreadable PID per tick. At ~40 ticks per invocation (tested with a Hello World golang function), a single persistently-unreadable PID produced ~40 trace messages per invocation (~4000 per 100 invocations). These failures are benign — a PID's `fd` directory may be unreadable while the process is otherwise alive (typically a permission issue). The other `/proc/{pid}` readers (`fd_max`, `threads_max`, `threads_use`) already fail silently with `continue`. This change makes `get_fd_use_data_from_path` consistent with that behavior by removing the trace logging and dropping the now-unused `trace` import. ## Motivation Observed ~4000 noisy log messages per 100 invocations when trace logging was enabled, making trace output unusable for debugging. ## Testing - `cargo build` — clean compile, no unused-import warnings - `cargo test proc` — all 8 proc tests pass, including `test_get_fd_use_data` - `cargo clippy` — clean ## Checklist - [x] PR description is filled out - [x] Tests pass Co-authored-by: Claude Opus 4.8 <[email protected]>
…_enabled) (DataDog#1267) ## Summary Bumps the \`datadog-agent-config\` / \`dogstatsd\` / \`datadog-fips\` pin to \`8ce37eb\`, which contains two recently-merged upstream features: - [serverless-components#137](DataDog/serverless-components#137) — adds \`Config::dd_org_uuid: String\` (\`DD_ORG_UUID\` / yaml \`org_uuid\`) - [serverless-components#138](DataDog/serverless-components#138) — adds \`Config::logs_enabled: bool\` (\`DD_LOGS_ENABLED\` / yaml \`logs_enabled\`) ## What changes in bottlecap ### dd_org_uuid Drops the now-redundant local copy from \`LambdaConfig\`: - \`LambdaConfig\`: removed \`dd_org_uuid: String\`. - \`LambdaConfigSource\`: removed \`org_uuid: Option<String>\` and the \`merge_string!(self, dd_org_uuid, source, org_uuid)\` source-to-config renaming call in \`merge_from\`. - Consumers (\`secrets/decrypt.rs\`, \`secrets/delegated_auth/client.rs\`) switch from \`config.ext.dd_org_uuid\` → \`config.dd_org_uuid\`. - Tests assert on the upstream field. ### logs_enabled The lambda extension's existing OR-merge contract for log shipping is preserved **exactly**. The legacy semantics are: | \`DD_SERVERLESS_LOGS_ENABLED\` | \`DD_LOGS_ENABLED\` | resolved \`serverless_logs_enabled\` | |---|---|---| | unset | unset | **true** (default kept) | | any | true | true | | true | any | true | | false | false | false | | **unset** | **false** | **false** (alias alone can override default) | | false | unset | false | To preserve "was \`DD_LOGS_ENABLED\` explicitly set?" the alias source field is **retained** on \`LambdaConfigSource\` and the OR-merge in \`merge_from\` is kept. The upstream parsing of the same env var into \`config.logs_enabled\` runs in parallel — that field exists for any non-lambda consumer of the crate, but the lambda extension continues to gate log shipping on \`config.ext.serverless_logs_enabled\`. A regression test was added for the alias-only-false case (the trickiest invariant), so a future refactor that breaks it fails loudly. ## Why two PRs in one Both upstream PRs are merged and \`8ce37eb\` contains them as a single SHA. Bundling lets us bump once and avoid a transitional state where main is pinned to a SHA that has \`logs_enabled\` upstream but the lambda extension's source field still aliases it. ## Test plan - [x] \`cargo test --workspace --features default\` — all pass (lambda_config_tests now at 40, +2 for the new logs_enabled coverage) - [x] \`cargo clippy --workspace --all-targets --features default\` — clean - [x] \`cargo fmt -- --check\` — clean - [x] Regression test \`logs_enabled_alias_only_false_overrides_default\` exercises the invariant that \`DD_LOGS_ENABLED=false\` alone disables logs (overriding the default-true) - [x] No behavior change for customers — same env vars, same resolved field at lambda call sites
…#1269) ## Overview Fixes high-severity advisory [RUSTSEC-2026-0185](https://rustsec.org/advisories/RUSTSEC-2026-0185): *Remote memory exhaustion in quinn-proto from unbounded out-of-order stream reassembly*. Solution per the advisory is to upgrade to `>= 0.11.15`. `quinn-proto` is pulled in transitively via `reqwest -> quinn -> quinn-proto` across multiple workspace crates (`bottlecap`, `dogstatsd`, `datadog-fips`, `libddwaf`, `datadog-agent-config`). This blocks the v98 release — `cargo audit` is failing CI on `main`. `cargo audit` after the bump shows zero vulnerabilities; the remaining entries are pre-existing unmaintained-crate warnings (async-std, buf_redux, multipart, rustls-pemfile, safemem, twoway). ## Testing - `cargo audit` no longer reports a vulnerability.
## Overview Bump extension version to `98-next` in preparation for the v98 release. ## Testing No functional change.
…ck prefix (DataDog#1287) ## Overview Integration-suite deploys intermittently fail at `cdk deploy` (before any test runs) because of resource conflict. On some retries, the previous run resources were not cleaned up correctly. ## Fix * Include `CI_JOB_ID` in the identifier so every attempt gets unique names and there won't be resource conflict. * Also shorted 'integ' to 'it' so we are less likely to hit the 64 character limit on cdk resources names. Note - The integration tests are failing due to 429 error, too many requests. Will address this in follow up PR.
… 429s (DataDog#1288) ## Overview The integration tests intermittently fail due to not fetching telemetry data from Datadog due to 429, rate limit exceeded. This PR adds retries for fetching telemetry data. Since we are now retrying, the total time of a test might increase. So, this PR also increase the test timeout from 15 minutes to 30 minutes.
…og#1276) **Jira:** [SVLS-9380](https://datadoghq.atlassian.net/browse/SVLS-9380) (H1) · epic [SVLS-9378](https://datadoghq.atlassian.net/browse/SVLS-9378) ## What Switch the non-FIPS `default` feature from `reqwest/rustls-tls-native-roots` to `reqwest/rustls-tls-webpki-roots`. This removes the `rustls_native_certs::load_native_certs()` filesystem cert scan that ran on **every** `reqwest::Client::build()` — i.e. on the cold-start path for all three init reqwest clients (register in `main.rs`, shared flush in `http.rs`, secrets-decrypt in `secrets/decrypt.rs`). Cold-start hypothesis H1. FIPS builds are unchanged (keep native roots). ## Trade-off webpki trusts only the public Mozilla root bundle, so private/internal OS-installed CAs are no longer trusted implicitly. Affected setups (e.g. a TLS-intercepting `DD_PROXY_HTTPS`) supply the CA via `DD_TLS_CERT_FILE` (still layers on top of webpki) or use `DD_SKIP_SSL_VALIDATION`. Datadog public intake chains to public roots, so the default path is unaffected. ## Tested & verified - **Hermetic TLS tests** (`src/http.rs`): `tls_cert_file` trusts a private CA on top of webpki; webpki alone rejects it without the cert file; `skip_ssl_validation` escape hatch works; `load_custom_cert` parsing (single / multiple / empty / non-PEM). - **CI feature-graph guard** (`scripts/verify_tls_root_features.sh` + job): default build stays on webpki (no native-cert scan), FIPS stays on native roots — catches silent feature-graph drift. - **`cargo --unit-graph`**: native-cert scan is gone from all three reqwest clients' runtime path (native-roots survives only in a build-script dep); FIPS feature graph unchanged. - All GitHub Actions green (clippy `default` + `fips`, test, build, license, audit, the new TLS Root Features job). ## Not doing (by design) - **Secrets/AWS client** (`secrets/decrypt.rs` — KMS/SM/SSM/STS): intentionally keeps default roots, no proxy / `tls_cert_file` / `skip_ssl_validation`. These are direct AWS control-plane calls that chain to public AWS CAs; `DD_PROXY_HTTPS`/`tls_cert_file` are for Datadog egress; and we deliberately don't disable cert validation on credential/secret fetches. Only a fully air-gapped setup intercepting AWS traffic with a private CA would be affected — those should use VPC endpoints (public certs). Documented in code; revisit only on a real report. - **Trace client** (`traces/http_client.rs`, hyper/libdd-common): keeps native roots via its own trust path — out of scope here. ## Before all-region rollout Verify GovCloud / dedicated-region intake certs chain to the webpki bundle (deferred real-endpoint canary). [SVLS-9380]: https://datadoghq.atlassian.net/browse/SVLS-9380?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ [SVLS-9378]: https://datadoghq.atlassian.net/browse/SVLS-9378?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
smithclay
approved these changes
Jul 1, 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.
Please include Jira ticket in title.
Overview
Testing