Per-Instrumentation Configuration via Environment Variables

Aperta
#2,018 2 commenti 1 reazione 1 assegnatario Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

@wpessers ci sta già lavorando.

Dal 30/11/2025.

Valutazione

Questa issue non è ancora stata valutata.

Descrizione

enhancement

Is your feature request related to a problem? Please describe.

Yes. Currently, users cannot configure instrumentation-specific options (like GraphQLInstrumentation.mergeItems, PinoInstrumentation.disableLogSending, etc.) without using global.configureInstrumentations(), which requires code changes and defeats the "zero-code" promise.

The problem: When you define global.configureInstrumentations(), it completely replaces the default instrumentation system. You must manually import and configure ALL instrumentations you want, and OTEL_NODE_ENABLED_INSTRUMENTATIONS is ignored.

Example: To configure GraphQL with mergeItems: true while keeping http, grpc, pg, pino enabled, you must manually import and configure all 5 instrumentations in code, even though you only want to customize GraphQL.

// Must be at the top of handler file, before any imports
global.configureInstrumentations = async () => {
  // Must import ALL instrumentations manually
  const { GraphQLInstrumentation } = await import(
    "@opentelemetry/instrumentation-graphql"
  );
  const { HttpInstrumentation } = await import(
    "@opentelemetry/instrumentation-http"
  );
  const { GrpcInstrumentation } = await import(
    "@opentelemetry/instrumentation-grpc"
  );
  const { PgInstrumentation } = await import(
    "@opentelemetry/instrumentation-pg"
  );
  const { PinoInstrumentation } = await import(
    "@opentelemetry/instrumentation-pino"
  );

  return [
    new GraphQLInstrumentation({ mergeItems: true }), // Only GraphQL needs custom config
    new HttpInstrumentation(), // But must still include all others
    new GrpcInstrumentation(),
    new PgInstrumentation(),
    new PinoInstrumentation(),
  ];
};

Describe the solution you'd like

Add support for OTEL_INSTRUMENTATION_CONFIGS environment variable that accepts a JSON object mapping instrumentation names to their configurations. This works alongside OTEL_NODE_ENABLED_INSTRUMENTATIONS:

# Environment variables only - no code changes needed!
OTEL_NODE_ENABLED_INSTRUMENTATIONS="graphql,http,grpc,pg,pino"
OTEL_INSTRUMENTATION_CONFIGS={"graphql":{"mergeItems":true},"pino":{"disableLogSending":true}}

This would:

  • Use OTEL_NODE_ENABLED_INSTRUMENTATIONS to determine which instrumentations to load (existing behavior)
  • Apply configuration from OTEL_INSTRUMENTATION_CONFIGS to respective instrumentations
  • Use defaults for instrumentations not specified in the config

Implementation: Add loadInstrumentationConfigs() function to parse the env var, and update defaultConfigureInstrumentations() in nodejs/packages/layer/src/wrapper.ts to merge user configs with defaults when creating instrumentations.

Describe alternatives you've considered

  1. Per-instrumentation environment variables (e.g., OTEL_PINO_CONFIG) - Rejected: Would pollute env vars and doesn't scale with 30+ instrumentations
  2. Keep current global.configureInstrumentations() approach - Rejected: Requires code changes, breaks zero-code promise
  3. Configuration file - Rejected: Environment variables are more standard for Lambda and work better with AWS Systems Manager Parameter Store/Secrets Manager

Additional context

Benefits:

  • True zero-code configuration via environment variables
  • Works seamlessly with existing OTEL_NODE_ENABLED_INSTRUMENTATIONS
  • Fully backwards compatible
  • No code changes required in Lambda functions

Affected instrumentations: All 30+ instrumentations in the layer

Tip: React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding +1 or me too, to help us triage it. Learn more here.

Lingua principale
Go
Stelle
433
Fork
249
Merge medio
1g 12h
PR unite (30g)
39

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 open-telemetry/opentelemetry-lambda

Tutte le issue di open-telemetry/opentelemetry-lambda

Issue simili

Altre issue su Go

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.