Conversation
Prepare `develop` for the next minor release. - bump version `2.0.1` → `2.1.0` - add `## Version 2.1.0 - tbd` changelog skeleton (Added / Changed / Fixed) Feature PRs merging into `develop` add their bullet under this section; the date is set when `develop` → `main` is promoted.
Add `develop` to the CI workflow's `push` and `pull_request` branch triggers so PRs into `develop` (the new integration branch) get lint + the test matrix. `main` triggers unchanged. HANA remains `workflow_dispatch`-only.
SummaryThe following content is AI-generated and provides a summary of the pull request: Release:
|
There was a problem hiding this comment.
This is a clean, minimal release-preparation PR. The only thing to address before merging to main is trimming the empty changelog sub-sections (### Added, ### Changed, ### Fixed) that have no entries — leaving them in would result in bare headings in the published changelog.
PR Bot Information
Version: 1.29.18
- LLM:
anthropic--claude-4.6-sonnet - Correlation ID:
fd848e30-9239-11f1-802e-ae2522cdec59 - Event Trigger:
pull_request.opened - File Content Strategy: Full file content
| ### Added | ||
|
|
||
| ### Changed | ||
|
|
||
| ### Fixed |
There was a problem hiding this comment.
Best Practices: Empty changelog sub-sections will be published as-is if merged without content.
The ### Added, ### Changed, and ### Fixed headers under ## Version 2.1.0 are currently empty placeholders. Before merging into main, any sub-section that has no entries should be removed so the published changelog doesn't contain bare headings with nothing beneath them. Consider removing the unused sub-sections as part of the final merge preparation.
| ### Added | |
| ### Changed | |
| ### Fixed | |
| ### Changed |
Double-check suggestion before committing. Edit this comment for amendments.
Please provide feedback on the review comment by checking the appropriate box:
- 🌟 Awesome comment, a human might have missed that.
- ✅ Helpful comment
- 🤷 Neutral
- ❌ This comment is not helpful
## Problem
Cloud SDK v4 exposes `executeHttpRequest` /
`executeHttpRequestWithOrigin` as **getter-only properties**. The plugin
patched them with plain assignment, which silently fails on a getter —
so the Cloud SDK outbound path (CAP's default when
`@sap-cloud-sdk/http-client` is installed) produced **no CLIENT span**
and no `sap.btp.destination`.
## Fix
Patch via `Object.defineProperty(cloudSDK, name, { value, writable:
true, configurable: true })` — `writable`/`configurable` keep the
exports re-patchable. Verified the wrapper now fires end-to-end.
## Tests
- `test/tracing-remote-cloudsdk.test.js` — Cloud SDK path: asserts a
`@cap-js/telemetry` CLIENT span with `sap.btp.destination`, and no
undici span.
- `test/tracing-remote-native.test.js` — native-fetch path: asserts the
span comes from `@opentelemetry/instrumentation-undici` (not `-http`)
with `http.*`/`url.*`/`server.*` attributes.
Both drive a real local HTTP call; gated on `cds.version >= 9`.
Changelog updated.
---------
Co-authored-by: sjvans <sjvans@users.noreply.github.com>
Add `target-branch: 'develop'` to both dependabot update entries (npm + github-actions) so dependency-bump PRs open against `develop` instead of the default branch (`main`). They then promote to `main` via the reviewed `develop → main` PR, like every other change.
…ucture (#465) ## Added Wraps `cds.Service.prototype.tx()` so the queue worker's two-transaction structure (tx1: SELECT+UPDATE lock, tx2: handle+DELETE dispatch) appears as coherent `<service> - tx` spans under the `cds.spawn - run task` root, instead of each top-level CAP call becoming an orphan root. Guarded so `$batch` sub-requests (active `EventContext`) are unaffected; file-based messaging consumer delivery (bare `{}` context) still gets a root span. ## Test infrastructure Replaces fragile `cds.test.log()` regex assertions with a structured in-memory span exporter (`MyInMemorySpanExporter`) and `groupedByTrace()` / `rootSpans()` helpers. Rewrites the existing tracing suites and adds coverage for scheduled tasks, outboxed batch fan-out, and inbox/outbox messaging combinations. ## SQLite note Queue-worker suites skip on sqlite (published `@sap/cds` uses a `setTimeout` bypass, not `cds.spawn`) — verified on HANA in CI. Follow-up #467 removes the skips once the cds queue-spawn fix ships. Changelog updated. Targets `develop`.
Supersedes the #437 stash. Migrates the test runner jest → vitest. ## Why it's a clean win Vitest with `pool: 'forks'` + per-file isolation tears each test file's child process down when the file finishes — so the OTLP exporter's lingering handles die with the child, and **the suite exits cleanly with no `--forceExit`**. This is the same open-handle class that hangs jest (see #472/#466). Verified: exit 0, ~8s, no hang across repeated runs. ## Config (`vitest.config.mjs`) - `globals: true` — `describe/test/beforeEach/...` stay available, test bodies unchanged. - `pool: 'forks'`, `isolate: true`, `teardownTimeout: 1000` — the clean-exit mechanism (documented inline). - Ports the old `jest.config.js` HANA logic faithfully: default `testTimeout: 42000`; under `CI && HANA_DRIVER` → `include` restricted to `tracing-attributes` + `passport`, timeout ×10, `cds_requires_telemetry_tracing` set when `HANA_PROM`. Verified the subset selection. ## Changes - `package.json`: `test` → `vitest run --silent`; jest removed, vitest added. `jest.config.js` deleted. - 8 `jest.spyOn`/`jest.fn` → `vi.spyOn`/`vi.fn`. - 5 `beforeAll(done => …)` hooks → promise-returning (vitest treats a hook arg as a fixture). - `eslint.config.mjs`: test-files override declaring `vi` global. Lint clean. - Lockfile regenerated against public npm (0 internal-registry URLs). ##⚠️ Behavioral note — HTTP instrumentation disabled in the test app Under jest, OTel's `require-in-the-middle` http patching was **silently broken** by jest's module sandbox, so incoming HTTP SERVER spans never existed in tests (the existing `xtest` skips document this). Under vitest (real `require`) the instrumentation works and reparents trace trees, breaking several assertions. To keep this migration **behavior-neutral**, `test/bookshop/package.json` now sets `disableIncomingRequestInstrumentation` + `disableOutgoingRequestInstrumentation` on the http instrumentation — reproducing jest's effective environment. Consequence: the HTTP-instrumentation path stays untested (same blind spot as jest, now explicit config rather than an accident). **Follow-up issue filed to enable it and assert on the real incoming spans.** The tracing-attributes client-span assertions still pass because those spans come via undici / cloud-sdk, not instrumentation-http. ## Coordination Parallel PR #473 (prettier) touches `package.json` (additive) + lockfile. Lockfile will conflict — whichever merges second rebases. #473 excludes `jest.config.js` from formatting (this PR deletes it). ## Verified `npm run test` 53 pass / 14 skip, exit 0, ~8s, clean exit ×3 · `npm run lint` clean · HANA subset selection confirmed.
Supersedes the #438 oxfmt spike — adopts **oxfmt** (`0.63.0`, pinned) properly. ## Config (`.oxfmtrc.jsonc`) Based on the #438 spike, verified against the `lib/*.js` house style: `singleQuote`, `semi: false`, `printWidth: 120`, `tabWidth: 2`, `trailingComma: none`, `arrowParens: avoid`. `ignorePatterns` excludes `*.md`, `node_modules`, `package-lock.json`, `CHANGELOG.md`, and `jest.config.js` (see coordination). ## Scripts - `format` → `npx oxfmt` (write is oxfmt's default) - `format:check` → `npx oxfmt --check` No git hook / husky / lint-staged — CI `format:check` + scripts only (the intrusive hook from the #438 spike is intentionally not carried over). ## Commits (reviewable split) 1. `chore: add oxfmt formatter tooling` — config + scripts + devDep + lockfile + CI step 2. `chore: apply oxfmt formatting` — repo-wide reformat (11 files, line-wrapping only; verified non-semantic via `git diff -w`) ## eslint coexistence `@sap/cds/eslint.config.mjs` is `recommended` + `no-unused-vars`/`no-console` only (no stylistic rules) → no conflict. `npm run lint` stays green. ## CI One line added to the `lint` job in `ci.yml`: `npm run format:check`. ## Verified `npm run format:check` ✅ (56 files) · `npm run lint` (--max-warnings=0) ✅ · `npm run test` → 53 pass / 14 skip, exit 0 · lockfile resolved from public npm (0 internal-registry URLs). ## Coordination Parallel PR #474 (jest→vitest) deletes `jest.config.js` — this PR excludes it from formatting (0-line diff confirmed) so no collision. `package.json` change here is additive (scripts + devDep); lockfile will conflict with #474 — whichever merges second rebases.
… ConsoleMetricExporter (#479) ## What Consolidates all outbox/metrics test-quality work into one PR (formerly split as #479 + the stacked #480). - **In-memory metric reader** — `test/bookshop/lib/MyInMemoryMetricReader.js`, the metrics counterpart to `MyInMemorySpanExporter` (#465). Mirrors production **DELTA** temporality: SUM counters are accumulated across flushes into per-series running totals; GAUGE datapoints keep the latest absolute value. Wired via the `metrics-outbox`, `metrics-outbox-disabled`, and `metrics` profiles in `.cdsrc.json`. - **Outbox suites off console spying** — the three `metrics-outbox*.test.js` suites drop the `console.dir` spy and fixed `wait()` sleeps in favor of the reader + an `expectEventually()` force-flush polling helper (fails fast if the meter provider isn't wired). Folds in #445's polling approach. - **ConsoleMetricExporter unit test** — new `test/console-metric-exporter.test.js`, a pure unit test of the exporter's formatting (db.pool table, queue table, other single-vs-array, tenant variants, host-metrics aggregation, shutdown→FAILED), mirroring `console-span-exporter.test.js`. - **`metrics.test.js`** converted from scraping `cds.test.log()` output to asserting on the in-memory reader's datapoints. Metrics testing now mirrors the tracing side exactly: a to-console unit test **plus** in-memory-exporter–based integration tests. ## Why Follow-up to #465 (span test infra): eliminate console/log spying in the metrics suite and give `ConsoleMetricExporter` direct unit coverage. ## Review addressed - Bot review triaged: explicit `COUNTER_METRIC_NAMES` dispatch for `isCounter`; real wall-clock debounce in the multitenant test; isolation NOTE on the module-level singletons. - Dropped the unused debug-log silencer in the multitenant suite (never asserted). Kept the single-tenant `debugLog` mock — it backs a real `unknown service` assertion. Test-only change (no `lib/` change), so no CHANGELOG entry — consistent with #465/#474/#476. closes #478 Supersedes #445 and #480 (both folded in here) — I'll close them once this merges.
…-logs, #482) (#483) ## What Recreates dependabot #472 against `develop`, bumping the OTLP dev-dependency group to 0.221: - `@opentelemetry/exporter-metrics-otlp-grpc`: `^0.219` → `^0.221` - `@opentelemetry/exporter-metrics-otlp-proto`: `^0.219` → `^0.221` - `@opentelemetry/exporter-trace-otlp-grpc`: `^0.219` → `^0.221` - `@opentelemetry/exporter-trace-otlp-proto`: `^0.219` → `^0.221` - `@opentelemetry/instrumentation-host-metrics`: `^0.2.0` → `^0.4.0` - `@opentelemetry/instrumentation-runtime-node`: `^0.32.0` → `^0.34.0` ## The pin Adds a top-level `overrides` block pinning `@opentelemetry/sdk-logs` to `0.219.0`: ```json "overrides": { "@opentelemetry/sdk-logs": "0.219.0" } ``` `@opentelemetry/sdk-logs` 0.221 introduces an unbounded memory leak that OOM-crashes `test/logging.test.js` (heap climbs to ~3.8GB, crash after ~110s). Root-caused and tracked in #482. The pin keeps sdk-logs at 0.219 while everything else moves to 0.221, so `logging.test.js` behaves like `develop` again (passes in ~5s). Remove the pin once #482 is fixed. ## Verification - `test/logging.test.js`: passes in ~4.9s, exits promptly (no OOM/hang) - Full suite: 63 passed / 14 skipped, exits cleanly in ~7.4s - Lint (`eslint . --max-warnings=0`) + format (`oxfmt --check`): clean - Lock resolves sdk-logs to `0.219.0` while `exporter-trace-otlp-proto` is `0.221.0` — pin is surgical Supersedes #472. No CHANGELOG entry (dev-deps only). Refs #482.
…, §5) (#481) ## What Started as removing dead test exclusions for #477 (§2 cds<9 guards, §5 HANA CI test-subset). Removing the HANA subset surfaced HANA-only failures — including **two real production bugs** that the old 2-file subset had been masking — so this PR also fixes those. ### Production fixes (lib/) - **fix(tracing):** raw SQL leaked into HANA `INSERT` `prepare` span names. The name-normalization regex used `.` which doesn't match newlines, so HANA's multi-line `INSERT … WITH SRC AS (…)` SQL survived in the span name. Now uses `[\s\S]` so it's stripped to operation + table (matching SELECT); the SQL stays in `db.query.text`. - **fix(metrics):** `*_storage_time_in_seconds` gauges were skewed by the machine's UTC offset on HANA — HANA's `min()`/`max()` aggregates return timezone-naive timestamps that `new Date()` parsed as local time. Normalize to UTC before parsing. Both carry CHANGELOG `### Fixed` entries. ### Test-suite changes (§2/§5 + HANA robustness) - Remove all 8 dead `cds < 9` guards (§2) and the HANA CI 2-file test-subset (§5) so the full suite runs on HANA. - Convert queue/outbox span assertions to force-flush + poll (spans export after fixed waits on slower HANA); filter the outbox-scan trace primer out of the logging assertion; fix a lifecycle bug where a retry handler fired with an undefined counter. - **HANA CI config** (`vitest.config.mjs`, HANA-only): run files serially (all files share one HDI container vs sqlite's per-file in-memory DB), raise `hookTimeout`, HANA-only outbox settle in `afterAll`, and `retry: 2` for residual shared-remote-container timing variance. sqlite unchanged (retry:0, full parallelism). ### Skips (deviation from "no skips except passport" — conscious) - Multitenancy tests (`tracing-mt`, `metrics-outbox-multitenant`) **skip on HANA** with an explanatory comment: they need a bound BTP Service Manager for MTX tenant subscription, which the single pre-provisioned HDI container in CI doesn't provide. They still run fully on sqlite. This means multitenancy has no HANA coverage — acknowledged; can be revisited if the CI HANA setup gains MTX. ## Verification - sqlite: 63 passed / 14 skipped / 0 failed. - HANA (serial + retry:2): 64 passed / 6 skipped / 0 failed, stable across repeated runs (the 6 skips = 2 multitenancy + 4 pre-existing xtest/TODO in tracing.test.js). Refs #477 (§1 queue-worker sqlite skips remain, gated on the cds queue-spawn fix; §3 stubs pending).
# Chore: Clean Up Release Workflow ♻️ **Refactor**: Removed an outdated workaround comment from the release workflow. ### Changes * `.github/workflows/release.yml`: Removed the `# REVISIT: remove "npm explore better-sqlite3 -- npm run install" with cds^10` comment that was no longer relevant, cleaning up the release workflow configuration. - [ ] 🔄 Regenerate and Update Summary <details> <summary>PR Bot Information</summary> **Version:** `1.29.26` - Output Template: [Default Template](https://github.tools.sap/Code-Change-Intelligence/pr-bot/blob/main/src/services/llm/prompts/summary_default_output_template.md) - Summary Prompt: [Default Prompt](https://github.tools.sap/Code-Change-Intelligence/pr-bot/blob/main/src/services/llm/prompts/summary_instructions_prompt.md) - File Content Strategy: Full file content - Correlation ID: `8ac5e9d0-97bf-11f1-9e0b-c00ff05b9b1b` - LLM: `anthropic--claude-4.6-sonnet` - Event Trigger: `pull_request.opened` </details>
…unpin sdk-logs (#482) (#489) ## Problem Bumping the OTLP dev-deps to the `0.221` line pulled `@opentelemetry/sdk-logs` 0.219 → 0.221, which made `test/logging.test.js` OOM-crash (heap climbed to ~3.8 GB, ~110 s of GC thrashing before dying). #483 shipped an interim workaround pinning sdk-logs to `0.219.0` via a top-level `overrides` block. This PR removes that pin and fixes the actual defect. Closes #482. ## Root cause Two things combine: 1. **Constructor signature change (the real trigger).** In sdk-logs 0.221 the `SimpleLogRecordProcessor` and `BatchLogRecordProcessor` constructors changed from positional `(exporter)` to an options object `({ exporter })`. `lib/logging/index.js` still passed the exporter positionally (both the built-in path and the custom-processor path in `_getCustomProcessor`; the test's `MySimpleLogRecordProcessor` extends the SDK base and forwards its args). So `options.exporter` was `undefined`, and every emit called `core.internal._export(undefined, …)`, which throws. 2. **Diag re-entrancy loop.** The thrown export error hits `.catch(globalErrorHandler)` → `diag.error(...)`. Because `lib/index.js` wires `diag.setLogger(cds.log('telemetry'), …)`, that diagnostic goes back through `cds.log('telemetry')` → the overridden `cds.log.format` → `logger.emit()` → export throws again → … an unbounded loop. Each hop is a **microtask** (`processTicksAndRejections`), so the recursion is asynchronous. ## Fix - Construct the log processors with the `{ exporter }` options object 0.221 expects (built-in + custom-processor paths). This stops the export from throwing, which removes the source of the diag error loop — the OOM is gone. - Add a re-entrancy guard (`let emitting`) around `logger.emit()` in the `cds.log.format` interception: while inside our own `emit()` we still run the original format work (log output unchanged) but skip re-emitting. This is defense-in-depth against any **synchronous** re-entry through the export/diag path; `try/finally` guarantees the flag resets even if `emit()` throws. ## Unpin - Removed the `@opentelemetry/sdk-logs` `overrides` pin; regenerated the lockfile. sdk-logs now floats to `0.221.0`, matching the other OTLP deps. This removes the #483 workaround pin. ## Verification - `vitest run test/logging.test.js` — passes in ~1.3 s (was ~3.8 GB / ~110 s OOM crash on 0.221). The `logging.test.js` OOM was the repro; ran it repeatedly, stable. - Full sqlite suite: 63 passed / 14 skipped, no regressions. - eslint `--max-warnings=0` clean; `oxfmt --check` clean. - Lockfile: no internal-registry URLs; `npm ci` reproduces cleanly.
…er; drop tracing-attributes profile (#478) (#490) ## What Group 1 of #478. Converts the three tracing tests that still spied on `console.dir` to read structured `ReadableSpan` objects directly from the in-memory span exporter: - `test/tracing-remote-cloudsdk.test.js` - `test/tracing-remote-native.test.js` - `test/tracing-span-names.test.js` Each now uses `--profile tracing-in-memory` (which wires `MyInMemorySpanExporter` via `.cdsrc.json`) and reads over `captured` (the module-level array of `ReadableSpan`s) instead of the `console.dir` spy. `beforeEach(reset)` clears the buffer per test. All existing assertions are preserved verbatim — `instrumentationScope.name` filters (`@cap-js/telemetry`, `@opentelemetry/instrumentation-undici`), span names, and attributes (`code.function.name`, `db.query.text`, `sap.btp.destination`, the no-raw-SQL / no-URL-in-span-name checks). `captured` holds full ReadableSpans with `instrumentationScope`, so the filters just point at `captured`. No flush/poll was needed: the spans for these single request/DB ops appear synchronously in `captured` after the awaited call. In `tracing-span-names.test.js`, `data.reset()` is itself traced, so the buffer is cleared *after* reset (mirroring `tracing-attributes.test.js`). ## Why No more `console.dir` spying in the tracing tests. With all three files migrated, the `[tracing-attributes]` profile in `test/bookshop/.cdsrc.json` has no remaining consumers (verified: only these 3 used it; `tracing-attributes.test.js` despite its name already uses `tracing-in-memory`), so it is removed. This also resolves the deferred "rename tracing-attributes → tracing-console" note — the profile simply goes away. Test-only change. No lib change, no CHANGELOG. Refs #478 (group 1 only; group 2 done via #479, group 3 stays).
…ans + traceparent propagation (#475) (#491) ## What Re-enables HTTP instrumentation in the test app (disabled by #474 to stay behavior-neutral under jest) and asserts the incoming-request tracing behavior it produces. - **Test-app config** (`test/bookshop/package.json`): removed `disableIncomingRequestInstrumentation` / `disableOutgoingRequestInstrumentation` so both default to on; kept `ignoreIncomingRequestHook`. Incoming HTTP requests now produce a SERVER span (the root of each request trace) and outgoing requests produce CLIENT spans. - **`GET with traceparent is traced`** (was `xtest`): asserts the incoming SERVER span adopts the W3C context from the `traceparent` header — trace id `0af7651916cd43dd8448eb211c80319c`, parent span id `b7ad6b7169203331`. - **`instrumentation hooks`** (was empty `xtest`): asserts both suppression mechanisms — the sampler's `ignoreIncomingPaths` (`/odata/v4/admin/Authors`) and `MyIgnoreIncomingRequestHook` (`/Books(252)`) — produce NO incoming SERVER span, while a non-ignored path (`/Books`) does. - **`$batch is traced`**: updated for reparenting — the single `$batch` POST now yields ONE incoming SERVER root with both batch sub-operations (CREATE Genres draft, READ Genres) nested beneath it (was 2 roots). - **tracing-messaging CHECKs** (`without-outbox`, `inboxed`, `persistent-outbox`): the producer trace is now rooted at the incoming SERVER span (`AdminService - tx` nests under it), so the root assertion was updated from name `AdminService - tx` to `SpanKind.SERVER` while keeping the same nested-span assertions. ## Why The test's HTTP client runs in-process; with outgoing instrumentation now on, it would itself create a CLIENT span (an artificial extra root that also overwrites a manually-set `traceparent`). A shared `asExternalClient` helper runs client-side requests under `suppressTracing` to model a real external, un-instrumented caller — the outgoing CLIENT artifact is skipped and the genuine incoming SERVER span is the trace root. No `lib/` change (config + tests only). No CHANGELOG. ## Verification (sqlite) - `test/tracing.test.js` — 11 passed / 2 skipped (the 2 formerly-`xtest` now real + passing; `$batch` fixed; #477 §3 stubs remain skipped) - `test/tracing-remote-cloudsdk.test.js` + `test/tracing-remote-native.test.js` — pass (outgoing CLIENT instrumentation didn't break them) - Full suite — 65 passed / 12 skipped (was 63 / 14; the 2 newly-enabled tests moved skipped→passed) - lint + oxfmt clean; lockfile untouched ## HANA note `inboxed` and `persistent-outbox` messaging tests are HANA-only (skipped on sqlite) but share the same reparented producer-root assertion, so they were updated too — HANA CI must be verified on this PR. closes #475
## What
Extracts the six test helpers that had been copy-pasted across ~10 test
files into one shared module, `test/bookshop/lib/test-utils.js`:
- `flushSpans()` — unwrap the ProxyTracerProvider → delegate and
`forceFlush()`.
- `eventually(fn, { flush, timeout, interval })` — the unified
state-based poll. The span `eventually` and the metric
`expectEventually` were structurally identical, differing only in the
flush target + defaults, so they are now one function. `flush` defaults
to `flushSpans` (span callers); metric callers pass the reader's
`forceFlush` and their own timeout/interval.
- `clearOutbox(timeout = 5000)` — timeout-bounded `DELETE FROM
cds.outbox.Messages`.
- `asExternalClient(fn)` — runs `fn` under `suppressTracing`.
- `isOutboxScanTrace(g)` / `meaningful(groups)` — the outbox-scan-trace
filter, reconciled to a single `meaningful(groups)` signature.
## Why
These helpers landed independently during the HANA / instrumentation
work and drifted into ~10 near-identical copies. Centralizing them
removes the duplication (net -141 lines) and gives one place to maintain
the polling / flush / outbox-scan-filter logic.
## Notes
- **Behavior-preserving refactor** — no assertion changes, no
timeout/interval drift (each call site passes through its original
values), no predicate changes.
- Test-only. No `lib/**` change, no CHANGELOG (test-only), no dependency
change.
- `test-utils.js` stays dependency-light: it only requires
`@opentelemetry/api`, `@opentelemetry/core`, and `node:timers/promises`
— it does **not** `require('@sap/cds')` at module top (same rule that
protects the sibling exporters/reader). `clearOutbox` uses the global
`DELETE` provided by `cds.test()` at call time.
## Verification
- Full sqlite suite: **65 passed / 12 skipped** — matches the develop
baseline exactly.
- Per-file runs (metrics-outbox, metrics-outbox-multitenant, metrics,
tracing, tracing-messaging-without-outbox) all pass; the sqlite-gated
tracing files (outboxed-batch, scheduled) skip as before.
- eslint `--max-warnings=0` clean, `oxfmt --check` clean.
## HANA CI
Several affected files run **only on HANA** and share these helpers, so
they cannot be validated locally — please confirm HANA CI is green for:
- `test/tracing-scheduled.test.js`
- `test/tracing-messaging-inboxed.test.js`
- `test/tracing-messaging-persistent-outbox.test.js`
- `test/tracing-outboxed-batch.test.js`
(`test/tracing-messaging-without-outbox.test.js` does run on sqlite and
exercises the shared `meaningful`/`eventually` path — confirmed
passing.)
closes #488
…#486) (#493) ## What Replaces the load-order-fragile `process.env.cds_requires_*` / `process.env.cds_*` string-JSON test config with proper cds config: `.cdsrc.json` profiles (composed with `--profile`) and `cds.test()` args. Test-only + test-app-config change; no `lib/` change. ## Why Setting config via `process.env.cds_*` string-JSON at module top is load-order-sensitive: it must run before any `@sap/cds` require or it is silently ignored (the root of the removed `delete cds.env` hack). cds already supports the same config declaratively via `.cdsrc.json` profiles. Root cause of the old `// REVISIT: ... package.json wins` comments (why some config had to be done via env): cds loads config sources sequentially, `package.json` **after** `.cdsrc.json`, last-writer-wins. So a `.cdsrc.json` profile could never override a key that `package.json` set at its base. Fix: move those base defaults (`log.cls_custom_fields`, `messaging.kind`/`file`) from `test/bookshop/package.json` into `test/bookshop/.cdsrc.json` base, so the `.cdsrc.json` profiles (same source) win as intended. ## Sites moved to profiles (all 8 — zero `process.env.cds_*` remain) | Site | Was | Now | |---|---|---| | `logging.test.js` (cls_custom_fields, tracing.exporter:false) | `cds_log`, `cds_requires_telemetry_tracing` | `[logging]` profile (+ base moved out of package.json) | | `tracing.test.js` (sampler ignoreIncomingPaths) | `cds_requires_telemetry_tracing_sampler` | new `[sampler-ignore-authors]` profile, `--profile 'tracing-in-memory, sampler-ignore-authors'` | | `tracing-remote-native.test.js`, `tracing-attributes.test.js` (native_fetch) | `cds_remote_native__fetch` | new `[native-fetch]` profile (`remote.native_fetch: true`), `--profile 'tracing-in-memory, native-fetch'` | | `passport.test.js` (scheduling off) | `cds_requires_scheduling` | new `[no-scheduling]` profile, `cds.test(dir, '--profile', 'no-scheduling')` | | `tracing-messaging-{inboxed,persistent-outbox,without-outbox}.test.js` (messaging kind/file/flags) | `cds_requires_messaging` | existing `[inboxed]`/`[persistent-outbox]`/`[without-outbox]` profiles now fully carry it (messaging base moved out of package.json) | ## .cdsrc.json changes - Added base `requires.messaging` (local-messaging / msg-box) and `log.cls_custom_fields` (moved from package.json). - `[logging]`: added `requires.telemetry.tracing.exporter: false`. - New profiles: `[sampler-ignore-authors]`, `[native-fetch]`, `[no-scheduling]`. ## Verification - Full sqlite suite: **65 passed / 12 skipped** (identical to baseline, same skip set). - Each converted file passes individually on sqlite. - `grep -rn "process.env.cds_" test/` → none remain. - eslint (test/) + oxfmt clean; `grep -c int.repositories.cloud.sap package-lock.json` = 0. ## HANA CI caveat Profile changes are DB-agnostic, but these run on HANA and could only be validated for config equivalence locally (config resolves identically to the old env), not executed: `logging` (runs on both), and the HANA-only `tracing-messaging-inboxed` + `tracing-messaging-persistent-outbox`. HANA CI must validate them. No lib change. No behavior change. Closes #486
#494) ## What Consolidates the hard-won test-suite knowledge that was scattered (and duplicated) across `test/**` comment blocks into a single, authoritative top-level **`TESTING.md`**, then trims the duplicated in-file comments down to short pointers. **New `TESTING.md`** covers: - Running the tests (`npm test` / vitest, sqlite default; CI matrix Node 22/24 × cds 9/10; where the bookshop app lives) - sqlite vs HANA (per-file in-memory DB vs one shared HDI container, and the implications: serial file execution, raised timeouts, `retry: 2`, outbox clear/settle; how the HANA path is signalled via `TELEMETRY_TEST_HANA`; HANA is a separate `workflow_dispatch`-only workflow, not PR CI) - Config via `.cdsrc.json` profiles (not env) — the profile table + compose syntax + the #486 load-order gotcha (don't reintroduce `process.env.cds_*`) - In-memory test infrastructure (`MyInMemorySpanExporter` / `MyInMemoryMetricReader`, DELTA temporality, the no-`require('@sap/cds')`-at-top rule) - Shared test helpers (`test/utils.js` from #488) and the flush+poll pattern - HTTP instrumentation (#475) and why client requests are wrapped in `asExternalClient` - The only two sanctioned skips (#477): SAP Passport on sqlite; multitenancy on HANA — plus the #477-tracked debt skips - Known caveats (the `startup > NO_TELEMETRY=true` local-env artifact; the internal-registry lockfile trap) **Trimmed duplicated comments to pointers** (comment-only, no logic change) in: `tracing-scheduled`, `tracing-outboxed-batch`, `tracing-messaging-inboxed`, `tracing-messaging-persistent-outbox`, `tracing-messaging.js`, `tracing-mt`, `metrics-outbox-multitenant`. The repeated `cds.spawn on sqlite` skip rationale, the shared-HANA-container outbox-bleed explanation, and the multitenancy Service-Manager note now live in TESTING.md; each site keeps a one-line pointer. Genuinely local rationale (timezone-bug explanation, per-test tree shapes, `test/utils.js` own doc comments) is left untouched. **README** gets a one-line link to TESTING.md under the contributing section. ## Notes - No lib/behavior change. Test-file edits are **comment-only** (verified: every changed line in `test/**` starts with `//`). No change to test logic, assertions, config, `vitest.config.mjs`, `.cdsrc.json`, the exporters/reader, or the #477 gated skip logic. - Full sqlite suite unchanged: **65 passed / 12 skipped**. - `oxfmt --check` clean; changed files lint clean; `grep -c int.repositories.cloud.sap package-lock.json` = 0 (lockfile untouched). - No CHANGELOG entry (docs/test-only, not user-facing lib). closes #487
…ith 10 updates (#485) Bumps the dev-dependencies group with 10 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@cap-js/cds-test](https://github.com/cap-js/cds-test) | `1.0.1` | `1.0.2` | | [@opentelemetry/exporter-metrics-otlp-grpc](https://github.com/open-telemetry/opentelemetry-js) | `0.219.0` | `0.221.0` | | [@opentelemetry/exporter-metrics-otlp-proto](https://github.com/open-telemetry/opentelemetry-js) | `0.219.0` | `0.221.0` | | [@opentelemetry/exporter-trace-otlp-grpc](https://github.com/open-telemetry/opentelemetry-js) | `0.219.0` | `0.221.0` | | [@opentelemetry/exporter-trace-otlp-proto](https://github.com/open-telemetry/opentelemetry-js) | `0.219.0` | `0.221.0` | | [@opentelemetry/instrumentation-host-metrics](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/HEAD/packages/instrumentation-host-metrics) | `0.2.0` | `0.4.0` | | [@opentelemetry/instrumentation-runtime-node](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/HEAD/packages/instrumentation-runtime-node) | `0.32.0` | `0.34.0` | | [@sap/cds-mtxs](https://cap.cloud.sap/) | `4.0.1` | `4.0.2` | | [axios](https://github.com/axios/axios) | `1.18.1` | `1.19.0` | | [eslint](https://github.com/eslint/eslint) | `10.6.0` | `10.9.1` | Updates `@cap-js/cds-test` from 1.0.1 to 1.0.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/cap-js/cds-test/releases">@cap-js/cds-test's releases</a>.</em></p> <blockquote> <h2>v1.0.2</h2> <h3>Fixed</h3> <ul> <li><code>Buffer</code> request bodies are no longer serialized via <code>JSON.stringify()</code></li> <li>In <code>chest</code>-powered tests, <code>inspectPort</code> configuration will be passed to <code>node:test.run(...)</code> when debugging</li> <li>In <code>chest</code>-powered tests, <code>concurrency</code> of <code>node:test.run(...)</code> will be limitted to <code>1</code> to enable debugging</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/cap-js/cds-test/blob/main/CHANGELOG.md">@cap-js/cds-test's changelog</a>.</em></p> <blockquote> <h2>[1.0.2] - 2026-08-04</h2> <h3>Fixed</h3> <ul> <li><code>Buffer</code> request bodies are no longer serialized via <code>JSON.stringify()</code></li> <li>In <code>chest</code>-powered tests, <code>inspectPort</code> configuration will be passed to <code>node:test.run(...)</code> when debugging</li> <li>In <code>chest</code>-powered tests, <code>concurrency</code> of <code>node:test.run(...)</code> will be limitted to <code>1</code> to enable debugging</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/cap-js/cds-test/commit/1304e9dcf0b1e59682cbb423ae2f6f2f268bf69a"><code>1304e9d</code></a> fix: pass debug flag to runner (<a href="https://redirect.github.com/cap-js/cds-test/issues/96">#96</a>)</li> <li><a href="https://github.com/cap-js/cds-test/commit/540bc36058ad48dc29b66395eca49903b4adc84a"><code>540bc36</code></a> Bump <code>@cap-js/sqlite</code> from 2.4.0 to 3.0.2 (<a href="https://redirect.github.com/cap-js/cds-test/issues/102">#102</a>)</li> <li><a href="https://github.com/cap-js/cds-test/commit/4f150dfa04bbb96ce1d5cafbba499cfa0159b7a2"><code>4f150df</code></a> fix(naxios): send Buffer request bodies as raw bytes (<a href="https://redirect.github.com/cap-js/cds-test/issues/103">#103</a>)</li> <li><a href="https://github.com/cap-js/cds-test/commit/4d6ca38e165d2f338b433a262d252f2412a04812"><code>4d6ca38</code></a> feat: remove <code>sleep</code> API (<a href="https://redirect.github.com/cap-js/cds-test/issues/98">#98</a>)</li> <li><a href="https://github.com/cap-js/cds-test/commit/6d8eac954c61f0e6e56d06281212e12f826300e3"><code>6d8eac9</code></a> chore: open dependency to cap-js/sqlite 3 (<a href="https://redirect.github.com/cap-js/cds-test/issues/94">#94</a>)</li> <li><a href="https://github.com/cap-js/cds-test/commit/7456cb5194babf19ca82add11f4cea6e10adcf15"><code>7456cb5</code></a> fix: fulfilled and rejected can be awaited (<a href="https://redirect.github.com/cap-js/cds-test/issues/93">#93</a>)</li> <li><a href="https://github.com/cap-js/cds-test/commit/fa7721a04feb304839bbf2ade9e459196575d01e"><code>fa7721a</code></a> Bump qs from 6.15.1 to 6.15.2 in the npm_and_yarn group across 1 directory (<a href="https://redirect.github.com/cap-js/cds-test/issues/91">#91</a>)</li> <li><a href="https://github.com/cap-js/cds-test/commit/7c833de09ad800a2502cfc73c96a6531cc8b5598"><code>7c833de</code></a> fix: .to.be.fullfilled/rejected must return this (<a href="https://redirect.github.com/cap-js/cds-test/issues/92">#92</a>)</li> <li><a href="https://github.com/cap-js/cds-test/commit/0f1a65c82c24ff6c499f9cd50dba220441bf63b5"><code>0f1a65c</code></a> Bump <code>@cap-js/sqlite</code> from 2.2.0 to 2.4.0 (<a href="https://redirect.github.com/cap-js/cds-test/issues/88">#88</a>)</li> <li><a href="https://github.com/cap-js/cds-test/commit/90e6cf560bd54c8c223836d9349cecef86c48348"><code>90e6cf5</code></a> Temporarily reverting cds.test --with-mocks</li> <li>Additional commits viewable in <a href="https://github.com/cap-js/cds-test/compare/v1.0.1...v1.0.2">compare view</a></li> </ul> </details> <br /> Updates `@opentelemetry/exporter-metrics-otlp-grpc` from 0.219.0 to 0.221.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js/releases">@opentelemetry/exporter-metrics-otlp-grpc's releases</a>.</em></p> <blockquote> <h2>experimental/v0.221.0</h2> <h2>0.221.0</h2> <h3>:boom: Breaking Changes</h3> <ul> <li>feat(sdk-logs)!: configure the force flush timeout per call <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6931">#6931</a> <a href="https://github.com/LarryHu0217"><code>@LarryHu0217</code></a> <ul> <li>(user-facing): <code>LoggerProviderOptions.forceFlushTimeoutMillis</code> has been removed; pass <code>timeoutMillis</code> to <code>LoggerProvider.forceFlush()</code> instead.</li> </ul> </li> <li>feat(instrumentation-http)!: emit only stable HTTP semantic conventions. The <code>OTEL_SEMCONV_STABILITY_OPT_IN</code> environment variable no longer changes HTTP attribute or metric emission — old (v1.7.0) and duplicate (<code>http</code>/<code>http/dup</code>) semconv outputs have been removed. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-fetch)!: emit only stable HTTP semantic conventions. The <code>semconvStabilityOptIn</code> instrumentation config option has been removed; old (v1.7.0) and duplicate semconv outputs are no longer emitted. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-xml-http-request)!: emit only stable HTTP semantic conventions. The <code>semconvStabilityOptIn</code> instrumentation config option has been removed; old (v1.7.0) and duplicate semconv outputs are no longer emitted. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-grpc)!: emit only stable network semantic conventions. The <code>OTEL_SEMCONV_STABILITY_OPT_IN</code> environment variable no longer changes attribute emission — <code>net.peer.name</code> and <code>net.peer.port</code> (old) are no longer set; only <code>server.address</code> and <code>server.port</code> (stable). <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> </ul> <h3>:rocket: Features</h3> <ul> <li>feat(sdk-logs): allow modifying ReadWriteLogRecord properties (including hrTime, hrTimeObserved, and spanContext) in accordance with the OpenTelemetry Logs specification <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6923">#6923</a> <a href="https://github.com/Babul422"><code>@Babul422</code></a></li> <li>feat(sdk-node): emit a deprecation warning when the <code>JaegerPropagator</code> is selected via <code>OTEL_PROPAGATORS</code> or declarative config; use <code>tracecontext</code> instead. <a href="https://github.com/pichlermarc"><code>@pichlermarc</code></a></li> <li>feat(instrumentation-http): set <code>error.type</code> to status code in metrics for error requests. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6919">#6919</a> <a href="https://github.com/raphael-theriault-swi"><code>@raphael-theriault-swi</code></a></li> </ul> <h2>experimental/v0.220.0</h2> <h2>0.220.0</h2> <h3>:boom: Breaking Changes</h3> <ul> <li>refactor(sdk-logs)!: refactor BatchLogRecordProcessor constructor signature <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6817">#6817</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>(user-facing): <code>BatchLogRecordProcessor</code> now takes a single <code>options</code> object with all possible properties, instead of two separate arguments. For example, before <code>new BatchLogRecordProcessor(exporter, { maxQueueSize: 1000 })</code>, after <code>new BatchLogRecordProcessor({ exporter, maxQueueSize: 1000 })</code>.</li> <li><code>interface BufferConfig</code> -> <code>interface BatchLogRecordProcessorOptions</code>, and now includes the <code>exporter</code> property</li> <li><code>interface BatchLogRecordProcessorBrowserConfig</code> -> <code>interface BatchLogRecordProcessorBrowserOptions</code></li> <li>(user-facing): <code>SimpleLogRecordProcessor</code> now takes a single <code>options</code> object with all possible properties. For example, before <code>new SimpleLogRecordProcessor(exporter)</code>, after <code>new SimpleLogRecordProcessor({ exporter })</code>. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6836">#6836</a></li> </ul> </li> <li>refactor(configuration)!: change config file parsing to <em>not</em> add default values, nor merge <code>*_list</code> fields <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6765">#6765</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>Responsibility for handling <a href="https://opentelemetry.io/docs/specs/otel/configuration/sdk/#create">declarative config "nullBehavior" and "defaultBehavior"</a> belongs in the "create" handling, currently in the "sdk-node" package.</li> </ul> </li> <li>docs(shim-opencensus): <em>Notice</em>: The <code>@opentracing/shim-opencensus</code> package will be removed in SDK 3.x, planned for approximately September 2026. <ul> <li>The <a href="https://opentelemetry.io/blog/2026/deprecating-opencensus-compatibility/">OpenCensus</a> and <a href="https://opentelemetry.io/blog/2026/deprecating-opentracing-compatibility/">OpenTracing</a> compatibility requirements in the OpenTelemetry specification have been deprecated.</li> </ul> </li> <li>chore(sdk-node)!: Drop support for deprecated OpenCensusMetricProducer from declarative config</li> </ul> <h3>:rocket: Features</h3> <ul> <li>feat(configuration): bump config schema to v1.1.0; rename <code>without_scope_info</code> → <code>scope_info_enabled</code> and <code>without_target_info/development</code> → <code>target_info_enabled/development</code> on the Prometheus pull exporter (semantics inverted), rename <code>with_resource_constant_labels</code> → <code>resource_constant_labels</code>. Validate <code>file_format</code> per the configuration versioning spec: accept any minor version of major <code>1</code> (e.g. <code>1.0</code>, <code>1.1</code>), warn when the minor version is newer than supported, and reject other major versions. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6781">#6781</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(sdk-node): wire up <code>id_generator</code> from declarative config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6782">#6782</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(sdk-node): wire up <code>tracer_provider.sampler</code> from declarative config (always_on, always_off, trace_id_ratio_based, parent_based); unrecognized variants warn and fall back to ParentBased(AlwaysOn) <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6506">#6506</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(propagator-env-carrier): empty name normalization <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6827">#6827</a> <a href="https://github.com/pellared"><code>@pellared</code></a></li> <li>feat(propagator-env-carrier): make <code>EnvironmentGetter</code> read the current <code>process.env</code> <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6853">#6853</a> <a href="https://github.com/pellared"><code>@pellared</code></a></li> </ul> <h3>:bug: Bug Fixes</h3> <ul> <li>fix(sdk-logs): stop <code>Logger.emit()</code> doing work (record construction, metrics, processor <code>onEmit</code>) after the <code>LoggerProvider</code> has shut down <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6826">#6826</a> <a href="https://github.com/anneheartrecord"><code>@anneheartrecord</code></a></li> <li>fix(sdk-node): pass all config properties (endpoint, headers, timeout, TLS, compression, temporality preference, default histogram aggregation) to OTLP metric exporters in declarative config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6814">#6814</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>fix(sdk-logs): default BatchLogRecordProcessor <code>scheduleDelayMillis</code> is 1000 <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6796">#6796</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): percent-decode keys and values in <code>resource.attributes_list</code> per spec <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6787">#6787</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>fix(configuration): default <code>log_level</code> to <code>info</code> in env-based config initialization for consistency with file-based config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6788">#6788</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/76fa6b509e2b48d9cbee31cb37a2efc61dc4d384"><code>76fa6b5</code></a> chore: prepare next release (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6942">#6942</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/37878969526151bcda4449d92b0e69e913e0081e"><code>3787896</code></a> chore(deps): update dependency webpack-cli to v7.2.1 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6934">#6934</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/be5f757aeea424130834183df8e1726b5797c636"><code>be5f757</code></a> fix(deps): update dependency body-parser to v2.3.0 [security] (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6941">#6941</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/f6d8fbe74242dbce7cd5c79ec4fca8617b9936bb"><code>f6d8fbe</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6559">#6559</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/96127325ad0f158d55c19830aa20216eef65cf49"><code>9612732</code></a> chore: remove examples/dice from workspaces (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6937">#6937</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/7107906d0ad48fb4c3b4c161de0e195cbe2b9059"><code>7107906</code></a> chore: start using min-release-age in .npmrc, disable minimumReleaseAge for r...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/a7e5d11a3987427f61c7e51a5e0f55f057945d3d"><code>a7e5d11</code></a> chore(deps): update dependency webpack to v5.108.4 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6933">#6933</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/af7a82de767f87e30c2871fe88526c528e06b84d"><code>af7a82d</code></a> chore(deps): update dependency msw to v2.15.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6831">#6831</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/b9f57c622f244ed7d7f671b02159e6c1c378a3c4"><code>b9f57c6</code></a> chore(deps): update dependency <code>@types/webpack-env</code> to v1.18.8 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6877">#6877</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/cbb4abf849e40b154144ec35dfa20b597b2edc0a"><code>cbb4abf</code></a> chore(deps): update ubuntu docker tag to v26 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6635">#6635</a>)</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-js/compare/experimental/v0.219.0...experimental/v0.221.0">compare view</a></li> </ul> </details> <br /> Updates `@opentelemetry/exporter-metrics-otlp-proto` from 0.219.0 to 0.221.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js/releases">@opentelemetry/exporter-metrics-otlp-proto's releases</a>.</em></p> <blockquote> <h2>experimental/v0.221.0</h2> <h2>0.221.0</h2> <h3>:boom: Breaking Changes</h3> <ul> <li>feat(sdk-logs)!: configure the force flush timeout per call <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6931">#6931</a> <a href="https://github.com/LarryHu0217"><code>@LarryHu0217</code></a> <ul> <li>(user-facing): <code>LoggerProviderOptions.forceFlushTimeoutMillis</code> has been removed; pass <code>timeoutMillis</code> to <code>LoggerProvider.forceFlush()</code> instead.</li> </ul> </li> <li>feat(instrumentation-http)!: emit only stable HTTP semantic conventions. The <code>OTEL_SEMCONV_STABILITY_OPT_IN</code> environment variable no longer changes HTTP attribute or metric emission — old (v1.7.0) and duplicate (<code>http</code>/<code>http/dup</code>) semconv outputs have been removed. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-fetch)!: emit only stable HTTP semantic conventions. The <code>semconvStabilityOptIn</code> instrumentation config option has been removed; old (v1.7.0) and duplicate semconv outputs are no longer emitted. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-xml-http-request)!: emit only stable HTTP semantic conventions. The <code>semconvStabilityOptIn</code> instrumentation config option has been removed; old (v1.7.0) and duplicate semconv outputs are no longer emitted. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-grpc)!: emit only stable network semantic conventions. The <code>OTEL_SEMCONV_STABILITY_OPT_IN</code> environment variable no longer changes attribute emission — <code>net.peer.name</code> and <code>net.peer.port</code> (old) are no longer set; only <code>server.address</code> and <code>server.port</code> (stable). <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> </ul> <h3>:rocket: Features</h3> <ul> <li>feat(sdk-logs): allow modifying ReadWriteLogRecord properties (including hrTime, hrTimeObserved, and spanContext) in accordance with the OpenTelemetry Logs specification <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6923">#6923</a> <a href="https://github.com/Babul422"><code>@Babul422</code></a></li> <li>feat(sdk-node): emit a deprecation warning when the <code>JaegerPropagator</code> is selected via <code>OTEL_PROPAGATORS</code> or declarative config; use <code>tracecontext</code> instead. <a href="https://github.com/pichlermarc"><code>@pichlermarc</code></a></li> <li>feat(instrumentation-http): set <code>error.type</code> to status code in metrics for error requests. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6919">#6919</a> <a href="https://github.com/raphael-theriault-swi"><code>@raphael-theriault-swi</code></a></li> </ul> <h2>experimental/v0.220.0</h2> <h2>0.220.0</h2> <h3>:boom: Breaking Changes</h3> <ul> <li>refactor(sdk-logs)!: refactor BatchLogRecordProcessor constructor signature <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6817">#6817</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>(user-facing): <code>BatchLogRecordProcessor</code> now takes a single <code>options</code> object with all possible properties, instead of two separate arguments. For example, before <code>new BatchLogRecordProcessor(exporter, { maxQueueSize: 1000 })</code>, after <code>new BatchLogRecordProcessor({ exporter, maxQueueSize: 1000 })</code>.</li> <li><code>interface BufferConfig</code> -> <code>interface BatchLogRecordProcessorOptions</code>, and now includes the <code>exporter</code> property</li> <li><code>interface BatchLogRecordProcessorBrowserConfig</code> -> <code>interface BatchLogRecordProcessorBrowserOptions</code></li> <li>(user-facing): <code>SimpleLogRecordProcessor</code> now takes a single <code>options</code> object with all possible properties. For example, before <code>new SimpleLogRecordProcessor(exporter)</code>, after <code>new SimpleLogRecordProcessor({ exporter })</code>. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6836">#6836</a></li> </ul> </li> <li>refactor(configuration)!: change config file parsing to <em>not</em> add default values, nor merge <code>*_list</code> fields <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6765">#6765</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>Responsibility for handling <a href="https://opentelemetry.io/docs/specs/otel/configuration/sdk/#create">declarative config "nullBehavior" and "defaultBehavior"</a> belongs in the "create" handling, currently in the "sdk-node" package.</li> </ul> </li> <li>docs(shim-opencensus): <em>Notice</em>: The <code>@opentracing/shim-opencensus</code> package will be removed in SDK 3.x, planned for approximately September 2026. <ul> <li>The <a href="https://opentelemetry.io/blog/2026/deprecating-opencensus-compatibility/">OpenCensus</a> and <a href="https://opentelemetry.io/blog/2026/deprecating-opentracing-compatibility/">OpenTracing</a> compatibility requirements in the OpenTelemetry specification have been deprecated.</li> </ul> </li> <li>chore(sdk-node)!: Drop support for deprecated OpenCensusMetricProducer from declarative config</li> </ul> <h3>:rocket: Features</h3> <ul> <li>feat(configuration): bump config schema to v1.1.0; rename <code>without_scope_info</code> → <code>scope_info_enabled</code> and <code>without_target_info/development</code> → <code>target_info_enabled/development</code> on the Prometheus pull exporter (semantics inverted), rename <code>with_resource_constant_labels</code> → <code>resource_constant_labels</code>. Validate <code>file_format</code> per the configuration versioning spec: accept any minor version of major <code>1</code> (e.g. <code>1.0</code>, <code>1.1</code>), warn when the minor version is newer than supported, and reject other major versions. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6781">#6781</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(sdk-node): wire up <code>id_generator</code> from declarative config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6782">#6782</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(sdk-node): wire up <code>tracer_provider.sampler</code> from declarative config (always_on, always_off, trace_id_ratio_based, parent_based); unrecognized variants warn and fall back to ParentBased(AlwaysOn) <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6506">#6506</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(propagator-env-carrier): empty name normalization <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6827">#6827</a> <a href="https://github.com/pellared"><code>@pellared</code></a></li> <li>feat(propagator-env-carrier): make <code>EnvironmentGetter</code> read the current <code>process.env</code> <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6853">#6853</a> <a href="https://github.com/pellared"><code>@pellared</code></a></li> </ul> <h3>:bug: Bug Fixes</h3> <ul> <li>fix(sdk-logs): stop <code>Logger.emit()</code> doing work (record construction, metrics, processor <code>onEmit</code>) after the <code>LoggerProvider</code> has shut down <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6826">#6826</a> <a href="https://github.com/anneheartrecord"><code>@anneheartrecord</code></a></li> <li>fix(sdk-node): pass all config properties (endpoint, headers, timeout, TLS, compression, temporality preference, default histogram aggregation) to OTLP metric exporters in declarative config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6814">#6814</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>fix(sdk-logs): default BatchLogRecordProcessor <code>scheduleDelayMillis</code> is 1000 <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6796">#6796</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): percent-decode keys and values in <code>resource.attributes_list</code> per spec <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6787">#6787</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>fix(configuration): default <code>log_level</code> to <code>info</code> in env-based config initialization for consistency with file-based config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6788">#6788</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/76fa6b509e2b48d9cbee31cb37a2efc61dc4d384"><code>76fa6b5</code></a> chore: prepare next release (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6942">#6942</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/37878969526151bcda4449d92b0e69e913e0081e"><code>3787896</code></a> chore(deps): update dependency webpack-cli to v7.2.1 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6934">#6934</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/be5f757aeea424130834183df8e1726b5797c636"><code>be5f757</code></a> fix(deps): update dependency body-parser to v2.3.0 [security] (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6941">#6941</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/f6d8fbe74242dbce7cd5c79ec4fca8617b9936bb"><code>f6d8fbe</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6559">#6559</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/96127325ad0f158d55c19830aa20216eef65cf49"><code>9612732</code></a> chore: remove examples/dice from workspaces (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6937">#6937</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/7107906d0ad48fb4c3b4c161de0e195cbe2b9059"><code>7107906</code></a> chore: start using min-release-age in .npmrc, disable minimumReleaseAge for r...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/a7e5d11a3987427f61c7e51a5e0f55f057945d3d"><code>a7e5d11</code></a> chore(deps): update dependency webpack to v5.108.4 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6933">#6933</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/af7a82de767f87e30c2871fe88526c528e06b84d"><code>af7a82d</code></a> chore(deps): update dependency msw to v2.15.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6831">#6831</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/b9f57c622f244ed7d7f671b02159e6c1c378a3c4"><code>b9f57c6</code></a> chore(deps): update dependency <code>@types/webpack-env</code> to v1.18.8 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6877">#6877</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/cbb4abf849e40b154144ec35dfa20b597b2edc0a"><code>cbb4abf</code></a> chore(deps): update ubuntu docker tag to v26 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6635">#6635</a>)</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-js/compare/experimental/v0.219.0...experimental/v0.221.0">compare view</a></li> </ul> </details> <br /> Updates `@opentelemetry/exporter-trace-otlp-grpc` from 0.219.0 to 0.221.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js/releases">@opentelemetry/exporter-trace-otlp-grpc's releases</a>.</em></p> <blockquote> <h2>experimental/v0.221.0</h2> <h2>0.221.0</h2> <h3>:boom: Breaking Changes</h3> <ul> <li>feat(sdk-logs)!: configure the force flush timeout per call <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6931">#6931</a> <a href="https://github.com/LarryHu0217"><code>@LarryHu0217</code></a> <ul> <li>(user-facing): <code>LoggerProviderOptions.forceFlushTimeoutMillis</code> has been removed; pass <code>timeoutMillis</code> to <code>LoggerProvider.forceFlush()</code> instead.</li> </ul> </li> <li>feat(instrumentation-http)!: emit only stable HTTP semantic conventions. The <code>OTEL_SEMCONV_STABILITY_OPT_IN</code> environment variable no longer changes HTTP attribute or metric emission — old (v1.7.0) and duplicate (<code>http</code>/<code>http/dup</code>) semconv outputs have been removed. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-fetch)!: emit only stable HTTP semantic conventions. The <code>semconvStabilityOptIn</code> instrumentation config option has been removed; old (v1.7.0) and duplicate semconv outputs are no longer emitted. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-xml-http-request)!: emit only stable HTTP semantic conventions. The <code>semconvStabilityOptIn</code> instrumentation config option has been removed; old (v1.7.0) and duplicate semconv outputs are no longer emitted. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-grpc)!: emit only stable network semantic conventions. The <code>OTEL_SEMCONV_STABILITY_OPT_IN</code> environment variable no longer changes attribute emission — <code>net.peer.name</code> and <code>net.peer.port</code> (old) are no longer set; only <code>server.address</code> and <code>server.port</code> (stable). <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> </ul> <h3>:rocket: Features</h3> <ul> <li>feat(sdk-logs): allow modifying ReadWriteLogRecord properties (including hrTime, hrTimeObserved, and spanContext) in accordance with the OpenTelemetry Logs specification <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6923">#6923</a> <a href="https://github.com/Babul422"><code>@Babul422</code></a></li> <li>feat(sdk-node): emit a deprecation warning when the <code>JaegerPropagator</code> is selected via <code>OTEL_PROPAGATORS</code> or declarative config; use <code>tracecontext</code> instead. <a href="https://github.com/pichlermarc"><code>@pichlermarc</code></a></li> <li>feat(instrumentation-http): set <code>error.type</code> to status code in metrics for error requests. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6919">#6919</a> <a href="https://github.com/raphael-theriault-swi"><code>@raphael-theriault-swi</code></a></li> </ul> <h2>experimental/v0.220.0</h2> <h2>0.220.0</h2> <h3>:boom: Breaking Changes</h3> <ul> <li>refactor(sdk-logs)!: refactor BatchLogRecordProcessor constructor signature <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6817">#6817</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>(user-facing): <code>BatchLogRecordProcessor</code> now takes a single <code>options</code> object with all possible properties, instead of two separate arguments. For example, before <code>new BatchLogRecordProcessor(exporter, { maxQueueSize: 1000 })</code>, after <code>new BatchLogRecordProcessor({ exporter, maxQueueSize: 1000 })</code>.</li> <li><code>interface BufferConfig</code> -> <code>interface BatchLogRecordProcessorOptions</code>, and now includes the <code>exporter</code> property</li> <li><code>interface BatchLogRecordProcessorBrowserConfig</code> -> <code>interface BatchLogRecordProcessorBrowserOptions</code></li> <li>(user-facing): <code>SimpleLogRecordProcessor</code> now takes a single <code>options</code> object with all possible properties. For example, before <code>new SimpleLogRecordProcessor(exporter)</code>, after <code>new SimpleLogRecordProcessor({ exporter })</code>. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6836">#6836</a></li> </ul> </li> <li>refactor(configuration)!: change config file parsing to <em>not</em> add default values, nor merge <code>*_list</code> fields <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6765">#6765</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>Responsibility for handling <a href="https://opentelemetry.io/docs/specs/otel/configuration/sdk/#create">declarative config "nullBehavior" and "defaultBehavior"</a> belongs in the "create" handling, currently in the "sdk-node" package.</li> </ul> </li> <li>docs(shim-opencensus): <em>Notice</em>: The <code>@opentracing/shim-opencensus</code> package will be removed in SDK 3.x, planned for approximately September 2026. <ul> <li>The <a href="https://opentelemetry.io/blog/2026/deprecating-opencensus-compatibility/">OpenCensus</a> and <a href="https://opentelemetry.io/blog/2026/deprecating-opentracing-compatibility/">OpenTracing</a> compatibility requirements in the OpenTelemetry specification have been deprecated.</li> </ul> </li> <li>chore(sdk-node)!: Drop support for deprecated OpenCensusMetricProducer from declarative config</li> </ul> <h3>:rocket: Features</h3> <ul> <li>feat(configuration): bump config schema to v1.1.0; rename <code>without_scope_info</code> → <code>scope_info_enabled</code> and <code>without_target_info/development</code> → <code>target_info_enabled/development</code> on the Prometheus pull exporter (semantics inverted), rename <code>with_resource_constant_labels</code> → <code>resource_constant_labels</code>. Validate <code>file_format</code> per the configuration versioning spec: accept any minor version of major <code>1</code> (e.g. <code>1.0</code>, <code>1.1</code>), warn when the minor version is newer than supported, and reject other major versions. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6781">#6781</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(sdk-node): wire up <code>id_generator</code> from declarative config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6782">#6782</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(sdk-node): wire up <code>tracer_provider.sampler</code> from declarative config (always_on, always_off, trace_id_ratio_based, parent_based); unrecognized variants warn and fall back to ParentBased(AlwaysOn) <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6506">#6506</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(propagator-env-carrier): empty name normalization <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6827">#6827</a> <a href="https://github.com/pellared"><code>@pellared</code></a></li> <li>feat(propagator-env-carrier): make <code>EnvironmentGetter</code> read the current <code>process.env</code> <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6853">#6853</a> <a href="https://github.com/pellared"><code>@pellared</code></a></li> </ul> <h3>:bug: Bug Fixes</h3> <ul> <li>fix(sdk-logs): stop <code>Logger.emit()</code> doing work (record construction, metrics, processor <code>onEmit</code>) after the <code>LoggerProvider</code> has shut down <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6826">#6826</a> <a href="https://github.com/anneheartrecord"><code>@anneheartrecord</code></a></li> <li>fix(sdk-node): pass all config properties (endpoint, headers, timeout, TLS, compression, temporality preference, default histogram aggregation) to OTLP metric exporters in declarative config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6814">#6814</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>fix(sdk-logs): default BatchLogRecordProcessor <code>scheduleDelayMillis</code> is 1000 <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6796">#6796</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): percent-decode keys and values in <code>resource.attributes_list</code> per spec <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6787">#6787</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>fix(configuration): default <code>log_level</code> to <code>info</code> in env-based config initialization for consistency with file-based config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6788">#6788</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/76fa6b509e2b48d9cbee31cb37a2efc61dc4d384"><code>76fa6b5</code></a> chore: prepare next release (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6942">#6942</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/37878969526151bcda4449d92b0e69e913e0081e"><code>3787896</code></a> chore(deps): update dependency webpack-cli to v7.2.1 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6934">#6934</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/be5f757aeea424130834183df8e1726b5797c636"><code>be5f757</code></a> fix(deps): update dependency body-parser to v2.3.0 [security] (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6941">#6941</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/f6d8fbe74242dbce7cd5c79ec4fca8617b9936bb"><code>f6d8fbe</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6559">#6559</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/96127325ad0f158d55c19830aa20216eef65cf49"><code>9612732</code></a> chore: remove examples/dice from workspaces (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6937">#6937</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/7107906d0ad48fb4c3b4c161de0e195cbe2b9059"><code>7107906</code></a> chore: start using min-release-age in .npmrc, disable minimumReleaseAge for r...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/a7e5d11a3987427f61c7e51a5e0f55f057945d3d"><code>a7e5d11</code></a> chore(deps): update dependency webpack to v5.108.4 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6933">#6933</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/af7a82de767f87e30c2871fe88526c528e06b84d"><code>af7a82d</code></a> chore(deps): update dependency msw to v2.15.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6831">#6831</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/b9f57c622f244ed7d7f671b02159e6c1c378a3c4"><code>b9f57c6</code></a> chore(deps): update dependency <code>@types/webpack-env</code> to v1.18.8 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6877">#6877</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/cbb4abf849e40b154144ec35dfa20b597b2edc0a"><code>cbb4abf</code></a> chore(deps): update ubuntu docker tag to v26 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6635">#6635</a>)</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-js/compare/experimental/v0.219.0...experimental/v0.221.0">compare view</a></li> </ul> </details> <br /> Updates `@opentelemetry/exporter-trace-otlp-proto` from 0.219.0 to 0.221.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js/releases">@opentelemetry/exporter-trace-otlp-proto's releases</a>.</em></p> <blockquote> <h2>experimental/v0.221.0</h2> <h2>0.221.0</h2> <h3>:boom: Breaking Changes</h3> <ul> <li>feat(sdk-logs)!: configure the force flush timeout per call <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6931">#6931</a> <a href="https://github.com/LarryHu0217"><code>@LarryHu0217</code></a> <ul> <li>(user-facing): <code>LoggerProviderOptions.forceFlushTimeoutMillis</code> has been removed; pass <code>timeoutMillis</code> to <code>LoggerProvider.forceFlush()</code> instead.</li> </ul> </li> <li>feat(instrumentation-http)!: emit only stable HTTP semantic conventions. The <code>OTEL_SEMCONV_STABILITY_OPT_IN</code> environment variable no longer changes HTTP attribute or metric emission — old (v1.7.0) and duplicate (<code>http</code>/<code>http/dup</code>) semconv outputs have been removed. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-fetch)!: emit only stable HTTP semantic conventions. The <code>semconvStabilityOptIn</code> instrumentation config option has been removed; old (v1.7.0) and duplicate semconv outputs are no longer emitted. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-xml-http-request)!: emit only stable HTTP semantic conventions. The <code>semconvStabilityOptIn</code> instrumentation config option has been removed; old (v1.7.0) and duplicate semconv outputs are no longer emitted. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> <li>feat(instrumentation-grpc)!: emit only stable network semantic conventions. The <code>OTEL_SEMCONV_STABILITY_OPT_IN</code> environment variable no longer changes attribute emission — <code>net.peer.name</code> and <code>net.peer.port</code> (old) are no longer set; only <code>server.address</code> and <code>server.port</code> (stable). <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6819">#6819</a> <a href="https://github.com/maryliag"><code>@maryliag</code></a></li> </ul> <h3>:rocket: Features</h3> <ul> <li>feat(sdk-logs): allow modifying ReadWriteLogRecord properties (including hrTime, hrTimeObserved, and spanContext) in accordance with the OpenTelemetry Logs specification <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6923">#6923</a> <a href="https://github.com/Babul422"><code>@Babul422</code></a></li> <li>feat(sdk-node): emit a deprecation warning when the <code>JaegerPropagator</code> is selected via <code>OTEL_PROPAGATORS</code> or declarative config; use <code>tracecontext</code> instead. <a href="https://github.com/pichlermarc"><code>@pichlermarc</code></a></li> <li>feat(instrumentation-http): set <code>error.type</code> to status code in metrics for error requests. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6919">#6919</a> <a href="https://github.com/raphael-theriault-swi"><code>@raphael-theriault-swi</code></a></li> </ul> <h2>experimental/v0.220.0</h2> <h2>0.220.0</h2> <h3>:boom: Breaking Changes</h3> <ul> <li>refactor(sdk-logs)!: refactor BatchLogRecordProcessor constructor signature <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6817">#6817</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>(user-facing): <code>BatchLogRecordProcessor</code> now takes a single <code>options</code> object with all possible properties, instead of two separate arguments. For example, before <code>new BatchLogRecordProcessor(exporter, { maxQueueSize: 1000 })</code>, after <code>new BatchLogRecordProcessor({ exporter, maxQueueSize: 1000 })</code>.</li> <li><code>interface BufferConfig</code> -> <code>interface BatchLogRecordProcessorOptions</code>, and now includes the <code>exporter</code> property</li> <li><code>interface BatchLogRecordProcessorBrowserConfig</code> -> <code>interface BatchLogRecordProcessorBrowserOptions</code></li> <li>(user-facing): <code>SimpleLogRecordProcessor</code> now takes a single <code>options</code> object with all possible properties. For example, before <code>new SimpleLogRecordProcessor(exporter)</code>, after <code>new SimpleLogRecordProcessor({ exporter })</code>. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6836">#6836</a></li> </ul> </li> <li>refactor(configuration)!: change config file parsing to <em>not</em> add default values, nor merge <code>*_list</code> fields <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6765">#6765</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>Responsibility for handling <a href="https://opentelemetry.io/docs/specs/otel/configuration/sdk/#create">declarative config "nullBehavior" and "defaultBehavior"</a> belongs in the "create" handling, currently in the "sdk-node" package.</li> </ul> </li> <li>docs(shim-opencensus): <em>Notice</em>: The <code>@opentracing/shim-opencensus</code> package will be removed in SDK 3.x, planned for approximately September 2026. <ul> <li>The <a href="https://opentelemetry.io/blog/2026/deprecating-opencensus-compatibility/">OpenCensus</a> and <a href="https://opentelemetry.io/blog/2026/deprecating-opentracing-compatibility/">OpenTracing</a> compatibility requirements in the OpenTelemetry specification have been deprecated.</li> </ul> </li> <li>chore(sdk-node)!: Drop support for deprecated OpenCensusMetricProducer from declarative config</li> </ul> <h3>:rocket: Features</h3> <ul> <li>feat(configuration): bump config schema to v1.1.0; rename <code>without_scope_info</code> → <code>scope_info_enabled</code> and <code>without_target_info/development</code> → <code>target_info_enabled/development</code> on the Prometheus pull exporter (semantics inverted), rename <code>with_resource_constant_labels</code> → <code>resource_constant_labels</code>. Validate <code>file_format</code> per the configuration versioning spec: accept any minor version of major <code>1</code> (e.g. <code>1.0</code>, <code>1.1</code>), warn when the minor version is newer than supported, and reject other major versions. <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6781">#6781</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(sdk-node): wire up <code>id_generator</code> from declarative config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6782">#6782</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(sdk-node): wire up <code>tracer_provider.sampler</code> from declarative config (always_on, always_off, trace_id_ratio_based, parent_based); unrecognized variants warn and fall back to ParentBased(AlwaysOn) <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6506">#6506</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(propagator-env-carrier): empty name normalization <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6827">#6827</a> <a href="https://github.com/pellared"><code>@pellared</code></a></li> <li>feat(propagator-env-carrier): make <code>EnvironmentGetter</code> read the current <code>process.env</code> <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6853">#6853</a> <a href="https://github.com/pellared"><code>@pellared</code></a></li> </ul> <h3>:bug: Bug Fixes</h3> <ul> <li>fix(sdk-logs): stop <code>Logger.emit()</code> doing work (record construction, metrics, processor <code>onEmit</code>) after the <code>LoggerProvider</code> has shut down <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6826">#6826</a> <a href="https://github.com/anneheartrecord"><code>@anneheartrecord</code></a></li> <li>fix(sdk-node): pass all config properties (endpoint, headers, timeout, TLS, compression, temporality preference, default histogram aggregation) to OTLP metric exporters in declarative config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6814">#6814</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>fix(sdk-logs): default BatchLogRecordProcessor <code>scheduleDelayMillis</code> is 1000 <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6796">#6796</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): percent-decode keys and values in <code>resource.attributes_list</code> per spec <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6787">#6787</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>fix(configuration): default <code>log_level</code> to <code>info</code> in env-based config initialization for consistency with file-based config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6788">#6788</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/76fa6b509e2b48d9cbee31cb37a2efc61dc4d384"><code>76fa6b5</code></a> chore: prepare next release (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6942">#6942</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/37878969526151bcda4449d92b0e69e913e0081e"><code>3787896</code></a> chore(deps): update dependency webpack-cli to v7.2.1 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6934">#6934</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/be5f757aeea424130834183df8e1726b5797c636"><code>be5f757</code></a> fix(deps): update dependency body-parser to v2.3.0 [security] (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6941">#6941</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/f6d8fbe74242dbce7cd5c79ec4fca8617b9936bb"><code>f6d8fbe</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6559">#6559</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/96127325ad0f158d55c19830aa20216eef65cf49"><code>9612732</code></a> chore: remove examples/dice from workspaces (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6937">#6937</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/7107906d0ad48fb4c3b4c161de0e195cbe2b9059"><code>7107906</code></a> chore: start using min-release-age in .npmrc, disable minimumReleaseAge for r...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/a7e5d11a3987427f61c7e51a5e0f55f057945d3d"><code>a7e5d11</code></a> chore(deps): update dependency webpack to v5.108.4 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6933">#6933</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/af7a82de767f87e30c2871fe88526c528e06b84d"><code>af7a82d</code></a> chore(deps): update dependency msw to v2.15.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6831">#6831</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/b9f57c622f244ed7d7f671b02159e6c1c378a3c4"><code>b9f57c6</code></a> chore(deps): update dependency <code>@types/webpack-env</code> to v1.18.8 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6877">#6877</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/cbb4abf849e40b154144ec35dfa20b597b2edc0a"><code>cbb4abf</code></a> chore(deps): update ubuntu docker tag to v26 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6635">#6635</a>)</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-js/compare/experimental/v0.219.0...experimental/v0.221.0">compare view</a></li> </ul> </details> <br /> Updates `@opentelemetry/instrumentation-host-metrics` from 0.2.0 to 0.4.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js-contrib/releases">@opentelemetry/instrumentation-host-metrics's releases</a>.</em></p> <blockquote> <h2>instrumentation-host-metrics: v0.4.0</h2> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/instrumentation-host-metrics-v0.3.0...instrumentation-host-metrics-v0.4.0">0.4.0</a> (2026-07-23)</h2> <h3>Features</h3> <ul> <li><strong>deps:</strong> update deps matching '@opentelemetry/*' (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3629">#3629</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/466d5def474cf251217881322ed4db13fad96b86">466d5de</a>)</li> </ul> <h2>instrumentation-console: v0.3.0</h2> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/instrumentation-console-v0.2.0...instrumentation-console-v0.3.0">0.3.0</a> (2026-07-23)</h2> <h3>Features</h3> <ul> <li><strong>deps:</strong> update deps matching '@opentelemetry/*' (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3629">#3629</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/466d5def474cf251217881322ed4db13fad96b86">466d5de</a>)</li> </ul> <h2>sampler-aws-xray: v0.3.0</h2> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/sampler-aws-xray-v0.2.0...sampler-aws-xray-v0.3.0">0.3.0</a> (2026-07-23)</h2> <h3>⚠ BREAKING CHANGES</h3> <ul> <li>only emit stable http, network and database attributes (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3585">#3585</a>)</li> </ul> <h3>Features</h3> <ul> <li>only emit stable http, network and database attributes (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3585">#3585</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/5b7dd0e102e940d653e04b08b5a1b721a8271037">5b7dd0e</a>)</li> </ul> <h2>instrumentation-host-metrics: v0.3.0</h2> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/instrumentation-host-metrics-v0.2.0...instrumentation-host-metrics-v0.3.0">0.3.0</a> (2026-07-03)</h2> <h3>Features</h3> <ul> <li><strong>deps:</strong> update deps matching '@opentelemetry/*' (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3593">#3593</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/6dfb532ac16889c2f8656f2d9132a290e68cb570">6dfb532</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/packages/instrumentation-host-metrics/CHANGELOG.md">@opentelemetry/instrumentation-host-metrics's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/instrumentation-host-metrics-v0.3.0...instrumentation-host-metrics-v0.4.0">0.4.0</a> (2026-07-23)</h2> <h3>Features</h3> <ul> <li><strong>deps:</strong> update deps matching '@opentelemetry/*' (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3629">#3629</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/466d5def474cf251217881322ed4db13fad96b86">466d5de</a>)</li> </ul> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/instrumentation-host-metrics-v0.2.0...instrumentation-host-metrics-v0.3.0">0.3.0</a> (2026-07-03)</h2> <h3>Features</h3> <ul> <li><strong>deps:</strong> update deps matching '@opentelemetry/*' (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3593">#3593</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/6dfb532ac16889c2f8656f2d9132a290e68cb570">6dfb532</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commits/v0.4.0/packages/instrumentation-host-metrics">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by <a href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new releaser for <code>@opentelemetry/instrumentation-host-metrics</code> since your current version.</p> </details> <br /> Updates `@opentelemetry/instrumentation-runtime-node` from 0.32.0 to 0.34.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js-contrib/releases">@opentelemetry/instrumentation-runtime-node's releases</a>.</em></p> <blockquote> <h2>instrumentation-runtime-node: v0.34.0</h2> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/instrumentation-runtime-node-v0.33.0...instrumentation-runtime-node-v0.34.0">0.34.0</a> (2026-07-23)</h2> <h3>⚠ BREAKING CHANGES</h3> <ul> <li><strong>instrumentation-runtime-node:</strong> remove deprecated v8js.memory.heap.limit metric (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3632">#3632</a>)</li> </ul> <h3>Features</h3> <ul> <li><strong>deps:</strong> update deps matching '@opentelemetry/*' (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3629">#3629</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/466d5def474cf251217881322ed4db13fad96b86">466d5de</a>)</li> <li><strong>instrumentation-runtime-node:</strong> remove deprecated v8js.memory.heap.limit metric (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3632">#3632</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/f69829245952b95f5d1827b0a6cee67499f85bc6">f698292</a>)</li> </ul> <h2>instrumentation-runtime-node: v0.33.0</h2> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/instrumentation-runtime-node-v0.32.0...instrumentation-runtime-node-v0.33.0">0.33.0</a> (2026-07-03)</h2> <h3>Features</h3> <ul> <li><strong>deps:</strong> update deps matching '@opentelemetry/*' (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3593">#3593</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/6dfb532ac16889c2f8656f2d9132a290e68cb570">6dfb532</a>)</li> <li><strong>instrumentation-runtime-node:</strong> add active resource gauge (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3361">#3361</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/f3d38e25cdb7a158a47c24fc344cb4e9c6f24252">f3d38e2</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/packages/instrumentation-runtime-node/CHANGELOG.md">@opentelemetry/instrumentation-runtime-node's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/instrumentation-runtime-node-v0.33.0...instrumentation-runtime-node-v0.34.0">0.34.0</a> (2026-07-23)</h2> <h3>⚠ BREAKING CHANGES</h3> <ul> <li><strong>instrumentation-runtime-node:</strong> remove deprecated v8js.memory.heap.limit metric (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3632">#3632</a>)</li> </ul> <h3>Features</h3> <ul> <li><strong>deps:</strong> update deps matching '@opentelemetry/*' (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3629">#3629</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/466d5def474cf251217881322ed4db13fad96b86">466d5de</a>)</li> <li><strong>instrumentation-runtime-node:</strong> remove deprecated v8js.memory.heap.limit metric (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3632">#3632</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/f69829245952b95f5d1827b0a6cee67499f85bc6">f698292</a>)</li> </ul> <h2><a href="https://github.com/open-telemetry/opentelemetry-js-contrib/compare/instrumentation-runtime-node-v0.32.0...instrumentation-runtime-node-v0.33.0">0.33.0</a> (2026-07-03)</h2> <h3>Features</h3> <ul> <li><strong>deps:</strong> update deps matching '@opentelemetry/*' (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3593">#3593</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/6dfb532ac16889c2f8656f2d9132a290e68cb570">6dfb532</a>)</li> <li><strong>instrumentation-runtime-node:</strong> add active resource gauge (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3361">#3361</a>) (<a href="https://github.com/open-telemetry/opentelemetry-js-contrib/commit/f3d38e25cdb7a158a47c24fc344cb4e9c6f24252">f3d38e2</a>)</li> </ul> </blockquote> </details> <details> <s…
# Add CODEOWNERS File to Repository ### Chore 🔧 Added a `CODEOWNERS` file to the repository to define default code ownership for all files. ### Changes * `.github/CODEOWNERS`: New file that assigns `@cap-js/node-js-runtime` as the default owner for all files in the repository (`*`). This ensures the team is automatically requested for review on any pull request affecting the codebase. - [ ] 🔄 Regenerate and Update Summary <details> <summary>PR Bot Information</summary> **Version:** `1.31.2` - Output Template: [Default Template](https://github.tools.sap/Code-Change-Intelligence/pr-bot/blob/main/src/services/llm/prompts/summary_default_output_template.md) - Summary Prompt: [Default Prompt](https://github.tools.sap/Code-Change-Intelligence/pr-bot/blob/main/src/services/llm/prompts/summary_instructions_prompt.md) - File Content Strategy: Full file content - Event Trigger: `pull_request.opened` - LLM: `anthropic--claude-4.6-sonnet` - Correlation ID: `d792fa50-a570-11f1-88af-cb6b0d808e90` </details>
Closes #411. ### Problem The span processor was hard-coded off `NODE_ENV`: `BatchSpanProcessor` in production, `SimpleSpanProcessor` otherwise. There was no way to override it (e.g. force `SimpleSpanProcessor` in a prod-like env for immediate export, or tune batching `config`). ### Change Select the processor from config: `cds.requires.telemetry.tracing.processor = { kind, config? }`. - `kind` ∈ { `BatchSpanProcessor` (default), `SimpleSpanProcessor` } - `config` is passed through to the processor's constructor - The `[development]` profile defaults to `SimpleSpanProcessor` — so the previous `NODE_ENV`-based behavior is preserved (production → Batch, dev → Simple), just now overridable. - An unknown `kind` throws `Unknown span processor <kind>`, mirroring the existing `sampler`/`propagator` kind-validation in `lib/tracing/index.js`. ### Tests - `test/tracing-processor-simple.test.js` — dev profile boot activates `SimpleSpanProcessor`. - `test/tracing-processor-batch.test.js` — explicit `[tracing-batch-processor]` override activates `BatchSpanProcessor` (a true `production` boot isn't feasible in the test app — it requires `@cap-js/hana`; the production default is covered via this explicit override). - `test/tracing-processor-unknown.test.js` — an unknown kind throws via the real factory (verified non-vacuous: removing the guard makes it fail). ### Docs - README: new **Span Processor** config section. - CHANGELOG: `Added` bullet under 2.1.0.
| - [`telemetry-to-console`](#telemetry-to-console) | ||
| - [`telemetry-to-dynatrace`](#telemetry-to-dynatrace) | ||
| - [`telemetry-to-cloud-logging`](#telemetry-to-cloud-logging) | ||
| - [`telemetry-to-jaeger`](#telemetry-to-jaeger) | ||
| - [`telemetry-to-otlp`](#telemetry-to-otlp) |
Release:
v2.1.0Standing release PR — accumulates everything merged into
developfor the next minor. Do not squash-merge; review and merge with a team member to satisfy themainreview requirement. Description kept current as PRs land ondevelop.Changes so far
package.json/CHANGELOG.md: version →2.1.0;## Version 2.1.0changelog section.develop(ci: run on pull requests to develop #469); dependabot targetsdevelop(ci: target develop for dependabot updates #470).<service> - txspans under thecds.spawn - run taskroot (feat: trace queue worker transactions + structured span test infrastructure #465), plus structured in-memory span test infrastructure (MyInMemorySpanExporter) replacing console-log-regex assertions.@sap-cloud-sdk/http-clientexports patched viaObject.defineProperty; added to devDeps so the path runs in CI; cloud-sdk + native-fetch tracing tests (fix: trace Cloud SDK outbound requests (getter-only exports) #451).--forceExitvia forked-pool teardown (chore: migrate test runner from jest to vitest #474).oxfmtcode formatter +format/format:checkscripts + CI check (chore: adopt oxfmt for code formatting #476).MyInMemoryMetricReader(DELTA temporality) instead ofconsole.dirspying; added aConsoleMetricExporterunit test; state-basedexpectEventuallypolling replaces fixed sleeps (test: capture outbox+console metrics via in-memory reader & unit-test ConsoleMetricExporter #479).0.221, with@opentelemetry/sdk-logspinned to0.219viaoverrides(0.221 leaks memory via the log-format re-entrancy — see Memory leak: sdk-logs 0.221 re-enters cds.log.format interception → logging.test.js OOM #482) (chore(deps-dev): bump the OTLP dev-dependency group to 0.221 (pin sdk-logs, #482) #483).preparespan names, and*_storage_time_in_secondsgauges skewed by the machine's UTC offset (test: run full suite on HANA + fix two HANA span/metric bugs (#477 §2, §5) #481).@opentelemetry/sdk-logs0.221's export path — log processors are constructed with the arg shape the installed sdk-logs version expects (version-adaptive), plus a re-entrancy guard; the temporary sdk-logs 0.219 pin (chore(deps-dev): bump the OTLP dev-dependency group to 0.221 (pin sdk-logs, #482) #483) is removed (fix(logging): guard cds.log.format interception against re-entrancy; unpin sdk-logs (#482) #489, closes Memory leak: sdk-logs 0.221 re-enters cds.log.format interception → logging.test.js OOM #482).console.dirspan-scraping in tracing tests — remote/span-name tests now read the in-memory span exporter; dropped the unusedtracing-attributesprofile (test: convert remote/span-name tracing tests to in-memory span exporter; drop tracing-attributes profile (#478) #490, Replace console spying in tests with in-memory exporters #478 group 1).asExternalClient,clearOutbox,flushSpans,eventually,makeExpectEventually,isOutboxScanTrace,meaningful) intotest/utils.js(test: centralize duplicated test helpers into test-utils (#488) #492, Centralize duplicated queue/test helpers (clearOutbox, flushSpans, eventually/expectEventually, meaningful) #488)..cdsrc.jsonprofiles instead ofprocess.env.cds_*string-JSON — removes the load-order fragility behind test: run full suite on HANA + fix two HANA span/metric bugs (#477 §2, §5) #481'sdelete cds.envhack (test: configure via .cdsrc.json profiles instead of process.env.cds_* (#486) #493, Tests configure CDS via process.env.cds_requires_* string-JSON instead of profiles/config #486).TESTING.md(authoritative test doc: sqlite-vs-HANA isolation model, config profiles + load-order gotcha, in-memory exporters,test/utils.jshelpers, HTTP instrumentation, sanctioned skips) and trimmed the duplicated explanatory comments across the test files to one-line pointers (docs: add TESTING.md; trim duplicated test comments to pointers (#487) #494, Add TESTING.md documenting test setup + caveats; reduce scattered comment clutter #487).@cap-js/cds-test, the four OTLP exporters, both OTel instrumentation packages,@sap/cds-mtxs,axios,eslint(chore(deps-dev): bump the dev-dependencies group across 1 directory with 10 updates #485).cds.requires.telemetry.tracing.processor = { kind, config? }(BatchSpanProcessordefault,SimpleSpanProcessorin[development]), replacing the hard-codedNODE_ENVswitch; unknown kinds throw, mirroring the sampler/propagator validation (feat: configurable span processor via telemetry.tracing.processor #498, closes Provide an option to choose between Batch and SimpleSpanProcessor #411).@sap/cds >= 10.1(thecds.spawnfix) instead of unconditional — the 4 suites (tracing-scheduled,tracing-outboxed-batch,tracing-messaging-inboxed,tracing-messaging-persistent-outbox) run the full worker-span path on sqlite when cds ≥ 10.1, skip on older cds / the cds-9 CI leg, and HANA always runs (test: gate sqlite queue-worker tracing skips on @sap/cds >= 10.1 (cds.spawn fix) #467, Eliminate all test skips and CI test-subset exclusions (sqlite + HANA) #477 §1).Follow-ups tracked (not blocking this release)
@sap/cds >= 10.1rather than skipped outright); §3 (7 unimplemented tracing stubs) actionable but out of scope for this release.compiled of: