GraphQL diagnostics_channel tracing publishes non-structured-cloneable payloads in Cloudflare Workers Tail Workers

Aperta
#4,834 5 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
45/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
javascript, typescript

Direzione di ricerca

Inizia con graphql/diagnostics.mjs e resolveDiagnosticsChannel(), quindi riproduci la configurazione di Cloudflare Worker indicata con nodejs_compat, un Tail Worker e una richiesta GraphQL parse/validate/execute. Confronta i punti di emissione del tracing e gli approcci proposti per opt-out, sanitization e serializzazione; il lavoro è completato quando GraphQL.js funziona senza errori di diagnostica del runtime Cloudflare e rimane possibile una strumentazione utile.

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

Descrizione

GraphQL.js 17 resolves node:diagnostics_channel at module load and creates graphql:* tracing channels.

In Cloudflare Workers with nodejs_compat and a Tail Worker attached, Cloudflare forwards diagnostics channel messages to Tail Workers as diagnosticsChannelEvents. That forwarding appears to require structured-cloneable payloads.

GraphQL diagnostic contexts include objects like GraphQLSchema, DocumentNode, Source, execution results, resolver args/results, etc. Some of these are not structured-cloneable. In production this causes Cloudflare runtime log errors like:

Failed to publish diagnostics channel message:

The request itself still succeeds; logs get polluted with runtime errors.

Reproduction shape
  1. Deploy a Cloudflare Worker with:
    • compatibility_flags = ["nodejs_compat"]
    • a Tail Worker configured
    • GraphQL.js 17
  2. Execute a GraphQL request through GraphQL Yoga or direct GraphQL.js parse/validate/execute.
  3. Runtime logs repeatedly show:

Failed to publish diagnostics channel message:

This happens even without application-level OpenTelemetry.

Relevant GraphQL.js behavior

graphql/diagnostics.mjs does:

const dc = resolveDiagnosticsChannel();
export const parseChannel = dc?.tracingChannel('graphql:parse');
export const validateChannel = dc?.tracingChannel('graphql:validate');

and emission sites trace when channel.hasSubscribers is true.

On Cloudflare, Tail forwarding appears to act as a diagnostics subscriber, so tracing is enabled even when the app did not intentionally subscribe to GraphQL diagnostics.

### Expected behavior

GraphQL.js 17 should work in Cloudflare Workers with Tail Workers enabled without runtime diagnostics errors.

Possible fixes:

- expose an official opt-out for GraphQL diagnostics tracing,
- avoid publishing non-structured-cloneable objects by default,
- provide serialization/sanitization hooks,
- or avoid enabling tracing for infrastructure-level diagnostics forwarding.

### Workaround

We patched resolveDiagnosticsChannel() to return undefined, disabling GraphQL diagnostics entirely. That works, but it is brittle and disables useful instrumentation.
Lingua principale
TypeScript
Stelle
20.3k
Fork
2.1k
Merge medio
6h 51m
PR unite (30g)
117

Preparare l'ambiente

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 graphql/graphql-js

Tutte le issue di graphql/graphql-js

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.