The two Remix server instrumentation paths emit different attribute names for the same form-data, so the same app reports differently depending on runtime:
| Runtime |
Path |
Attribute |
| Node |
tracing-channel.ts:255 (diagnostics-channel + orchestrion) |
formData.<key> |
| Cloudflare / Hydrogen |
utils.ts:36 (build-object fill() patching) |
remix.action_form_data.<key> |
@sentry/conventions already settles which is correct:
REMIX_ACTION_FORM_DATA_KEY = 'remix.action_form_data.<key>'
REMIX_ACTION_FORM_DATA_KEY_BASE = 'remix.action_form_data'
So formData.* on the Node path is the deviation, and the Cloudflare path is already spec-compliant. Neither constant is currently imported anywhere in the repo — both call sites hardcode strings.
Scope
packages/remix/src/server/integrations/tracing-channel.ts:255 — use REMIX_ACTION_FORM_DATA_KEY_BASE instead of formData.
packages/remix/src/utils/utils.ts:36 — same string, switch to the constant
packages/remix/test/server/tracing-channel.test.ts:153 and tracing-channel-no-form-data.test.ts:64-65 — update assertions
dev-packages/e2e-tests/test-applications/create-remix-app-express/tests/server-transactions.test.ts:43-44 — asserts formData.text / formData.file; the only non-unit-test pin on the old name, so the change is E2E-verifiable
Why breaking
Renaming a span attribute silently breaks any dashboard, alert, or saved search on formData.* — attributes don't fail loudly, they just stop matching. Needs its own breaking-change changelog entry. A major is the right window to absorb it.
Split out of #21295 to keep that change scoped to the double-gating fix; the two have different rationales and blast radii.
The two Remix server instrumentation paths emit different attribute names for the same form-data, so the same app reports differently depending on runtime:
tracing-channel.ts:255(diagnostics-channel + orchestrion)formData.<key>utils.ts:36(build-objectfill()patching)remix.action_form_data.<key>@sentry/conventionsalready settles which is correct:So
formData.*on the Node path is the deviation, and the Cloudflare path is already spec-compliant. Neither constant is currently imported anywhere in the repo — both call sites hardcode strings.Scope
packages/remix/src/server/integrations/tracing-channel.ts:255— useREMIX_ACTION_FORM_DATA_KEY_BASEinstead offormData.packages/remix/src/utils/utils.ts:36— same string, switch to the constantpackages/remix/test/server/tracing-channel.test.ts:153andtracing-channel-no-form-data.test.ts:64-65— update assertionsdev-packages/e2e-tests/test-applications/create-remix-app-express/tests/server-transactions.test.ts:43-44— assertsformData.text/formData.file; the only non-unit-test pin on the old name, so the change is E2E-verifiableWhy breaking
Renaming a span attribute silently breaks any dashboard, alert, or saved search on
formData.*— attributes don't fail loudly, they just stop matching. Needs its own breaking-change changelog entry. A major is the right window to absorb it.Split out of #21295 to keep that change scoped to the double-gating fix; the two have different rationales and blast radii.