Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Using `@sentry/nextjs` and `@sentry/cloudflare` together crashes every request with `context.getValue is not a function`

Aperta
#24,603 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
48/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
nextjs, typescript
Ambito
observability

Direzione di ricerca

Start with packages/server-utils/src/async-context.ts and packages/opentelemetry/src/asyncContextStrategy.ts, comparing how each strategy discovers and reuses AsyncLocalStorage. Run both reproduction snippets and verify that mismatched stores no longer cause getCurrentScope or trace.getSpan to crash; the unsupported combined SDK behavior should remain explicit.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Bug Cloudflare Workers Next.js
Description

A Next.js app on Cloudflare Workers that initializes @sentry/nextjs in instrumentation.ts and also wraps the Worker entry with @sentry/cloudflare's withSentry fails on every request:

TypeError: e.getValue is not a function
    at getScopesFromContext
    at getScopes
    ...
    at _onSpanEnded
    at end

Seen with @sentry/nextjs@11.0.0-rc.1 and @sentry/cloudflare@11.0.0-rc.1, which share the same @sentry/core.

Root cause

The two SDKs install different async context strategies, and the second one reuses the AsyncLocalStorage of the first even though the two strategies put different things into it:

Strategy Installed by ALS store
setAsyncLocalStorageAsyncContextStrategy (packages/server-utils/src/async-context.ts) @sentry/cloudflare (withSentry) { scope, isolationScope }
setOpenTelemetryContextAsyncContextStrategy (packages/opentelemetry/src/asyncContextStrategy.ts) @sentry/nextjs edge build (via @sentry/vercel-edge) an OpenTelemetry Context, also read by the global context manager it registers

Both pick up an existing store like this, without checking which strategy created it (added in #22889):

const existing = getAsyncContextStrategy(getMainCarrier()).getTracingChannelBinding?.()?.asyncLocalStorage;
const asyncLocalStorage = existing ?? new AsyncLocalStorage();

Once the stores are shared, api.context.active() returns the plain { scope, isolationScope } object, and getScopesFromContext(ctx) (or trace.getSpan(ctx)) calls ctx.getValue() on it. It fails in both install orders.

Reproduction

No framework needed:

import { getCurrentScope, withIsolationScope } from '@sentry/core';
import { setAsyncLocalStorageAsyncContextStrategy } from '@sentry/cloudflare';
import { setOpenTelemetryContextAsyncContextStrategy } from '@sentry/opentelemetry';

setAsyncLocalStorageAsyncContextStrategy();
withIsolationScope(() => {
  setOpenTelemetryContextAsyncContextStrategy();
  getCurrentScope(); // TypeError: context.getValue is not a function
});

The reverse order fails the same way:

import { context, trace } from '@opentelemetry/api';

setOpenTelemetryContextAsyncContextStrategy();
setAsyncLocalStorageAsyncContextStrategy();
withIsolationScope(() => {
  trace.getSpan(context.active()); // TypeError: context.getValue is not a function
});
Expected

A strategy only reuses an AsyncLocalStorage that holds the store shape it expects, for example by tagging the binding with its store type and creating a fresh ALS on a mismatch.

This only stops the crash. Two SDKs in one runtime still end up with one active strategy and one current client, so combining @sentry/nextjs and @sentry/cloudflare stays unsupported. It would still be better to fail soft than to break every request. The same clash can happen with any other pair of SDKs that use different strategies.

Lingua principale
TypeScript
Stelle
8.7k
Fork
1.9k
Merge medio
1g 16h
PR unite (30g)
576

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di getsentry/sentry-javascript

Tutte le issue di getsentry/sentry-javascript

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.