Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
01ff786
[test optimization] Fix cypress attempt to fix (#7767)
juan-fernandez Mar 16, 2026
4a608e1
[test optimization] Fix attempt to fix in vitest (#7785)
juan-fernandez Mar 16, 2026
07d9114
[test optimization] Fix attempt to fix in mocha parallel mode (#7772)
juan-fernandez Mar 16, 2026
7edde03
test: clarify intended span processor unit test behaviour (#7781)
ida613 Mar 16, 2026
8523e34
[test optimization] Improve gatherPayloadsMaxTimeout error reporting …
juan-fernandez Mar 16, 2026
787d215
[test optimization] Fix TIA in parallel mocha (#7773)
juan-fernandez Mar 16, 2026
c7a7814
[test optimization] Minor jest clean up (#7777)
juan-fernandez Mar 16, 2026
53c35b3
feat(process-tags): Propagate Service Naming Context via Process Tags…
pabloerhard Mar 16, 2026
a80f427
chore: fix many folders created in root for codecov and nyc (#7790)
rochdev Mar 16, 2026
822de05
test: initialize processTags in runtime metric tests (#7793)
pabloerhard Mar 16, 2026
894f943
Port community PR (#7796)
BridgeAR Mar 16, 2026
71962bd
feat(llmobs): Add support for LangGraph (#7567)
crysmags Mar 17, 2026
25ae42b
chore(deps): bump openai (#7801)
dependabot[bot] Mar 17, 2026
cc94a60
Revert "Revert "chore: vendor on npm prepare instead of committing to…
rochdev Mar 17, 2026
018ea03
[test optimization] Add missing features to cucumber parallel mode (…
juan-fernandez Mar 17, 2026
c6d711c
fix(ci): switch Kafka from native to JVM image to prevent SIGILL cras…
bm1549 Mar 17, 2026
85df2ff
fix(profiling): stale ProfilingContext cache causing missing trace en…
szegedi Mar 17, 2026
97e1c7d
Add _dd.p.ksr propagated tag for Knuth sampling rate (#7741)
bm1549 Mar 17, 2026
9fc0344
demangle crashes stack traces (#7791)
rochdev Mar 17, 2026
fb9565c
Fix `vitest@4.1.0` release (#7804)
juan-fernandez Mar 17, 2026
305e6fc
ci: fix npm prepare when node env is set to production (#7805)
rochdev Mar 17, 2026
83e388a
chore(deps-dev): bump the dev-minor-and-patch-dependencies group acro…
dependabot[bot] Mar 18, 2026
e42d100
chore(deps): bump the gh-actions-packages group across 2 directories …
dependabot[bot] Mar 18, 2026
31b977d
chore(deps): bump the vendor-minor-and-patch-dependencies group acros…
dependabot[bot] Mar 18, 2026
1026e52
chore(deps-dev): bump @rspack/core from 1.7.5 to 1.7.8 in /vendor (#7…
dependabot[bot] Mar 18, 2026
2c271c5
chore(deps): bump oxc-parser (#7812)
dependabot[bot] Mar 18, 2026
8e4ceb9
ci: remove obsolete `ref_protected` from STS trust policies (#7676)
d-niu Mar 18, 2026
72fdb45
v5.91.0
rochdev Mar 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/chainguard/release-proposal.sts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ subject: repo:DataDog/dd-trace-js:ref:refs/heads/master
claim_pattern:
event_name: (workflow_dispatch|schedule)
ref: refs/heads/master
ref_protected: "true"
job_workflow_ref: DataDog/dd-trace-js/.github/workflows/release-proposal.yml@refs/heads/master

permissions:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/apm-integrations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ jobs:
runs-on: ubuntu-latest
services:
kafka:
image: apache/kafka-native:3.9.1
image: apache/kafka:3.9.1
env:
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_NODE_ID: "1"
Expand Down Expand Up @@ -607,7 +607,7 @@ jobs:
runs-on: ubuntu-latest
services:
kafka:
image: apache/kafka-native:3.9.1
image: apache/kafka:3.9.1
env:
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_NODE_ID: "1"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/appsec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,7 @@ jobs:
runs-on: ubuntu-latest
services:
kafka:
image: apache/kafka-native:3.9.1
image: apache/kafka:3.9.1
env:
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_NODE_ID: "1"
Expand Down
313 changes: 2 additions & 311 deletions .github/workflows/dependabot-automation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,10 @@ env:
GROUPS: '["dev-minor-and-patch-dependencies", "gh-actions-packages", "test-versions"]'

jobs:
dependabot:
if: github.event.pull_request.user.login == 'dependabot[bot]'
runs-on: ubuntu-latest
# Keep this job as a stable, always-green check on Dependabot PRs, even when the workflow is
# re-triggered by an automation commit (e.g., vendoring). Sensitive operations (OIDC token mint,
# approving, enabling auto-merge) are delegated to `dependabot-automation` below.
permissions:
contents: read
steps:
- name: Status
run: |
echo "Dependabot PR detected."
if [ "${{ github.actor }}" = "dependabot[bot]" ]; then
echo "Automation steps will run in the 'dependabot-automation' job."
else
echo "Skipping automation: workflow actor is '${{ github.actor }}'."
fi

dependabot-automation:
# Only run automation on the initial Dependabot-triggered run. If an automation commit is pushed
# (e.g. vendor output), GitHub re-triggers this workflow with `github.actor == 'dd-octo-sts[bot]'`.
# We intentionally avoid minting tokens / approving / enabling auto-merge on that follow-up run.
# GitHub re-triggers this workflow with `github.actor == 'dd-octo-sts[bot]'`. We intentionally
# avoid minting tokens / approving / enabling auto-merge on that follow-up run.
if: github.event.pull_request.user.login == 'dependabot[bot]' && github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
permissions:
Expand Down Expand Up @@ -61,294 +43,3 @@ jobs:
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ steps.octo-sts.outputs.token }}

vendor-build:
if: github.event.pull_request.user.login == 'dependabot[bot]'
runs-on: ubuntu-latest
# Security: this job checks out and runs code from the PR (vendoring build),
# so it is intentionally restricted to read-only permissions and produces a
# patch artifact instead of pushing directly.
permissions:
contents: read
pull-requests: read
outputs:
has_changes: ${{ steps.diff.outputs.has_changes }}
is_vendor_group: ${{ steps.ctx.outputs.is_vendor_group }}
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@21025c705c08248db411dc16f3619e6b5f9ea21a # 2.5.0
- name: Compute vendor context
id: ctx
run: |
set -euo pipefail

echo "is_vendor_group=${{ steps.metadata.outputs.directory == '/vendor' }}" >> $GITHUB_OUTPUT
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
if: steps.ctx.outputs.is_vendor_group == 'true'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 1
persist-credentials: false
- name: Restore trusted Node setup actions
if: steps.ctx.outputs.is_vendor_group == 'true'
run: |
git fetch --no-tags --depth=1 origin "${{ github.event.pull_request.base.sha }}"
git checkout "${{ github.event.pull_request.base.sha }}" -- .github/actions/node
- name: Restore trusted vendoring scripts
if: steps.ctx.outputs.is_vendor_group == 'true'
run: |
git fetch --no-tags --depth=1 origin "${{ github.event.pull_request.base.sha }}"
git checkout "${{ github.event.pull_request.base.sha }}" -- vendor/rspack.js vendor/rspack.config.js
- uses: ./.github/actions/node/active-lts
if: steps.ctx.outputs.is_vendor_group == 'true'
- name: Install vendoring deps (no lifecycle scripts)
if: steps.ctx.outputs.is_vendor_group == 'true'
run: yarn --ignore-scripts --frozen-lockfile --non-interactive
working-directory: ./vendor
- name: Build vendored bundles (trusted script)
if: steps.ctx.outputs.is_vendor_group == 'true'
run: node ./rspack.js
working-directory: ./vendor
- name: Create patch (restricted paths only)
id: diff
run: |
set -euo pipefail

if [ "${{ steps.ctx.outputs.is_vendor_group }}" != "true" ]; then
echo "has_changes=false" >> $GITHUB_OUTPUT
exit 0
fi

if git diff --quiet; then
echo "has_changes=false" >> $GITHUB_OUTPUT
exit 0
fi

allowed_prefix_1="vendor/dist/"
allowed_file_1="vendor/package.json"
allowed_file_2="vendor/yarn.lock"

bad=0
while IFS= read -r file; do
case "$file" in
"$allowed_file_1" | "$allowed_file_2" | "$allowed_prefix_1"*)
;;
*)
echo "Unexpected changed path: $file"
bad=1
;;
esac
done < <(git diff --name-only)

if [ "$bad" -ne 0 ]; then
echo "Refusing to proceed: unexpected paths changed during vendoring."
exit 1
fi

git diff --binary --no-color > "${RUNNER_TEMP}/vendor.patch"
echo "has_changes=true" >> $GITHUB_OUTPUT
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: steps.diff.outputs.has_changes == 'true'
with:
name: vendor-patch
path: ${{ runner.temp }}/vendor.patch
if-no-files-found: error

vendor-push:
if: github.event.pull_request.user.login == 'dependabot[bot]' && needs.vendor-build.outputs.is_vendor_group == 'true' && needs.vendor-build.outputs.has_changes == 'true'
runs-on: ubuntu-latest
needs: vendor-build
# Security: this job never runs installs/builds.
# It only applies the vetted patch artifact and writes the update via the GitHub API.
permissions:
id-token: write
steps:
- uses: DataDog/dd-octo-sts-action@acaa02eee7e3bb0839e4272dacb37b8f3b58ba80 # v1.0.3
id: octo-sts
with:
scope: DataDog/dd-trace-js
policy: dependabot-automation
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@21025c705c08248db411dc16f3619e6b5f9ea21a # 2.5.0
with:
github-token: "${{ steps.octo-sts.outputs.token }}"
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
token: ${{ steps.octo-sts.outputs.token }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.sha }}
persist-credentials: false
- uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
with:
name: vendor-patch
path: ${{ runner.temp }}/vendor-artifact
- name: Apply patch
run: git apply --whitespace=nowarn "${{ runner.temp }}/vendor-artifact/vendor.patch"
- name: Validate changed paths
run: |
set -euo pipefail

allowed_prefix_1="vendor/dist/"
allowed_file_1="vendor/package.json"
allowed_file_2="vendor/yarn.lock"

bad=0
while IFS= read -r file; do
case "$file" in
"$allowed_file_1" | "$allowed_file_2" | "$allowed_prefix_1"*)
;;
*)
echo "Unexpected changed path after applying patch: $file"
bad=1
;;
esac
done < <(git diff --name-only)

if [ "$bad" -ne 0 ]; then
echo "Refusing to proceed: unexpected paths changed."
exit 1
fi
- name: Create verified commit via GitHub API (server-side)
env:
TARGET_BRANCH: ${{ github.event.pull_request.head.ref }}
GH_TOKEN: ${{ steps.octo-sts.outputs.token }}
run: |
set -euo pipefail

repo="${GITHUB_REPOSITORY}"
expected_head_oid="$(git rev-parse HEAD)"

max_files=200
max_total_bytes=$((10 * 1024 * 1024)) # 10 MiB

mapfile -t changes < <(git diff --name-status)
change_count="${#changes[@]}"
if [ "$change_count" -eq 0 ]; then
echo "No changed files detected."
exit 1
fi
if [ "$change_count" -gt "$max_files" ]; then
echo "Too many changed files ($change_count > $max_files)."
exit 1
fi

additions_file="${RUNNER_TEMP}/vendor-additions.ndjson"
deletions_file="${RUNNER_TEMP}/vendor-deletions.ndjson"
encoded_file="${RUNNER_TEMP}/vendor-file.base64"
: > "$additions_file"
: > "$deletions_file"
total_bytes=0
for change in "${changes[@]}"; do
read -r status path path2 <<<"$change"

if [[ "$status" == D ]]; then
jq -nc --arg path "$path" '{path: $path}' >> "$deletions_file"
continue
fi

# Treat renames as delete+add to keep the server-side tree in sync.
if [[ "$status" == R* ]]; then
jq -nc --arg path "$path" '{path: $path}' >> "$deletions_file"
path="$path2"
fi

test -f "$path"
file_bytes="$(stat -c '%s' "$path")"
total_bytes=$((total_bytes + file_bytes))
if [ "$total_bytes" -gt "$max_total_bytes" ]; then
echo "Total changes too large (${total_bytes} bytes)."
exit 1
fi

base64 -w 0 "$path" > "$encoded_file"
jq -nc --arg path "$path" --rawfile contents "$encoded_file" \
'{path: $path, contents: $contents}' >> "$additions_file"
done

variables_file="${RUNNER_TEMP}/graphql-variables.json"
jq -n \
--arg repo "$repo" \
--arg branch "$TARGET_BRANCH" \
--arg msg "update vendored dependencies with new versions" \
--arg expected "$expected_head_oid" \
--slurpfile additions "$additions_file" \
--slurpfile deletions "$deletions_file" \
'{
input: {
branch: { repositoryNameWithOwner: $repo, branchName: $branch },
message: { headline: $msg },
expectedHeadOid: $expected,
fileChanges: { additions: $additions, deletions: $deletions }
}
}' > "$variables_file"

query='mutation($input: CreateCommitOnBranchInput!) { createCommitOnBranch(input: $input) { commit { oid url } } }'
request_file="${RUNNER_TEMP}/graphql-request.json"
jq -n \
--arg query "$query" \
--slurpfile variables "$variables_file" \
'{query: $query, variables: $variables[0]}' > "$request_file"

gh api graphql --input "$request_file" -q '.data.createCommitOnBranch.commit.oid' >/dev/null

# If branch protection is configured to dismiss stale approvals when new commits are pushed,
# the vendoring commit will invalidate the earlier approval. Re-approve and (re-)enable
# auto-merge after pushing so Dependabot PRs can still merge automatically.
- name: Approve a PR (after vendoring commit)
if: contains(fromJSON(env.GROUPS), steps.metadata.outputs.dependency-group)
run: gh pr review --approve "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ steps.octo-sts.outputs.token }}
- name: Enable auto-merge for Dependabot PRs (after vendoring commit)
if: contains(fromJSON(env.GROUPS), steps.metadata.outputs.dependency-group)
run: gh pr merge --auto --squash "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ steps.octo-sts.outputs.token }}

vendor-validate:
# Run validation after the generated vendor patch has been pushed, to ensure the PR contains
# the committed `vendor/dist/*` outputs. This runs inside the same workflow as the push, so it
# doesn't rely on additional workflows being triggered by that push.
if: github.event.pull_request.user.login == 'dependabot[bot]' && needs.vendor-build.outputs.is_vendor_group == 'true' && needs.vendor-build.outputs.has_changes == 'true'
runs-on: ubuntu-latest
needs:
- vendor-build
- vendor-push
permissions:
contents: read
pull-requests: read
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.ref }}
fetch-depth: 1
persist-credentials: false
- name: Restore trusted Node setup actions
run: |
git fetch --no-tags --depth=1 origin "${{ github.event.pull_request.base.sha }}"
git checkout "${{ github.event.pull_request.base.sha }}" -- .github/actions/node
- name: Restore trusted vendoring scripts
run: |
git fetch --no-tags --depth=1 origin "${{ github.event.pull_request.base.sha }}"
git checkout "${{ github.event.pull_request.base.sha }}" -- vendor/rspack.js vendor/rspack.config.js
- uses: ./.github/actions/node/active-lts
# Running `yarn` also automatically runs Rspack as a postinstall script.
- run: yarn --frozen-lockfile
working-directory: vendor
- name: Ensure no untracked outputs
run: |
set -euo pipefail

if [ -n "$(git status --porcelain)" ]; then
echo "Working tree is dirty after vendoring:"
git status --porcelain
exit 1
fi
- name: Diff only expected paths
run: git diff --exit-code -- vendor/dist vendor/package.json vendor/yarn.lock
10 changes: 10 additions & 0 deletions .github/workflows/llmobs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -240,3 +240,13 @@ jobs:
if: "!cancelled()"
with:
dd_api_key: ${{ secrets.DD_API_KEY }}

langgraph:
runs-on: ubuntu-latest
env:
PLUGINS: langgraph
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./.github/actions/plugins/test
with:
dd_api_key: ${{ secrets.DD_API_KEY }}
Loading
Loading