@burdenoff/be-sdk 2026.1002.1 → 2026.1004.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/auth/index.d.ts +3 -3
  2. package/dist/cache/index.d.ts +1 -1
  3. package/dist/cache/index.js +1 -1
  4. package/dist/{chunk-Z32KFAPT.js → chunk-AHEXIONU.js} +4 -4
  5. package/dist/chunk-AHEXIONU.js.map +1 -0
  6. package/dist/{chunk-CPLFP5JK.js → chunk-E5DTAGCA.js} +2 -2
  7. package/dist/chunk-E5DTAGCA.js.map +1 -0
  8. package/dist/{chunk-AIBMTE56.js → chunk-KXY4RSYI.js} +2 -2
  9. package/dist/{chunk-AIBMTE56.js.map → chunk-KXY4RSYI.js.map} +1 -1
  10. package/dist/{chunk-TYLVMGOP.js → chunk-L22J3BYR.js} +3 -3
  11. package/dist/{chunk-TYLVMGOP.js.map → chunk-L22J3BYR.js.map} +1 -1
  12. package/dist/{chunk-RDSYCRHC.js → chunk-NCC5UN3L.js} +13 -12
  13. package/dist/chunk-NCC5UN3L.js.map +1 -0
  14. package/dist/{chunk-G6XPO5D7.js → chunk-OZTLACXT.js} +3 -3
  15. package/dist/{chunk-G6XPO5D7.js.map → chunk-OZTLACXT.js.map} +1 -1
  16. package/dist/{chunk-AFLPUWVI.js → chunk-PVNNVIIA.js} +40 -12
  17. package/dist/chunk-PVNNVIIA.js.map +1 -0
  18. package/dist/{chunk-VKYGGS2F.js → chunk-RFXAHMY4.js} +3 -3
  19. package/dist/{chunk-VKYGGS2F.js.map → chunk-RFXAHMY4.js.map} +1 -1
  20. package/dist/event-queue/index.d.ts +3 -3
  21. package/dist/export/index.js +3 -3
  22. package/dist/feature-flags/index.d.ts +2 -2
  23. package/dist/gateway/index.js +2 -2
  24. package/dist/gateway/security/index.js +1 -1
  25. package/dist/graph/index.d.ts +3 -3
  26. package/dist/{graphql-Dxxpbzr3.d.ts → graphql-AaLJfGzz.d.ts} +1 -1
  27. package/dist/{index-hWpL68Vx.d.ts → index-BKafOO7G.d.ts} +1 -1
  28. package/dist/{index-MsCFY9Ht.d.ts → index-BSlifT21.d.ts} +3 -3
  29. package/dist/{index-B8viwwDM.d.ts → index-CfRZtB99.d.ts} +1 -1
  30. package/dist/{index-BCelo6F3.d.ts → index-Cx5I3ydM.d.ts} +1 -0
  31. package/dist/{index-Cpr38QiE.d.ts → index-DMlr5R6K.d.ts} +2 -2
  32. package/dist/{index-By4Rxoj1.d.ts → index-Drvw0QPe.d.ts} +1 -1
  33. package/dist/{index-BLWIKXin.d.ts → index-Dvv6irk0.d.ts} +1 -1
  34. package/dist/{index-CQGCVFmI.d.ts → index-INu1AlYt.d.ts} +2 -2
  35. package/dist/{index-CUeQCuE5.d.ts → index-_dsCeVat.d.ts} +2 -2
  36. package/dist/index.d.ts +16 -16
  37. package/dist/index.js +10 -10
  38. package/dist/init/index.js +3 -3
  39. package/dist/instrumentation/index.d.ts +3 -3
  40. package/dist/instrumentation/index.js +1 -1
  41. package/dist/logger/index.d.ts +2 -2
  42. package/dist/notifications/index.d.ts +3 -3
  43. package/dist/rbac/index.d.ts +2 -2
  44. package/dist/resource-caps/index.d.ts +2 -2
  45. package/dist/server/index.d.ts +2 -2
  46. package/dist/server/index.js +74 -1
  47. package/dist/server/index.js.map +1 -1
  48. package/dist/telemetry/index.d.ts +4 -4
  49. package/dist/telemetry/index.js +2 -2
  50. package/dist/tracker/index.d.ts +4 -4
  51. package/dist/tracker/index.js +1 -1
  52. package/dist/{types-BAHkj1GE.d.ts → types-Biv0uaJk.d.ts} +17 -1
  53. package/dist/validation/index.js +1 -1
  54. package/package.json +47 -39
  55. package/dist/chunk-AFLPUWVI.js.map +0 -1
  56. package/dist/chunk-CPLFP5JK.js.map +0 -1
  57. package/dist/chunk-RDSYCRHC.js.map +0 -1
  58. package/dist/chunk-Z32KFAPT.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/instrumentation/index.ts","../src/instrumentation/tracer.ts","../src/telemetry/logger-state.ts","../src/instrumentation/types.ts","../src/instrumentation/graphql-plugin.ts","../src/instrumentation/decorators.ts"],"names":["SpanStatus","SpanKind","generateTraceId","bytes","Uint8Array","crypto","getRandomValues","Array","from","map","b","toString","padStart","join","generateSpanId","InMemorySpan","name","traceId","spanId","parentSpanId","kind","startTime","endTime","status","attributes","events","isRecording","onEnd","parentContext","Date","now","setAttribute","key","value","setAttributes","Object","assign","setStatus","message","recordException","error","stack","addEvent","push","timestamp","end","getSpanContext","traceFlags","NoOpSpan","Tracer","serviceName","activeSpans","Map","currentSpan","spanListeners","isEnabled","isInstrumentationConfigInitialized","isFeatureEnabled","startSpan","config","getInstrumentationConfig","tracing","ignoredOperations","includes","parent","span","completedSpan","onSpanEnd","serviceVersion","environment","resourceAttributes","set","startSpanFromContext","context","operationName","operationType","actorId","tenantId","workspaceId","requestId","getCurrentSpan","getTraceContext","spanContext","setCurrentSpan","withSpan","fn","result","Error","withSpanSync","addSpanListener","listener","removeSpanListener","index","indexOf","splice","delete","get","exporterType","logSpan","logger","duration","debug","eventCount","length","getActiveSpanCount","size","clearActiveSpans","clear","globalTracer","initializeTracer","getTracer","isTracerInitialized","extractTraceContext","headers","traceparent","undefined","isArray","parts","split","parseInt","isRemote","injectTraceContext","activeTelemetryLogger","setActiveTelemetryLogger","getActiveTelemetryLogger","STANDARD_METRICS","HTTP_REQUEST_DURATION","description","type","unit","labelKeys","boundaries","HTTP_REQUEST_TOTAL","HTTP_REQUEST_SIZE","HTTP_RESPONSE_SIZE","GRAPHQL_OPERATION_DURATION","GRAPHQL_OPERATION_TOTAL","GRAPHQL_RESOLVER_DURATION","DB_QUERY_DURATION","DB_QUERY_TOTAL","DB_CONNECTION_POOL_SIZE","CACHE_OPERATION_DURATION","CACHE_HIT_TOTAL","CACHE_MISS_TOTAL","OPERATION_DURATION","OPERATION_TOTAL","ACTIVE_OPERATIONS","RESOURCE_CAPS_PLAN_RESOLUTION","RESOURCE_CAPS_ENFORCEMENT","RESOURCE_CAPS_CLIENTLESS_FALLBACK","require","createRequire","url","prometheusPluginFactory","prometheusLoadAttempted","loadPrometheusPlugin","module","usePrometheus","info","warn","createPrometheusPlugin","options","pluginFactory","endpoint","skipIntrospection","metrics","graphql_yoga_http_duration","httpDuration","graphql_envelop_request_duration","requestDuration","graphql_envelop_request_time_summary","graphql_envelop_request","requestCount","graphql_envelop_error_result","errorCount","graphql_envelop_deprecated_field","deprecatedFields","graphql_envelop_phase_parse","parsePhase","graphql_envelop_phase_validate","validatePhase","graphql_envelop_phase_context","contextPhase","graphql_envelop_phase_execute","executePhase","graphql_envelop_phase_subscribe","graphql_envelop_schema_change","graphql_envelop_execute_resolver","resolverMetrics","instrumentResolvers","isPrometheusAvailable","apolloInlineTracePluginFactory","apolloInlineTraceLoadAttempted","loadApolloInlineTracePlugin","useApolloInlineTrace","createApolloInlineTracePlugin","_options","isApolloInlineTraceAvailable","createGraphQLMetrics","def","operationDuration","createHistogram","operationTotal","createCounter","operationErrors","resolverDuration","resolverTotal","graphqlMetrics","getGraphQLMetrics","extractOperationInfo","args","definitions","document","operation","loc","source","body","variables","variableValues","shouldIgnoreOperation","ignoredOps","graphql","createGraphQLInstrumentationPlugin","onExecute","operationInfo","tracer","spanName","SERVER","includeDocument","substring","includeVariables","JSON","stringify","contextValue","_instrumentation","onExecuteDone","hasErrors","errors","labels","operation_type","operation_name","record","inc","ERROR","e","OK","includeResult","instrumentResolver","resolver","typeName","fieldName","includeResolvers","INTERNAL","includeArgs","type_name","field_name","instrumentResolverMap","resolverMap","fields","entries","excludeTypes","includeTypes","fullName","excludeFields","getGraphQLOperationFromContext","instrumentedContext","getGraphQLSpanFromContext","Trace","target","propertyKey","descriptor","originalMethod","className","methodName","String","apply","skip","shouldSkip","extractAttributes","extractedAttrs","Metric","baseName","toLowerCase","durationHistogram","totalCounter","errorCounter","hasError","recordDuration","recordCount","Log","level","logEntry","logExit","logError","baseMessage","entryData","class","method","exitData","shouldSkipInstrumentation","skipOption","startInstrumentationSpan","traceOpts","extractFn","logInstrumentationEntry","logOpts","handleInstrumentationSuccess","handleInstrumentationError","recordInstrumentationMetrics","metricOpts","labelsFn","labelsObj","logInstrumentationExit","Instrument","trace","log","traced","instrumented","getLogger","defaultLogger","initializeInstrumentation","initConfig","initTracer","initMetrics","getTracerFn","getMetricsFn","getConfig","isInstrumentationInitialized","isConfigInit","isTracerInit","isMetricsInit","resetInstrumentation","resetConfig","resetMetrics","setupInstrumentation","plugins","useApollo","apolloPlugin","prometheusPlugin","prometheus"],"mappings":"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","file":"chunk-CPLFP5JK.js","sourcesContent":["/**\n * Instrumentation Module\n *\n * Comprehensive OpenTelemetry instrumentation utilities for\n * Burdenoff microservices including tracing, metrics, and logging.\n *\n * @module instrumentation\n * @category Observability\n *\n * @example\n * ```typescript\n * import {\n * initializeInstrumentation,\n * getTracer,\n * createCounter,\n * createGraphQLInstrumentationPlugin,\n * Trace,\n * Instrument,\n * } from '@burdenoff/be-sdk/instrumentation';\n *\n * // Initialize instrumentation\n * const { tracer, metrics } = initializeInstrumentation('my-service');\n *\n * // Create a span\n * await tracer.withSpan('operation', async (span) => {\n * span.setAttribute('key', 'value');\n * // ... operation logic\n * });\n *\n * // Use decorators\n * class MyService {\n * @Trace()\n * async myMethod() { ... }\n *\n * @Instrument({ tracing: true, metrics: true, logging: true })\n * async trackedMethod() { ... }\n * }\n * ```\n */\n\n// Internal imports for initialization functions\nimport {\n getInstrumentationConfig as getConfig,\n initializeInstrumentationConfig as initConfig,\n isInstrumentationConfigInitialized as isConfigInit,\n resetInstrumentationConfig as resetConfig,\n} from './config.js';\nimport {\n getMetricsRegistry as getMetricsFn,\n initializeMetricsRegistry as initMetrics,\n isMetricsRegistryInitialized as isMetricsInit,\n resetMetricsRegistry as resetMetrics,\n} from './metrics-collector.js';\nimport {\n getTracer as getTracerFn,\n initializeTracer as initTracer,\n isTracerInitialized as isTracerInit,\n} from './tracer.js';\nimport { logger as defaultLogger, type Logger } from '../logger/index.js';\nimport { getActiveTelemetryLogger } from '../telemetry/logger-state.js';\n\n// ============================================================================\n// Simplified Setup API\n// ============================================================================\n\nimport {\n createApolloInlineTracePlugin,\n createPrometheusPlugin,\n type PrometheusPluginOptions,\n} from './graphql-plugin.js';\n\n// Configuration exports\nexport {\n buildDatabaseConfig,\n buildFeatureFlags,\n buildGraphQLConfig,\n buildInstrumentationConfig,\n buildMetricsConfig,\n buildTracingConfig,\n DEFAULT_CACHE_CONFIG,\n DEFAULT_DATABASE_CONFIG,\n DEFAULT_EVENT_QUEUE_CONFIG,\n DEFAULT_FEATURE_FLAGS,\n DEFAULT_GRAPHQL_CONFIG,\n DEFAULT_HTTP_CONFIG,\n DEFAULT_LOGGING_CONFIG,\n DEFAULT_METRICS_CONFIG,\n DEFAULT_TRACING_CONFIG,\n ENV_VARS,\n getInstrumentationConfig,\n initializeInstrumentationConfig,\n isFeatureEnabled,\n isInstrumentationConfigInitialized,\n resetInstrumentationConfig,\n updateInstrumentationConfig,\n} from './config.js';\n\n// Tracer exports\nexport {\n extractTraceContext,\n getTraceContext,\n getTracer,\n initializeTracer,\n injectTraceContext,\n isTracerInitialized,\n type Span,\n type SpanEvent,\n SpanKind,\n SpanStatus,\n startSpan,\n Tracer,\n withSpan,\n} from './tracer.js';\n\n// Metrics exports\nexport {\n type Counter,\n createCounter,\n createGauge,\n createHistogram,\n createUpDownCounter,\n type Gauge,\n getMetricsRegistry,\n type Histogram,\n initializeMetricsRegistry,\n isMetricsRegistryInitialized,\n type MetricLabels,\n MetricsRegistry,\n resetMetricsRegistry,\n type UpDownCounter,\n} from './metrics-collector.js';\n\n// Decorator exports\nexport { Instrument, instrumented, Log, Metric, Trace, traced } from './decorators.js';\n\n// GraphQL plugin exports\nexport {\n type ApolloInlineTraceOptions,\n createApolloInlineTracePlugin,\n createGraphQLInstrumentationPlugin,\n createPrometheusPlugin,\n extractOperationInfo,\n getGraphQLOperationFromContext,\n getGraphQLSpanFromContext,\n type GraphQLOperationInfo,\n type GraphQLOperationType,\n instrumentResolver,\n instrumentResolverMap,\n type InstrumentationContextExtension,\n isApolloInlineTraceAvailable,\n isPrometheusAvailable,\n type PrometheusPluginOptions,\n} from './graphql-plugin.js';\n\n// Type exports\nexport type {\n CacheInstrumentationConfig,\n DatabaseInstrumentationConfig,\n EventQueueInstrumentationConfig,\n GraphQLInstrumentationConfig,\n HTTPInstrumentationConfig,\n InstrumentationConfig,\n InstrumentationFeatureFlags,\n LoggingConfig,\n MetricDefinition,\n MetricsConfig,\n OperationContext,\n SpanAttributes,\n SpanContext,\n TraceContext,\n TracingConfig,\n} from './types.js';\n\nexport { STANDARD_METRICS } from './types.js';\n\n// Re-export logger for convenience\nexport { logger } from '../logger/index.js';\n\nexport function getLogger(): Logger {\n return getActiveTelemetryLogger() ?? defaultLogger;\n}\n\n/**\n * Options for initializing instrumentation\n */\nexport interface InitializeInstrumentationOptions {\n features?: Partial<import('./types.js').InstrumentationFeatureFlags>;\n tracing?: Partial<import('./types.js').TracingConfig>;\n metrics?: Partial<import('./types.js').MetricsConfig>;\n logging?: Partial<import('./types.js').LoggingConfig>;\n graphql?: Partial<import('./types.js').GraphQLInstrumentationConfig>;\n database?: Partial<import('./types.js').DatabaseInstrumentationConfig>;\n http?: Partial<import('./types.js').HTTPInstrumentationConfig>;\n cache?: Partial<import('./types.js').CacheInstrumentationConfig>;\n eventQueue?: Partial<import('./types.js').EventQueueInstrumentationConfig>;\n}\n\n/**\n * Initialize all instrumentation components\n *\n * This is a convenience function that initializes the tracer, metrics registry,\n * and instrumentation configuration in one call.\n *\n * @param serviceName - Name of the service for tracing and metrics\n * @param options - Optional configuration overrides\n * @returns Initialized instrumentation components\n *\n * @example\n * ```typescript\n * const { tracer, metrics, config } = initializeInstrumentation('my-service', {\n * features: { tracing: true, metrics: true, logging: true },\n * tracing: { samplingRate: 0.5 },\n * });\n * ```\n */\nexport function initializeInstrumentation(\n serviceName: string,\n options?: InitializeInstrumentationOptions\n): {\n tracer: import('./tracer.js').Tracer;\n metrics: import('./metrics-collector.js').MetricsRegistry;\n config: import('./types.js').InstrumentationConfig;\n} {\n // Initialize configuration - cast options to the expected type\n // The buildInstrumentationConfig function handles merging with defaults\n initConfig(serviceName, options as unknown as Partial<import('./types.js').InstrumentationConfig>);\n\n // Initialize tracer\n initTracer(serviceName);\n\n // Initialize metrics registry\n initMetrics(serviceName);\n\n return {\n tracer: getTracerFn(),\n metrics: getMetricsFn(),\n config: getConfig(),\n };\n}\n\n/**\n * Check if instrumentation is fully initialized\n */\nexport function isInstrumentationInitialized(): boolean {\n return isConfigInit() && isTracerInit() && isMetricsInit();\n}\n\n/**\n * Reset all instrumentation state (useful for testing)\n */\nexport function resetInstrumentation(): void {\n resetConfig();\n resetMetrics();\n}\n\n/**\n * Options for simplified instrumentation setup\n */\nexport interface SetupInstrumentationOptions extends InitializeInstrumentationOptions {\n /**\n * Use Apollo Federation inline tracing for automatic resolver/field-level tracing.\n * This is the recommended approach for microservices in a federated architecture.\n * @default true\n */\n useApolloInlineTrace?: boolean;\n\n /**\n * Use Prometheus metrics plugin for automatic GraphQL operation metrics.\n * This provides comprehensive metrics including:\n * - HTTP request duration\n * - GraphQL operation duration\n * - Error counts\n * - Execution phase metrics\n * - Optional resolver-level metrics\n * @default true\n */\n usePrometheus?: boolean;\n\n /**\n * Prometheus plugin configuration options.\n * Only used if usePrometheus is true.\n */\n prometheus?: PrometheusPluginOptions;\n}\n\n/**\n * Result of instrumentation setup\n */\nexport interface InstrumentationSetupResult {\n /** Initialized tracer instance */\n tracer: import('./tracer.js').Tracer;\n /** Initialized metrics registry */\n metrics: import('./metrics-collector.js').MetricsRegistry;\n /** Full instrumentation configuration */\n config: import('./types.js').InstrumentationConfig;\n /**\n * GraphQL Yoga plugins to add to your server.\n * These provide automatic tracing and metrics without manual instrumentation.\n */\n plugins: unknown[];\n}\n\n/**\n * Set up complete instrumentation for a microservice with minimal configuration.\n *\n * This is the recommended way to set up instrumentation in Burdenoff microservices.\n * It automatically configures:\n * - OpenTelemetry tracing with Apollo Federation inline traces\n * - Metrics collection\n * - GraphQL operation logging\n *\n * All you need to do is pass the returned plugins to your GraphQL Yoga server.\n *\n * @param serviceName - Name of your service (e.g., 'module-tags')\n * @param options - Optional overrides for defaults\n * @returns Instrumentation components and GraphQL plugins\n *\n * @example\n * ```typescript\n * import { setupInstrumentation } from '@burdenoff/be-sdk/instrumentation';\n * import { createYoga } from 'graphql-yoga';\n *\n * // Simple setup with all defaults\n * const { plugins, tracer, metrics } = setupInstrumentation('module-tags');\n *\n * // Create Yoga server with automatic tracing\n * const yoga = createYoga({\n * schema,\n * plugins: [...plugins, ...otherPlugins],\n * });\n *\n * // With custom overrides\n * const { plugins } = setupInstrumentation('module-tags', {\n * tracing: { samplingRate: 0.5 },\n * metrics: { metricPrefix: 'tags' },\n * });\n * ```\n */\nexport function setupInstrumentation(\n serviceName: string,\n options?: SetupInstrumentationOptions\n): InstrumentationSetupResult {\n // Initialize core instrumentation\n const { tracer, metrics, config } = initializeInstrumentation(serviceName, options);\n\n // Build plugin list\n const plugins: unknown[] = [];\n\n // Add Apollo inline trace plugin for automatic resolver/field-level tracing\n // This provides distributed tracing across federated services\n const useApollo = options?.useApolloInlineTrace ?? true;\n if (useApollo) {\n const apolloPlugin = createApolloInlineTracePlugin();\n if (apolloPlugin) {\n plugins.push(apolloPlugin);\n }\n }\n\n // Add Prometheus metrics plugin for automatic GraphQL metrics\n // This provides comprehensive metrics without manual instrumentation\n const usePrometheus = options?.usePrometheus ?? true;\n if (usePrometheus) {\n const prometheusPlugin = createPrometheusPlugin(options?.prometheus);\n if (prometheusPlugin) {\n plugins.push(prometheusPlugin);\n }\n }\n\n return {\n tracer,\n metrics,\n config,\n plugins,\n };\n}\n","/**\n * Tracer Module\n *\n * OpenTelemetry tracing utilities for distributed tracing across\n * Burdenoff microservices. Provides span creation, context propagation,\n * and trace management.\n *\n * @module instrumentation/tracer\n * @category Observability\n */\n\nimport { logger } from '../logger/index.js';\nimport { getInstrumentationConfig, isFeatureEnabled, isInstrumentationConfigInitialized } from './config.js';\nimport type { OperationContext, SpanAttributes, SpanContext, TraceContext } from './types.js';\n\n/**\n * Span status\n */\nexport enum SpanStatus {\n UNSET = 0,\n OK = 1,\n ERROR = 2,\n}\n\n/**\n * Span kind\n */\nexport enum SpanKind {\n INTERNAL = 0,\n SERVER = 1,\n CLIENT = 2,\n PRODUCER = 3,\n CONSUMER = 4,\n}\n\n/**\n * Span interface for tracing operations\n */\nexport interface Span {\n /** Span name */\n name: string;\n /** Trace ID */\n traceId: string;\n /** Span ID */\n spanId: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Span kind */\n kind: SpanKind;\n /** Start time in milliseconds */\n startTime: number;\n /** End time in milliseconds */\n endTime?: number;\n /** Span status */\n status: SpanStatus;\n /** Span attributes */\n attributes: SpanAttributes;\n /** Events recorded in this span */\n events: SpanEvent[];\n /** Whether the span is recording */\n isRecording: boolean;\n\n /** Set an attribute on the span */\n setAttribute(key: string, value: string | number | boolean): Span;\n /** Set multiple attributes on the span */\n setAttributes(attributes: SpanAttributes): Span;\n /** Set the span status */\n setStatus(status: SpanStatus, message?: string): Span;\n /** Record an exception */\n recordException(error: Error): Span;\n /** Add an event to the span */\n addEvent(name: string, attributes?: SpanAttributes): Span;\n /** End the span */\n end(): void;\n /** Get span context for propagation */\n getSpanContext(): SpanContext;\n}\n\n/**\n * Span event\n */\nexport interface SpanEvent {\n name: string;\n timestamp: number;\n attributes?: SpanAttributes;\n}\n\n/**\n * Generate a random trace ID (32 hex characters)\n */\nfunction generateTraceId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Generate a random span ID (16 hex characters)\n */\nfunction generateSpanId(): string {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * In-memory span implementation\n */\nclass InMemorySpan implements Span {\n name: string;\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n kind: SpanKind;\n startTime: number;\n endTime?: number;\n status: SpanStatus = SpanStatus.UNSET;\n attributes: SpanAttributes = {};\n events: SpanEvent[] = [];\n isRecording = true;\n\n private onEnd?: (span: Span) => void;\n\n constructor(\n name: string,\n kind: SpanKind = SpanKind.INTERNAL,\n parentContext?: SpanContext,\n onEnd?: (span: Span) => void\n ) {\n this.name = name;\n this.kind = kind;\n this.startTime = Date.now();\n this.spanId = generateSpanId();\n this.onEnd = onEnd;\n\n if (parentContext) {\n this.traceId = parentContext.traceId;\n this.parentSpanId = parentContext.spanId;\n } else {\n this.traceId = generateTraceId();\n }\n }\n\n setAttribute(key: string, value: string | number | boolean): Span {\n if (this.isRecording) {\n this.attributes[key] = value;\n }\n return this;\n }\n\n setAttributes(attributes: SpanAttributes): Span {\n if (this.isRecording) {\n Object.assign(this.attributes, attributes);\n }\n return this;\n }\n\n setStatus(status: SpanStatus, message?: string): Span {\n this.status = status;\n if (message) {\n this.attributes['status.message'] = message;\n }\n return this;\n }\n\n recordException(error: Error): Span {\n this.status = SpanStatus.ERROR;\n this.attributes['error'] = true;\n this.attributes['error.type'] = error.name;\n this.attributes['error.message'] = error.message;\n if (error.stack) {\n this.attributes['error.stack'] = error.stack;\n }\n this.addEvent('exception', {\n 'exception.type': error.name,\n 'exception.message': error.message,\n });\n return this;\n }\n\n addEvent(name: string, attributes?: SpanAttributes): Span {\n if (this.isRecording) {\n this.events.push({\n name,\n timestamp: Date.now(),\n attributes,\n });\n }\n return this;\n }\n\n end(): void {\n if (!this.isRecording) return;\n\n this.endTime = Date.now();\n this.isRecording = false;\n\n if (this.onEnd) {\n this.onEnd(this);\n }\n }\n\n getSpanContext(): SpanContext {\n return {\n traceId: this.traceId,\n spanId: this.spanId,\n traceFlags: this.status === SpanStatus.ERROR ? 1 : 0,\n };\n }\n}\n\n/**\n * No-op span for when tracing is disabled\n */\nclass NoOpSpan implements Span {\n name = '';\n traceId = '';\n spanId = '';\n kind = SpanKind.INTERNAL;\n startTime = 0;\n status = SpanStatus.UNSET;\n attributes: SpanAttributes = {};\n events: SpanEvent[] = [];\n isRecording = false;\n\n setAttribute(): Span {\n return this;\n }\n setAttributes(): Span {\n return this;\n }\n setStatus(): Span {\n return this;\n }\n recordException(): Span {\n return this;\n }\n addEvent(): Span {\n return this;\n }\n end(): void {}\n getSpanContext(): SpanContext {\n return { traceId: '', spanId: '', traceFlags: 0 };\n }\n}\n\n/**\n * Tracer class for creating and managing spans\n */\nexport class Tracer {\n private serviceName: string;\n private activeSpans: Map<string, Span> = new Map();\n private currentSpan: Span | null = null;\n private spanListeners: Array<(span: Span) => void> = [];\n\n constructor(serviceName: string) {\n this.serviceName = serviceName;\n }\n\n /**\n * Check if tracing is enabled\n */\n isEnabled(): boolean {\n return isInstrumentationConfigInitialized() && isFeatureEnabled('tracing');\n }\n\n /**\n * Start a new span\n */\n startSpan(name: string, kind: SpanKind = SpanKind.INTERNAL, parentContext?: SpanContext): Span {\n if (!this.isEnabled()) {\n return new NoOpSpan();\n }\n\n const config = getInstrumentationConfig();\n\n // Check if operation should be ignored\n if (config.tracing.ignoredOperations?.includes(name)) {\n return new NoOpSpan();\n }\n\n // Use current span as parent if no parent provided\n const parent = parentContext || this.currentSpan?.getSpanContext();\n\n const span = new InMemorySpan(name, kind, parent, (completedSpan) => {\n this.onSpanEnd(completedSpan);\n });\n\n // Add service attributes\n span.setAttributes({\n 'service.name': this.serviceName,\n 'service.version': config.tracing.serviceVersion || '1.0.0',\n 'deployment.environment': config.tracing.environment || 'development',\n });\n\n // Add custom resource attributes\n if (config.tracing.resourceAttributes) {\n span.setAttributes(config.tracing.resourceAttributes);\n }\n\n // Track active span\n this.activeSpans.set(span.spanId, span);\n this.currentSpan = span;\n\n return span;\n }\n\n /**\n * Start a span from operation context\n */\n startSpanFromContext(context: OperationContext, kind: SpanKind = SpanKind.INTERNAL): Span {\n const span = this.startSpan(context.operationName, kind);\n\n if (span.isRecording) {\n span.setAttributes({\n 'operation.type': context.operationType,\n ...(context.actorId && { 'actor.id': context.actorId }),\n ...(context.tenantId && { 'tenant.id': context.tenantId }),\n ...(context.workspaceId && { 'workspace.id': context.workspaceId }),\n ...(context.requestId && { 'request.id': context.requestId }),\n ...context.attributes,\n });\n }\n\n return span;\n }\n\n /**\n * Get current active span\n */\n getCurrentSpan(): Span | null {\n return this.currentSpan;\n }\n\n /**\n * Get current trace context for logging\n */\n getTraceContext(): TraceContext {\n if (!this.currentSpan || !this.isEnabled()) {\n return {};\n }\n\n const spanContext = this.currentSpan.getSpanContext();\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n traceFlags: spanContext.traceFlags,\n parentSpanId: this.currentSpan.parentSpanId,\n };\n }\n\n /**\n * Set current span (for context propagation)\n */\n setCurrentSpan(span: Span): void {\n this.currentSpan = span;\n }\n\n /**\n * Run a function within a span\n */\n async withSpan<T>(\n name: string,\n fn: (span: Span) => Promise<T>,\n kind: SpanKind = SpanKind.INTERNAL,\n parentContext?: SpanContext\n ): Promise<T> {\n const span = this.startSpan(name, kind, parentContext);\n\n try {\n const result = await fn(span);\n span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }\n\n /**\n * Run a synchronous function within a span\n */\n withSpanSync<T>(\n name: string,\n fn: (span: Span) => T,\n kind: SpanKind = SpanKind.INTERNAL,\n parentContext?: SpanContext\n ): T {\n const span = this.startSpan(name, kind, parentContext);\n\n try {\n const result = fn(span);\n span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }\n\n /**\n * Add a listener for completed spans\n */\n addSpanListener(listener: (span: Span) => void): void {\n this.spanListeners.push(listener);\n }\n\n /**\n * Remove a span listener\n */\n removeSpanListener(listener: (span: Span) => void): void {\n const index = this.spanListeners.indexOf(listener);\n if (index !== -1) {\n this.spanListeners.splice(index, 1);\n }\n }\n\n /**\n * Handle span completion\n */\n private onSpanEnd(span: Span): void {\n // Remove from active spans\n this.activeSpans.delete(span.spanId);\n\n // Update current span to parent if this was the current span\n if (this.currentSpan?.spanId === span.spanId) {\n if (span.parentSpanId) {\n this.currentSpan = this.activeSpans.get(span.parentSpanId) || null;\n } else {\n this.currentSpan = null;\n }\n }\n\n // Log span if console exporter enabled\n const config = getInstrumentationConfig();\n if (config.tracing.exporterType === 'console') {\n this.logSpan(span);\n }\n\n // Notify listeners\n for (const listener of this.spanListeners) {\n try {\n listener(span);\n } catch (error) {\n logger.error('[Tracer] Error in span listener:', error);\n }\n }\n }\n\n /**\n * Log span to console (for debugging)\n */\n private logSpan(span: Span): void {\n const duration = span.endTime ? span.endTime - span.startTime : 0;\n\n logger.debug('[Tracer] Span completed', {\n name: span.name,\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n kind: SpanKind[span.kind],\n status: SpanStatus[span.status],\n duration: `${duration}ms`,\n attributes: span.attributes,\n eventCount: span.events.length,\n });\n }\n\n /**\n * Get active span count\n */\n getActiveSpanCount(): number {\n return this.activeSpans.size;\n }\n\n /**\n * Clear all active spans (for testing)\n */\n clearActiveSpans(): void {\n this.activeSpans.clear();\n this.currentSpan = null;\n }\n}\n\n/**\n * Global tracer instance\n */\nlet globalTracer: Tracer | null = null;\n\n/**\n * Initialize global tracer\n */\nexport function initializeTracer(serviceName: string): Tracer {\n globalTracer = new Tracer(serviceName);\n return globalTracer;\n}\n\n/**\n * Get global tracer instance\n */\nexport function getTracer(): Tracer {\n if (!globalTracer) {\n // Return a default tracer if not initialized\n globalTracer = new Tracer('unknown-service');\n }\n return globalTracer;\n}\n\n/**\n * Check if tracer is initialized\n */\nexport function isTracerInitialized(): boolean {\n return globalTracer !== null;\n}\n\n/**\n * Convenience function to start a span\n */\nexport function startSpan(name: string, kind: SpanKind = SpanKind.INTERNAL, parentContext?: SpanContext): Span {\n return getTracer().startSpan(name, kind, parentContext);\n}\n\n/**\n * Convenience function to run code within a span\n */\nexport async function withSpan<T>(\n name: string,\n fn: (span: Span) => Promise<T>,\n kind: SpanKind = SpanKind.INTERNAL\n): Promise<T> {\n return getTracer().withSpan(name, fn, kind);\n}\n\n/**\n * Convenience function to get current trace context\n */\nexport function getTraceContext(): TraceContext {\n return getTracer().getTraceContext();\n}\n\n/**\n * Extract trace context from HTTP headers (W3C Trace Context format)\n */\nexport function extractTraceContext(headers: Record<string, string | string[] | undefined>): SpanContext | undefined {\n const traceparent = headers['traceparent'];\n if (!traceparent) return undefined;\n\n const value = Array.isArray(traceparent) ? traceparent[0] : traceparent;\n if (!value) return undefined;\n\n // Parse W3C traceparent: version-trace_id-parent_id-trace_flags\n const parts = value.split('-');\n if (parts.length !== 4) return undefined;\n\n const [, traceId, spanId, traceFlags] = parts;\n if (!traceId || !spanId || traceId.length !== 32 || spanId.length !== 16) {\n return undefined;\n }\n\n return {\n traceId,\n spanId,\n traceFlags: parseInt(traceFlags || '0', 16),\n isRemote: true,\n };\n}\n\n/**\n * Inject trace context into HTTP headers (W3C Trace Context format)\n */\nexport function injectTraceContext(headers: Record<string, string>, spanContext?: SpanContext): void {\n const context = spanContext || getTracer().getCurrentSpan()?.getSpanContext();\n if (!context || !context.traceId || !context.spanId) return;\n\n // Format: version-trace_id-parent_id-trace_flags\n headers['traceparent'] =\n `00-${context.traceId}-${context.spanId}-${context.traceFlags.toString(16).padStart(2, '0')}`;\n}\n","import type { Logger } from '../logger/index.js';\n\nlet activeTelemetryLogger: Logger | undefined;\n\nexport function setActiveTelemetryLogger(logger: Logger): void {\n activeTelemetryLogger = logger;\n}\n\nexport function getActiveTelemetryLogger(): Logger | undefined {\n return activeTelemetryLogger;\n}\n","/**\n * Instrumentation Types\n *\n * Type definitions for OpenTelemetry instrumentation configuration\n * and utilities used across all Burdenoff microservices.\n *\n * @module instrumentation/types\n * @category Observability\n */\n\n/**\n * Instrumentation feature flags for conditional enable/disable\n */\nexport interface InstrumentationFeatureFlags {\n /** Enable distributed tracing with spans */\n tracing: boolean;\n /** Enable metrics collection (counters, histograms, gauges) */\n metrics: boolean;\n /** Enable enhanced logging with trace context */\n logging: boolean;\n /** Enable GraphQL resolver instrumentation */\n graphql: boolean;\n /** Enable database query instrumentation */\n database: boolean;\n /** Enable HTTP request/response instrumentation */\n http: boolean;\n /** Enable cache operation instrumentation */\n cache: boolean;\n /** Enable event queue instrumentation */\n eventQueue: boolean;\n}\n\n/**\n * Tracing configuration\n */\nexport interface TracingConfig {\n /** Enable tracing (default: true when instrumentation enabled) */\n enabled: boolean;\n /** Service name for traces */\n serviceName: string;\n /** Service version */\n serviceVersion?: string;\n /** Environment (development, staging, production) */\n environment?: string;\n /** OTLP exporter endpoint (e.g., http://localhost:4318) */\n exporterEndpoint?: string;\n /** Exporter type: 'otlp' | 'console' | 'none' */\n exporterType?: 'otlp' | 'console' | 'none';\n /** Trace sampling rate (0-1, default: 1.0) */\n samplingRate?: number;\n /** Propagation format: 'w3c' | 'b3' | 'jaeger' */\n propagationFormat?: 'w3c' | 'b3' | 'jaeger';\n /** Additional resource attributes */\n resourceAttributes?: Record<string, string>;\n /** Ignored routes (won't create spans) */\n ignoredRoutes?: string[];\n /** Ignored operations (won't create spans) */\n ignoredOperations?: string[];\n}\n\n/**\n * Metrics configuration\n */\nexport interface MetricsConfig {\n /** Enable metrics (default: true when instrumentation enabled) */\n enabled: boolean;\n /** Service name for metrics */\n serviceName: string;\n /** OTLP exporter endpoint */\n exporterEndpoint?: string;\n /** Exporter type: 'otlp' | 'prometheus' | 'console' | 'none' */\n exporterType?: 'otlp' | 'prometheus' | 'console' | 'none';\n /** Prometheus metrics endpoint (default: /metrics) */\n prometheusEndpoint?: string;\n /** Prometheus metrics port (default: 9090) */\n prometheusPort?: number;\n /** Metrics collection interval in ms (default: 60000) */\n collectInterval?: number;\n /** Enable default runtime metrics (CPU, memory, etc.) */\n defaultMetrics?: boolean;\n /** Custom metric prefix */\n metricPrefix?: string;\n}\n\n/**\n * Logging configuration for instrumentation\n */\nexport interface LoggingConfig {\n /** Enable trace context in logs */\n enabled: boolean;\n /** Include trace ID in logs */\n includeTraceId?: boolean;\n /** Include span ID in logs */\n includeSpanId?: boolean;\n /** Include trace flags in logs */\n includeTraceFlags?: boolean;\n /** Log level for instrumentation messages */\n level?: 'debug' | 'info' | 'warn' | 'error';\n}\n\n/**\n * GraphQL instrumentation configuration\n */\nexport interface GraphQLInstrumentationConfig {\n /** Enable GraphQL instrumentation */\n enabled: boolean;\n /** Include query/mutation in span attributes */\n includeDocument?: boolean;\n /** Include variables in span attributes (be careful with sensitive data) */\n includeVariables?: boolean;\n /** Include result in span attributes */\n includeResult?: boolean;\n /** Depth to which to serialize document */\n documentDepth?: number;\n /** Operations to ignore */\n ignoredOperations?: string[];\n /** Include resolver-level spans */\n includeResolvers?: boolean;\n /** Max depth for resolver spans */\n resolverSpanDepth?: number;\n}\n\n/**\n * Database instrumentation configuration\n */\nexport interface DatabaseInstrumentationConfig {\n /** Enable database instrumentation */\n enabled: boolean;\n /** Include SQL query in span attributes */\n includeStatement?: boolean;\n /** Include query parameters (be careful with sensitive data) */\n includeParameters?: boolean;\n /** Include row count in span attributes */\n includeRowCount?: boolean;\n /** Slow query threshold in ms (logs warning if exceeded) */\n slowQueryThreshold?: number;\n /** Operations to ignore */\n ignoredOperations?: string[];\n}\n\n/**\n * HTTP instrumentation configuration\n */\nexport interface HTTPInstrumentationConfig {\n /** Enable HTTP instrumentation */\n enabled: boolean;\n /** Include request headers */\n includeRequestHeaders?: boolean;\n /** Include response headers */\n includeResponseHeaders?: boolean;\n /** Include request body (be careful with sensitive data) */\n includeRequestBody?: boolean;\n /** Include response body */\n includeResponseBody?: boolean;\n /** Headers to redact */\n redactedHeaders?: string[];\n /** Routes to ignore */\n ignoredRoutes?: string[];\n /** Request size threshold for body inclusion */\n maxBodySize?: number;\n}\n\n/**\n * Cache instrumentation configuration\n */\nexport interface CacheInstrumentationConfig {\n /** Enable cache instrumentation */\n enabled: boolean;\n /** Include cache key in span attributes */\n includeKey?: boolean;\n /** Include cache value size */\n includeValueSize?: boolean;\n /** Include TTL in span attributes */\n includeTTL?: boolean;\n}\n\n/**\n * Event queue instrumentation configuration\n */\nexport interface EventQueueInstrumentationConfig {\n /** Enable event queue instrumentation */\n enabled: boolean;\n /** Include message payload (be careful with sensitive data) */\n includePayload?: boolean;\n /** Include message headers */\n includeHeaders?: boolean;\n /** Max payload size to include */\n maxPayloadSize?: number;\n}\n\n/**\n * Complete instrumentation configuration\n */\nexport interface InstrumentationConfig {\n /** Enable all instrumentation (master switch) */\n enabled: boolean;\n /** Feature flags for conditional enable/disable */\n features: InstrumentationFeatureFlags;\n /** Tracing configuration */\n tracing: TracingConfig;\n /** Metrics configuration */\n metrics: MetricsConfig;\n /** Logging configuration */\n logging: LoggingConfig;\n /** GraphQL instrumentation configuration */\n graphql: GraphQLInstrumentationConfig;\n /** Database instrumentation configuration */\n database: DatabaseInstrumentationConfig;\n /** HTTP instrumentation configuration */\n http: HTTPInstrumentationConfig;\n /** Cache instrumentation configuration */\n cache: CacheInstrumentationConfig;\n /** Event queue instrumentation configuration */\n eventQueue: EventQueueInstrumentationConfig;\n}\n\n/**\n * Span attributes for consistent naming\n */\nexport interface SpanAttributes {\n /** Service name */\n 'service.name'?: string;\n /** Service version */\n 'service.version'?: string;\n /** Environment */\n 'deployment.environment'?: string;\n /** Operation name */\n 'operation.name'?: string;\n /** Operation type */\n 'operation.type'?: string;\n /** User ID */\n 'user.id'?: string;\n /** Tenant ID */\n 'tenant.id'?: string;\n /** Workspace ID */\n 'workspace.id'?: string;\n /** Request ID */\n 'request.id'?: string;\n /** Error flag */\n error?: boolean;\n /** Error message */\n 'error.message'?: string;\n /** Error type */\n 'error.type'?: string;\n /** Custom attributes */\n [key: string]: string | number | boolean | undefined;\n}\n\n/**\n * Metric types\n */\nexport type MetricType = 'counter' | 'histogram' | 'gauge' | 'upDownCounter';\n\n/**\n * Metric definition\n */\nexport interface MetricDefinition {\n /** Metric name */\n name: string;\n /** Metric description */\n description: string;\n /** Metric type */\n type: MetricType;\n /** Unit of measurement */\n unit?: string;\n /** Label keys */\n labelKeys?: string[];\n /** Histogram boundaries (for histogram type) */\n boundaries?: number[];\n}\n\n/**\n * Predefined metrics for microservices\n */\nexport const STANDARD_METRICS: Record<string, MetricDefinition> = {\n // HTTP metrics\n HTTP_REQUEST_DURATION: {\n name: 'http_request_duration_ms',\n description: 'HTTP request duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['method', 'route', 'status_code'],\n boundaries: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],\n },\n HTTP_REQUEST_TOTAL: {\n name: 'http_requests_total',\n description: 'Total number of HTTP requests',\n type: 'counter',\n labelKeys: ['method', 'route', 'status_code'],\n },\n HTTP_REQUEST_SIZE: {\n name: 'http_request_size_bytes',\n description: 'HTTP request size in bytes',\n type: 'histogram',\n unit: 'bytes',\n labelKeys: ['method', 'route'],\n boundaries: [100, 1000, 10000, 100000, 1000000],\n },\n HTTP_RESPONSE_SIZE: {\n name: 'http_response_size_bytes',\n description: 'HTTP response size in bytes',\n type: 'histogram',\n unit: 'bytes',\n labelKeys: ['method', 'route'],\n boundaries: [100, 1000, 10000, 100000, 1000000],\n },\n\n // GraphQL metrics\n GRAPHQL_OPERATION_DURATION: {\n name: 'graphql_operation_duration_ms',\n description: 'GraphQL operation duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['operation_type', 'operation_name'],\n boundaries: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000],\n },\n GRAPHQL_OPERATION_TOTAL: {\n name: 'graphql_operations_total',\n description: 'Total number of GraphQL operations',\n type: 'counter',\n labelKeys: ['operation_type', 'operation_name', 'status'],\n },\n GRAPHQL_RESOLVER_DURATION: {\n name: 'graphql_resolver_duration_ms',\n description: 'GraphQL resolver duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['type_name', 'field_name'],\n boundaries: [1, 5, 10, 25, 50, 100, 250, 500],\n },\n\n // Database metrics\n DB_QUERY_DURATION: {\n name: 'db_query_duration_ms',\n description: 'Database query duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['operation', 'model'],\n boundaries: [1, 5, 10, 25, 50, 100, 250, 500, 1000],\n },\n DB_QUERY_TOTAL: {\n name: 'db_queries_total',\n description: 'Total number of database queries',\n type: 'counter',\n labelKeys: ['operation', 'model', 'status'],\n },\n DB_CONNECTION_POOL_SIZE: {\n name: 'db_connection_pool_size',\n description: 'Database connection pool size',\n type: 'gauge',\n labelKeys: ['state'],\n },\n\n // Cache metrics\n CACHE_OPERATION_DURATION: {\n name: 'cache_operation_duration_ms',\n description: 'Cache operation duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['operation'],\n boundaries: [0.1, 0.5, 1, 2, 5, 10, 25, 50],\n },\n CACHE_HIT_TOTAL: {\n name: 'cache_hits_total',\n description: 'Total number of cache hits',\n type: 'counter',\n labelKeys: ['cache_type'],\n },\n CACHE_MISS_TOTAL: {\n name: 'cache_misses_total',\n description: 'Total number of cache misses',\n type: 'counter',\n labelKeys: ['cache_type'],\n },\n\n // Business metrics\n OPERATION_DURATION: {\n name: 'operation_duration_ms',\n description: 'Business operation duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['operation', 'status'],\n boundaries: [10, 50, 100, 250, 500, 1000, 2500, 5000, 10000],\n },\n OPERATION_TOTAL: {\n name: 'operations_total',\n description: 'Total number of business operations',\n type: 'counter',\n labelKeys: ['operation', 'status'],\n },\n ACTIVE_OPERATIONS: {\n name: 'active_operations',\n description: 'Number of currently active operations',\n type: 'upDownCounter',\n labelKeys: ['operation'],\n },\n\n // Resource-cap metrics (BOFF-4809)\n RESOURCE_CAPS_PLAN_RESOLUTION: {\n name: 'resource_caps.plan_resolution_total',\n description: 'Total number of billing plan resolutions for resource caps',\n type: 'counter',\n labelKeys: ['result', 'reason'],\n },\n RESOURCE_CAPS_ENFORCEMENT: {\n name: 'resource_caps.enforcement_total',\n description: 'Total number of resource cap enforcement checks',\n type: 'counter',\n labelKeys: ['resource', 'plan_tier', 'result'],\n },\n RESOURCE_CAPS_CLIENTLESS_FALLBACK: {\n name: 'resource_caps.clientless_fallback_total',\n description: 'Total number of times resource caps fell back because no billing source was configured at bootstrap',\n type: 'counter',\n labelKeys: [],\n },\n};\n\n/**\n * Span context for propagation\n */\nexport interface SpanContext {\n traceId: string;\n spanId: string;\n traceFlags: number;\n isRemote?: boolean;\n}\n\n/**\n * Trace context for logging\n */\nexport interface TraceContext {\n traceId?: string;\n spanId?: string;\n traceFlags?: number;\n parentSpanId?: string;\n}\n\n/**\n * Operation context for instrumentation\n */\nexport interface OperationContext {\n /** Operation name */\n operationName: string;\n /** Operation type (query, mutation, subscription, http, db, cache, etc.) */\n operationType: string;\n /** Actor ID */\n actorId?: string;\n /** Tenant ID */\n tenantId?: string;\n /** Workspace ID */\n workspaceId?: string;\n /** Request ID */\n requestId?: string;\n /** Additional attributes */\n attributes?: Record<string, string | number | boolean>;\n}\n","/**\n * GraphQL Instrumentation Plugin\n *\n * Envelop/GraphQL Yoga plugin for comprehensive GraphQL operation\n * instrumentation including tracing, metrics, and logging.\n *\n * Uses Apollo Federation inline trace plugin for automatic resolver/field-level\n * tracing without manual instrumentation code in microservices.\n *\n * @module instrumentation/graphql-plugin\n * @category Observability\n */\n\nimport { createRequire } from 'node:module';\nimport { logger } from '../logger/index.js';\nimport { getInstrumentationConfig, isFeatureEnabled, isInstrumentationConfigInitialized } from './config.js';\nimport { createCounter, createHistogram, type MetricLabels } from './metrics-collector.js';\nimport { getTracer, SpanKind, SpanStatus, type Span } from './tracer.js';\nimport { STANDARD_METRICS } from './types.js';\n\n// Create a require function for loading optional CommonJS modules in ESM context\nconst require = createRequire(import.meta.url);\n\n// ============================================================================\n// Prometheus Metrics Plugin\n// ============================================================================\n\n/**\n * Cached reference to the Prometheus plugin.\n * Uses lazy loading to avoid top-level await (CJS compatibility).\n */\nlet prometheusPluginFactory: ((options: unknown) => unknown) | null | undefined = undefined;\nlet prometheusLoadAttempted = false;\n\n/**\n * Lazily load the Prometheus plugin.\n * Returns null if not available.\n */\nfunction loadPrometheusPlugin(): ((options: unknown) => unknown) | null {\n if (prometheusLoadAttempted) {\n return prometheusPluginFactory ?? null;\n }\n\n prometheusLoadAttempted = true;\n\n try {\n // Use require for synchronous loading of optional peer dependency\n const module = require('@graphql-yoga/plugin-prometheus');\n prometheusPluginFactory = module.usePrometheus;\n if (prometheusPluginFactory) {\n logger.info('[Instrumentation] Successfully loaded @graphql-yoga/plugin-prometheus');\n } else {\n logger.warn('[Instrumentation] @graphql-yoga/plugin-prometheus loaded but usePrometheus not found');\n }\n return prometheusPluginFactory ?? null;\n } catch (error) {\n // Plugin not installed\n logger.warn('[Instrumentation] Failed to load @graphql-yoga/plugin-prometheus:', error);\n prometheusPluginFactory = null;\n return null;\n }\n}\n\n/**\n * Options for the Prometheus metrics plugin\n */\nexport interface PrometheusPluginOptions {\n /** Endpoint to expose metrics (default: '/metrics') */\n endpoint?: string | false;\n /** Skip introspection queries from metrics (default: true) */\n skipIntrospection?: boolean;\n /** Enable HTTP duration metrics (default: true) */\n httpDuration?: boolean;\n /** Enable request duration histogram (default: true) */\n requestDuration?: boolean;\n /** Enable request count metrics (default: true) */\n requestCount?: boolean;\n /** Enable error count metrics (default: true) */\n errorCount?: boolean;\n /** Enable resolver-level metrics (default: false - has performance overhead) */\n resolverMetrics?: boolean;\n /** Specific resolvers to instrument (e.g., ['Query.*', 'Mutation.*']) */\n instrumentResolvers?: string[];\n /** Enable deprecated field tracking (default: true) */\n deprecatedFields?: boolean;\n /** Enable parse phase metrics (default: true) */\n parsePhase?: boolean;\n /** Enable validate phase metrics (default: true) */\n validatePhase?: boolean;\n /** Enable context phase metrics (default: true) */\n contextPhase?: boolean;\n /** Enable execute phase metrics (default: true) */\n executePhase?: boolean;\n}\n\n/**\n * Create the Prometheus metrics plugin for automatic GraphQL metrics.\n *\n * This plugin automatically tracks all GraphQL operations and provides\n * Prometheus-compatible metrics for monitoring dashboards.\n *\n * Metrics exposed:\n * - graphql_yoga_http_duration - HTTP request duration\n * - graphql_envelop_request_duration - Operation duration histogram\n * - graphql_envelop_request - Operation counter\n * - graphql_envelop_error_result - Error counter\n * - graphql_envelop_deprecated_field - Deprecated field usage\n * - graphql_envelop_phase_* - Execution phase metrics\n * - graphql_envelop_execute_resolver - Resolver metrics (if enabled)\n *\n * @example\n * ```typescript\n * import { createPrometheusPlugin } from '@burdenoff/be-sdk/instrumentation';\n *\n * const yoga = createYoga({\n * plugins: [\n * createPrometheusPlugin({\n * endpoint: '/metrics',\n * resolverMetrics: false,\n * }),\n * ],\n * });\n * ```\n */\nexport function createPrometheusPlugin(options?: PrometheusPluginOptions): unknown | null {\n // Check if metrics is enabled\n if (isInstrumentationConfigInitialized() && !isFeatureEnabled('metrics')) {\n logger.debug('[Instrumentation] Metrics disabled, skipping Prometheus plugin');\n return null;\n }\n\n // Lazily load the plugin\n const pluginFactory = loadPrometheusPlugin();\n\n // Check if the plugin is available\n if (!pluginFactory) {\n logger.debug('[Instrumentation] @graphql-yoga/plugin-prometheus not installed, metrics not available');\n return null;\n }\n\n const config = {\n // Expose metrics endpoint (set to false to disable, e.g., for push mode)\n endpoint: options?.endpoint ?? '/metrics',\n // Skip introspection queries from metrics\n skipIntrospection: options?.skipIntrospection ?? true,\n // Metrics configuration\n metrics: {\n // HTTP-level metrics\n graphql_yoga_http_duration: options?.httpDuration ?? true,\n // Operation-level metrics\n graphql_envelop_request_duration: options?.requestDuration ?? true,\n graphql_envelop_request_time_summary: options?.requestDuration ?? true,\n graphql_envelop_request: options?.requestCount ?? true,\n graphql_envelop_error_result: options?.errorCount ?? true,\n graphql_envelop_deprecated_field: options?.deprecatedFields ?? true,\n // Execution phase metrics\n graphql_envelop_phase_parse: options?.parsePhase ?? true,\n graphql_envelop_phase_validate: options?.validatePhase ?? true,\n graphql_envelop_phase_context: options?.contextPhase ?? true,\n graphql_envelop_phase_execute: options?.executePhase ?? true,\n graphql_envelop_phase_subscribe: true,\n // Schema change tracking\n graphql_envelop_schema_change: true,\n // Resolver-level metrics (disabled by default due to performance overhead)\n graphql_envelop_execute_resolver: options?.resolverMetrics ?? false,\n },\n // If resolver metrics enabled, optionally filter which resolvers to instrument\n ...(options?.instrumentResolvers && { instrumentResolvers: options.instrumentResolvers }),\n };\n\n logger.debug('[Instrumentation] Using Prometheus metrics plugin', {\n endpoint: config.endpoint,\n resolverMetrics: options?.resolverMetrics ?? false,\n });\n\n return pluginFactory(config);\n}\n\n/**\n * Check if Prometheus plugin is available\n */\nexport function isPrometheusAvailable(): boolean {\n return loadPrometheusPlugin() !== null;\n}\n\n// ============================================================================\n// Apollo Federation Inline Trace Plugin\n// ============================================================================\n\n/**\n * Cached reference to the Apollo inline trace plugin.\n * Uses lazy loading to avoid top-level await (CJS compatibility).\n */\nlet apolloInlineTracePluginFactory: (() => unknown) | null | undefined = undefined;\nlet apolloInlineTraceLoadAttempted = false;\n\n/**\n * Lazily load the Apollo inline trace plugin.\n * Returns null if not available.\n */\nfunction loadApolloInlineTracePlugin(): (() => unknown) | null {\n if (apolloInlineTraceLoadAttempted) {\n return apolloInlineTracePluginFactory ?? null;\n }\n\n apolloInlineTraceLoadAttempted = true;\n\n try {\n // Use require for synchronous loading of optional peer dependency\n const module = require('@graphql-yoga/plugin-apollo-inline-trace');\n apolloInlineTracePluginFactory = module.useApolloInlineTrace;\n return apolloInlineTracePluginFactory ?? null;\n } catch {\n // Plugin not installed\n apolloInlineTracePluginFactory = null;\n return null;\n }\n}\n\n/**\n * Options for the Apollo Federation inline trace plugin\n */\nexport interface ApolloInlineTraceOptions {\n /** Include detailed field-level traces (default: true) */\n includeFieldTraces?: boolean;\n /** Include variable values in traces (default: false for security) */\n includeVariables?: boolean;\n /** Operations to exclude from tracing */\n excludeOperations?: string[];\n}\n\n/**\n * Create the Apollo Federation inline trace plugin for automatic tracing.\n *\n * This plugin automatically instruments all GraphQL operations and resolvers\n * without requiring manual tracing code. It's designed to work with Apollo Federation\n * and the API Gateway for distributed tracing.\n *\n * @example\n * ```typescript\n * import { createApolloInlineTracePlugin } from '@burdenoff/be-sdk/instrumentation';\n *\n * const yoga = createYoga({\n * plugins: [\n * createApolloInlineTracePlugin(),\n * ],\n * });\n * ```\n */\nexport function createApolloInlineTracePlugin(_options?: ApolloInlineTraceOptions): unknown | null {\n // Check if tracing is enabled\n if (isInstrumentationConfigInitialized() && !isFeatureEnabled('tracing')) {\n logger.debug('[Instrumentation] Tracing disabled, skipping Apollo inline trace plugin');\n return null;\n }\n\n // Lazily load the plugin\n const pluginFactory = loadApolloInlineTracePlugin();\n\n // Check if the plugin is available\n if (!pluginFactory) {\n logger.debug('[Instrumentation] @graphql-yoga/plugin-apollo-inline-trace not installed, using fallback tracing');\n return null;\n }\n\n logger.debug('[Instrumentation] Using Apollo Federation inline trace plugin');\n return pluginFactory();\n}\n\n/**\n * Check if Apollo inline tracing is available\n */\nexport function isApolloInlineTraceAvailable(): boolean {\n return loadApolloInlineTracePlugin() !== null;\n}\n\n/**\n * GraphQL operation type\n */\nexport type GraphQLOperationType = 'query' | 'mutation' | 'subscription';\n\n/**\n * GraphQL operation info\n */\nexport interface GraphQLOperationInfo {\n operationType: GraphQLOperationType;\n operationName: string | null;\n document?: string;\n variables?: Record<string, unknown>;\n}\n\n/**\n * Context extension for instrumentation\n */\nexport interface InstrumentationContextExtension {\n _instrumentation?: {\n span?: Span;\n startTime?: number;\n operationInfo?: GraphQLOperationInfo;\n };\n}\n\n/**\n * Create GraphQL metrics\n */\nfunction createGraphQLMetrics(): {\n operationDuration: ReturnType<typeof createHistogram>;\n operationTotal: ReturnType<typeof createCounter>;\n operationErrors: ReturnType<typeof createCounter>;\n resolverDuration: ReturnType<typeof createHistogram>;\n resolverTotal: ReturnType<typeof createCounter>;\n} {\n const def = STANDARD_METRICS;\n\n return {\n operationDuration: createHistogram(\n def['GRAPHQL_OPERATION_DURATION']?.name || 'graphql_operation_duration_ms',\n def['GRAPHQL_OPERATION_DURATION']?.description || 'GraphQL operation duration',\n def['GRAPHQL_OPERATION_DURATION']?.boundaries\n ),\n operationTotal: createCounter(\n def['GRAPHQL_OPERATION_TOTAL']?.name || 'graphql_operations_total',\n def['GRAPHQL_OPERATION_TOTAL']?.description || 'Total GraphQL operations'\n ),\n operationErrors: createCounter('graphql_operation_errors_total', 'Total GraphQL operation errors'),\n resolverDuration: createHistogram(\n def['GRAPHQL_RESOLVER_DURATION']?.name || 'graphql_resolver_duration_ms',\n def['GRAPHQL_RESOLVER_DURATION']?.description || 'GraphQL resolver duration',\n def['GRAPHQL_RESOLVER_DURATION']?.boundaries\n ),\n resolverTotal: createCounter('graphql_resolvers_total', 'Total GraphQL resolver calls'),\n };\n}\n\n// Lazy-initialized metrics\nlet graphqlMetrics: ReturnType<typeof createGraphQLMetrics> | null = null;\n\nfunction getGraphQLMetrics(): ReturnType<typeof createGraphQLMetrics> {\n if (!graphqlMetrics) {\n graphqlMetrics = createGraphQLMetrics();\n }\n return graphqlMetrics;\n}\n\n/**\n * Extract operation info from GraphQL execution args\n */\nexport function extractOperationInfo(args: {\n document?: { loc?: { source?: { body?: string } }; definitions?: unknown[] };\n operationName?: string | null;\n variableValues?: Record<string, unknown>;\n}): GraphQLOperationInfo {\n let operationType: GraphQLOperationType = 'query';\n let operationName: string | null = args.operationName || null;\n\n // Try to extract operation type from document\n const definitions = args.document?.definitions as\n | Array<{ kind?: string; operation?: string; name?: { value?: string } }>\n | undefined;\n if (definitions && definitions.length > 0) {\n for (const def of definitions) {\n if (def.kind === 'OperationDefinition') {\n operationType = (def.operation as GraphQLOperationType) || 'query';\n if (!operationName && def.name?.value) {\n operationName = def.name.value;\n }\n break;\n }\n }\n }\n\n return {\n operationType,\n operationName,\n document: args.document?.loc?.source?.body,\n variables: args.variableValues,\n };\n}\n\n/**\n * Check if operation should be ignored\n */\nfunction shouldIgnoreOperation(operationName: string | null): boolean {\n if (!isInstrumentationConfigInitialized()) return false;\n\n const config = getInstrumentationConfig();\n const ignoredOps = config.graphql.ignoredOperations || [];\n\n return operationName ? ignoredOps.includes(operationName) : false;\n}\n\n/**\n * GraphQL Yoga plugin for instrumentation\n *\n * @example\n * ```typescript\n * import { createYoga } from 'graphql-yoga';\n * import { createGraphQLInstrumentationPlugin } from '@burdenoff/be-sdk/instrumentation';\n *\n * const yoga = createYoga({\n * plugins: [\n * createGraphQLInstrumentationPlugin(),\n * ],\n * });\n * ```\n */\nexport function createGraphQLInstrumentationPlugin(): {\n onExecute: (args: {\n args: {\n document?: unknown;\n operationName?: string | null;\n variableValues?: Record<string, unknown>;\n contextValue?: unknown;\n };\n }) =>\n | {\n onExecuteDone: (args: { result: unknown; setResult?: (result: unknown) => void }) => void;\n }\n | undefined;\n onSubscribe?: (args: { args: unknown }) => void;\n} {\n return {\n onExecute({\n args,\n }): { onExecuteDone: (args: { result: unknown; setResult?: (result: unknown) => void }) => void } | undefined {\n // Check if GraphQL instrumentation is enabled\n if (!isFeatureEnabled('graphql')) {\n return undefined;\n }\n\n const operationInfo = extractOperationInfo(\n args as {\n document?: { loc?: { source?: { body?: string } }; definitions?: unknown[] };\n operationName?: string | null;\n variableValues?: Record<string, unknown>;\n }\n );\n\n // Check if this operation should be ignored\n if (shouldIgnoreOperation(operationInfo.operationName)) {\n return undefined;\n }\n\n const startTime = Date.now();\n const config = getInstrumentationConfig();\n const metrics = getGraphQLMetrics();\n\n // Start span for tracing\n let span: Span | undefined;\n if (isFeatureEnabled('tracing')) {\n const tracer = getTracer();\n const spanName = operationInfo.operationName\n ? `GraphQL ${operationInfo.operationType} ${operationInfo.operationName}`\n : `GraphQL ${operationInfo.operationType}`;\n\n span = tracer.startSpan(spanName, SpanKind.SERVER);\n\n span.setAttributes({\n 'graphql.operation.type': operationInfo.operationType,\n 'graphql.operation.name': operationInfo.operationName || 'anonymous',\n });\n\n // Include document if configured\n if (config.graphql.includeDocument && operationInfo.document) {\n span.setAttribute('graphql.document', operationInfo.document.substring(0, 2000));\n }\n\n // Include variables if configured (be careful with sensitive data)\n if (config.graphql.includeVariables && operationInfo.variables) {\n try {\n span.setAttribute('graphql.variables', JSON.stringify(operationInfo.variables).substring(0, 500));\n } catch {\n // Ignore serialization errors\n }\n }\n }\n\n // Log operation start\n if (isFeatureEnabled('logging')) {\n logger.debug('[GraphQL] Operation started', {\n type: operationInfo.operationType,\n name: operationInfo.operationName || 'anonymous',\n });\n }\n\n // Store instrumentation context\n const context = args.contextValue as InstrumentationContextExtension | undefined;\n if (context) {\n context._instrumentation = {\n span,\n startTime,\n operationInfo,\n };\n }\n\n return {\n onExecuteDone({ result }): void {\n const duration = Date.now() - startTime;\n const hasErrors =\n result &&\n typeof result === 'object' &&\n 'errors' in result &&\n Array.isArray((result as { errors?: unknown[] }).errors) &&\n (result as { errors: unknown[] }).errors.length > 0;\n\n // Record metrics\n if (isFeatureEnabled('metrics')) {\n const labels: MetricLabels = {\n operation_type: operationInfo.operationType,\n operation_name: operationInfo.operationName || 'anonymous',\n };\n\n metrics.operationDuration.record(duration, labels);\n metrics.operationTotal.inc({ ...labels, status: hasErrors ? 'error' : 'success' });\n\n if (hasErrors) {\n metrics.operationErrors.inc(labels);\n }\n }\n\n // Update span\n if (span) {\n span.setAttribute('graphql.duration_ms', duration);\n\n if (hasErrors) {\n span.setStatus(SpanStatus.ERROR, 'GraphQL operation had errors');\n const errors = (result as { errors?: Array<{ message?: string }> }).errors;\n if (errors && errors.length > 0) {\n span.setAttribute('graphql.error_count', errors.length);\n span.addEvent('graphql.errors', {\n errors: errors.map((e) => e.message || 'Unknown error').join('; '),\n });\n }\n } else {\n span.setStatus(SpanStatus.OK);\n }\n\n // Include result if configured\n if (config.graphql.includeResult) {\n try {\n span.setAttribute('graphql.result', JSON.stringify(result).substring(0, 500));\n } catch {\n // Ignore\n }\n }\n\n span.end();\n }\n\n // Log completion\n if (isFeatureEnabled('logging')) {\n if (hasErrors) {\n logger.warn('[GraphQL] Operation completed with errors', {\n type: operationInfo.operationType,\n name: operationInfo.operationName || 'anonymous',\n duration: `${duration}ms`,\n errorCount: ((result as { errors?: unknown[] }).errors || []).length,\n });\n } else {\n logger.debug('[GraphQL] Operation completed', {\n type: operationInfo.operationType,\n name: operationInfo.operationName || 'anonymous',\n duration: `${duration}ms`,\n });\n }\n }\n },\n };\n },\n };\n}\n\n/**\n * Resolver instrumentation wrapper\n *\n * Use this to wrap individual resolvers for detailed tracing and metrics.\n *\n * @example\n * ```typescript\n * const resolvers = {\n * Query: {\n * getUser: instrumentResolver('Query.getUser', async (parent, args, context) => {\n * // resolver logic\n * }),\n * },\n * };\n * ```\n */\nexport function instrumentResolver<TArgs extends unknown[], TResult>(\n name: string,\n resolver: (...args: TArgs) => Promise<TResult>,\n options?: {\n /** Include resolver arguments in span */\n includeArgs?: boolean;\n /** Include resolver result in span */\n includeResult?: boolean;\n /** Custom span attributes */\n attributes?: Record<string, string | number | boolean>;\n }\n): (...args: TArgs) => Promise<TResult> {\n const [typeName, fieldName] = name.includes('.') ? name.split('.', 2) : ['Unknown', name];\n\n return async (...args: TArgs): Promise<TResult> => {\n // Check if GraphQL instrumentation is enabled\n if (!isFeatureEnabled('graphql')) {\n return resolver(...args);\n }\n\n const config = getInstrumentationConfig();\n\n // Check resolver depth limit\n // (This is a simplified check - in production you'd track nesting level)\n const startTime = Date.now();\n const metrics = getGraphQLMetrics();\n\n // Start span\n let span: Span | undefined;\n if (isFeatureEnabled('tracing') && config.graphql.includeResolvers) {\n const tracer = getTracer();\n span = tracer.startSpan(`Resolver: ${name}`, SpanKind.INTERNAL);\n\n span.setAttributes({\n 'graphql.resolver.type': typeName || 'Unknown',\n 'graphql.resolver.field': fieldName || name,\n ...options?.attributes,\n });\n\n if (options?.includeArgs && args.length > 1) {\n try {\n // args[1] is typically the resolver arguments\n span.setAttribute('graphql.resolver.args', JSON.stringify(args[1]).substring(0, 500));\n } catch {\n // Ignore\n }\n }\n }\n\n try {\n const result = await resolver(...args);\n\n if (span) {\n span.setStatus(SpanStatus.OK);\n if (options?.includeResult) {\n try {\n span.setAttribute('graphql.resolver.result', JSON.stringify(result).substring(0, 500));\n } catch {\n // Ignore\n }\n }\n }\n\n return result;\n } catch (error) {\n if (span && error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n\n if (span) {\n span.end();\n }\n\n // Record metrics\n if (isFeatureEnabled('metrics')) {\n metrics.resolverDuration.record(duration, {\n type_name: typeName || 'Unknown',\n field_name: fieldName || name,\n });\n metrics.resolverTotal.inc({\n type_name: typeName || 'Unknown',\n field_name: fieldName || name,\n });\n }\n }\n };\n}\n\n/**\n * Create instrumented resolvers from a resolver map\n *\n * @example\n * ```typescript\n * const resolvers = instrumentResolverMap({\n * Query: {\n * getUser: async (parent, args, context) => { ... },\n * getUsers: async (parent, args, context) => { ... },\n * },\n * Mutation: {\n * createUser: async (parent, args, context) => { ... },\n * },\n * });\n * ```\n */\nexport function instrumentResolverMap<\n T extends Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>,\n>(\n resolverMap: T,\n options?: {\n /** Types to include (default: all) */\n includeTypes?: string[];\n /** Types to exclude */\n excludeTypes?: string[];\n /** Fields to exclude (format: \"TypeName.fieldName\") */\n excludeFields?: string[];\n }\n): T {\n const result: Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>> = {};\n\n for (const [typeName, fields] of Object.entries(resolverMap)) {\n // Check if type should be included\n if (options?.excludeTypes?.includes(typeName)) {\n result[typeName] = fields;\n continue;\n }\n if (options?.includeTypes && !options.includeTypes.includes(typeName)) {\n result[typeName] = fields;\n continue;\n }\n\n result[typeName] = {};\n\n for (const [fieldName, resolver] of Object.entries(fields)) {\n const fullName = `${typeName}.${fieldName}`;\n\n // Check if field should be excluded\n if (options?.excludeFields?.includes(fullName)) {\n result[typeName][fieldName] = resolver;\n continue;\n }\n\n // Wrap resolver with instrumentation\n result[typeName][fieldName] = instrumentResolver(fullName, resolver);\n }\n }\n\n return result as T;\n}\n\n/**\n * Get current GraphQL operation info from context\n */\nexport function getGraphQLOperationFromContext(context: unknown): GraphQLOperationInfo | undefined {\n const instrumentedContext = context as InstrumentationContextExtension | undefined;\n return instrumentedContext?._instrumentation?.operationInfo;\n}\n\n/**\n * Get current GraphQL span from context\n */\nexport function getGraphQLSpanFromContext(context: unknown): Span | undefined {\n const instrumentedContext = context as InstrumentationContextExtension | undefined;\n return instrumentedContext?._instrumentation?.span;\n}\n","/**\n * Instrumentation Decorators\n *\n * TypeScript decorators for easy method instrumentation with\n * tracing, metrics, and logging.\n *\n * @module instrumentation/decorators\n * @category Observability\n */\n\nimport { logger } from '../logger/index.js';\nimport { isFeatureEnabled } from './config.js';\nimport { createCounter, createHistogram, type MetricLabels } from './metrics-collector.js';\nimport { getTracer, SpanKind, SpanStatus, type Span } from './tracer.js';\n\n/**\n * Type for span attributes (primitive values only)\n */\nexport type SpanAttributes = Record<string, string | number | boolean>;\n\n/**\n * Options for the @Trace decorator\n */\nexport interface TraceOptions {\n /** Custom span name (default: className.methodName) */\n name?: string;\n /** Span kind */\n kind?: SpanKind;\n /** Additional span attributes */\n attributes?: SpanAttributes;\n /** Include method arguments in span (be careful with sensitive data) */\n includeArgs?: boolean;\n /** Include result in span */\n includeResult?: boolean;\n /** Extract attributes from method arguments */\n extractAttributes?: (args: unknown[]) => SpanAttributes;\n /** Skip tracing for this method */\n skip?: boolean | ((args: unknown[]) => boolean);\n}\n\n/**\n * Options for the @Metric decorator\n */\nexport interface MetricOptions {\n /** Custom metric name (default: operation_duration) */\n name?: string;\n /** Additional labels */\n labels?: MetricLabels | ((args: unknown[], result?: unknown) => MetricLabels);\n /** Record count metric */\n recordCount?: boolean;\n /** Record duration metric */\n recordDuration?: boolean;\n /** Custom histogram boundaries */\n boundaries?: number[];\n}\n\n/**\n * Options for the @Log decorator\n */\nexport interface LogOptions {\n /** Log level */\n level?: 'debug' | 'info' | 'warn' | 'error';\n /** Include method arguments */\n includeArgs?: boolean;\n /** Include result */\n includeResult?: boolean;\n /** Log on entry */\n logEntry?: boolean;\n /** Log on exit */\n logExit?: boolean;\n /** Log on error */\n logError?: boolean;\n /** Custom message */\n message?: string;\n}\n\n/**\n * Combined options for the @Instrument decorator\n */\nexport interface InstrumentOptions {\n /** Operation name */\n operationName?: string;\n /** Operation type */\n operationType?: string;\n /** Tracing options */\n trace?: TraceOptions | boolean;\n /** Metrics options */\n metrics?: MetricOptions | boolean;\n /** Logging options */\n log?: LogOptions | boolean;\n /** Skip instrumentation condition */\n skip?: boolean | ((args: unknown[]) => boolean);\n}\n\n/**\n * @Trace decorator - adds tracing to a method\n *\n * @example\n * ```typescript\n * class UserService {\n * @Trace({ name: 'getUserById', kind: SpanKind.INTERNAL })\n * async getUser(id: string): Promise<User> {\n * // ...\n * }\n * }\n * ```\n */\nexport function Trace(options: TraceOptions = {}): MethodDecorator {\n return function <T>(\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (typeof originalMethod !== 'function') {\n return descriptor;\n }\n\n const className = target.constructor.name;\n const methodName = String(propertyKey);\n const spanName = options.name || `${className}.${methodName}`;\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n // Check if tracing is enabled\n if (!isFeatureEnabled('tracing')) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n\n // Check skip condition\n if (options.skip) {\n const shouldSkip = typeof options.skip === 'function' ? options.skip(args) : options.skip;\n if (shouldSkip) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n }\n\n const tracer = getTracer();\n const span = tracer.startSpan(spanName, options.kind || SpanKind.INTERNAL);\n\n // Add base attributes\n span.setAttributes({\n 'code.function': methodName,\n 'code.namespace': className,\n ...options.attributes,\n });\n\n // Extract custom attributes from arguments\n if (options.extractAttributes) {\n try {\n const extractedAttrs = options.extractAttributes(args);\n span.setAttributes(extractedAttrs);\n } catch {\n // Ignore extraction errors\n }\n }\n\n // Include args if configured\n if (options.includeArgs) {\n try {\n span.setAttribute('method.args', JSON.stringify(args).substring(0, 1000));\n } catch {\n // Ignore serialization errors\n }\n }\n\n try {\n const result = await (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n\n // Include result if configured\n if (options.includeResult) {\n try {\n span.setAttribute('method.result', JSON.stringify(result).substring(0, 1000));\n } catch {\n // Ignore serialization errors\n }\n }\n\n span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n } as T;\n\n return descriptor;\n };\n}\n\n/**\n * @Metric decorator - adds metrics to a method\n *\n * @example\n * ```typescript\n * class UserService {\n * @Metric({ name: 'user_fetch', recordCount: true, recordDuration: true })\n * async getUser(id: string): Promise<User> {\n * // ...\n * }\n * }\n * ```\n */\nexport function Metric(options: MetricOptions = {}): MethodDecorator {\n return function <T>(\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (typeof originalMethod !== 'function') {\n return descriptor;\n }\n\n const className = target.constructor.name;\n const methodName = String(propertyKey);\n const baseName = options.name || `${className.toLowerCase()}_${methodName.toLowerCase()}`;\n\n // Create metrics (they will be no-ops if metrics are disabled)\n const durationHistogram = createHistogram(\n `${baseName}_duration_ms`,\n `Duration of ${className}.${methodName} in milliseconds`,\n options.boundaries\n );\n const totalCounter = createCounter(`${baseName}_total`, `Total calls to ${className}.${methodName}`);\n const errorCounter = createCounter(`${baseName}_errors_total`, `Total errors in ${className}.${methodName}`);\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n // Check if metrics are enabled\n if (!isFeatureEnabled('metrics')) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n\n const startTime = Date.now();\n let result: unknown;\n let hasError = false;\n\n try {\n result = await (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n return result;\n } catch (error) {\n hasError = true;\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n\n // Get labels\n let labels: MetricLabels = {};\n if (options.labels) {\n labels = typeof options.labels === 'function' ? options.labels(args, result) : options.labels;\n }\n\n // Record metrics\n if (options.recordDuration !== false) {\n durationHistogram.record(duration, labels);\n }\n\n if (options.recordCount !== false) {\n totalCounter.inc({ ...labels, status: hasError ? 'error' : 'success' });\n }\n\n if (hasError) {\n errorCounter.inc(labels);\n }\n }\n } as T;\n\n return descriptor;\n };\n}\n\n/**\n * @Log decorator - adds logging to a method\n *\n * @example\n * ```typescript\n * class UserService {\n * @Log({ level: 'info', logEntry: true, logExit: true })\n * async getUser(id: string): Promise<User> {\n * // ...\n * }\n * }\n * ```\n */\nexport function Log(options: LogOptions = {}): MethodDecorator {\n return function <T>(\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (typeof originalMethod !== 'function') {\n return descriptor;\n }\n\n const className = target.constructor.name;\n const methodName = String(propertyKey);\n const level = options.level || 'debug';\n const logEntry = options.logEntry !== false;\n const logExit = options.logExit !== false;\n const logError = options.logError !== false;\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n // Check if logging instrumentation is enabled\n if (!isFeatureEnabled('logging')) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n\n const baseMessage = options.message || `${className}.${methodName}`;\n\n // Log entry\n if (logEntry) {\n const entryData: Record<string, unknown> = {\n class: className,\n method: methodName,\n };\n if (options.includeArgs) {\n entryData['args'] = args;\n }\n logger[level](`[Enter] ${baseMessage}`, entryData);\n }\n\n const startTime = Date.now();\n\n try {\n const result = await (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n\n // Log exit\n if (logExit) {\n const duration = Date.now() - startTime;\n const exitData: Record<string, unknown> = {\n class: className,\n method: methodName,\n duration: `${duration}ms`,\n };\n if (options.includeResult) {\n exitData['result'] = result;\n }\n logger[level](`[Exit] ${baseMessage}`, exitData);\n }\n\n return result;\n } catch (error) {\n // Log error\n if (logError) {\n const duration = Date.now() - startTime;\n logger.error(`[Error] ${baseMessage}`, {\n class: className,\n method: methodName,\n duration: `${duration}ms`,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n throw error;\n }\n } as T;\n\n return descriptor;\n };\n}\n\n/**\n * Helper: Check if instrumentation should be skipped\n */\nfunction shouldSkipInstrumentation(\n skipOption: boolean | ((args: unknown[]) => boolean) | undefined,\n args: unknown[]\n): boolean {\n if (!skipOption) {\n return false;\n }\n return typeof skipOption === 'function' ? skipOption(args) : skipOption;\n}\n\n/**\n * Helper: Start and configure tracing span\n */\nfunction startInstrumentationSpan(\n traceOpts: Record<string, unknown> | null,\n operationName: string,\n operationType: string,\n methodName: string,\n className: string,\n args: unknown[]\n): Span | null {\n if (traceOpts === null || !isFeatureEnabled('tracing')) {\n return null;\n }\n\n const tracer = getTracer();\n const span = tracer.startSpan(\n (traceOpts?.['name'] as string | undefined) || operationName,\n (traceOpts?.['kind'] as SpanKind | undefined) || SpanKind.INTERNAL\n );\n\n span.setAttributes({\n 'operation.type': operationType,\n 'code.function': methodName,\n 'code.namespace': className,\n ...(traceOpts?.['attributes'] as SpanAttributes | undefined),\n });\n\n if (traceOpts?.['extractAttributes']) {\n try {\n const extractFn = traceOpts['extractAttributes'] as (args: unknown[]) => SpanAttributes;\n span.setAttributes(extractFn(args));\n } catch {\n // Ignore extraction errors\n }\n }\n\n return span;\n}\n\n/**\n * Helper: Log method entry\n */\nfunction logInstrumentationEntry(\n logOpts: Record<string, unknown> | null,\n operationName: string,\n operationType: string,\n args: unknown[]\n): void {\n if (logOpts === null || !isFeatureEnabled('logging')) {\n return;\n }\n\n if (logOpts?.['logEntry'] === false) {\n return;\n }\n\n const level = (logOpts?.['level'] as 'debug' | 'info' | 'warn' | 'error' | undefined) || 'debug';\n logger[level](`[Enter] ${operationName}`, {\n operation: operationName,\n type: operationType,\n ...(logOpts?.['includeArgs'] ? { args } : {}),\n });\n}\n\n/**\n * Helper: Handle successful method execution\n */\nfunction handleInstrumentationSuccess(\n span: Span | null,\n traceOpts: Record<string, unknown> | null,\n result: unknown\n): void {\n if (!span) {\n return;\n }\n\n span.setStatus(SpanStatus.OK);\n\n if (traceOpts?.['includeResult']) {\n try {\n span.setAttribute('result', JSON.stringify(result).substring(0, 500));\n } catch {\n // Ignore serialization errors\n }\n }\n}\n\n/**\n * Helper: Handle method error\n */\nfunction handleInstrumentationError(\n span: Span | null,\n logOpts: Record<string, unknown> | null,\n operationName: string,\n operationType: string,\n error: unknown,\n startTime: number\n): void {\n if (span && error instanceof Error) {\n span.recordException(error);\n }\n\n if (logOpts !== null && isFeatureEnabled('logging') && logOpts?.['logError'] !== false) {\n logger.error(`[Error] ${operationName}`, {\n operation: operationName,\n type: operationType,\n error: error instanceof Error ? error.message : String(error),\n duration: `${Date.now() - startTime}ms`,\n });\n }\n}\n\n/**\n * Helper: Record metrics in finally block\n */\nfunction recordInstrumentationMetrics(\n metricOpts: Record<string, unknown> | null,\n durationHistogram: ReturnType<typeof createHistogram> | null,\n totalCounter: ReturnType<typeof createCounter> | null,\n errorCounter: ReturnType<typeof createCounter> | null,\n duration: number,\n args: unknown[],\n result: unknown,\n hasError: boolean\n): void {\n if (metricOpts === null || !isFeatureEnabled('metrics')) {\n return;\n }\n\n const labelsFn = metricOpts?.['labels'] as ((args: unknown[], result?: unknown) => MetricLabels) | undefined;\n const labelsObj = metricOpts?.['labels'] as MetricLabels | undefined;\n const labels = typeof metricOpts?.['labels'] === 'function' ? labelsFn?.(args, result) : labelsObj || {};\n\n if (durationHistogram && metricOpts?.['recordDuration'] !== false) {\n durationHistogram.record(duration, labels);\n }\n\n if (totalCounter && metricOpts?.['recordCount'] !== false) {\n totalCounter.inc({ ...labels, status: hasError ? 'error' : 'success' });\n }\n\n if (errorCounter && hasError) {\n errorCounter.inc(labels);\n }\n}\n\n/**\n * Helper: Log method exit in finally block\n */\nfunction logInstrumentationExit(\n logOpts: Record<string, unknown> | null,\n operationName: string,\n operationType: string,\n duration: number,\n result: unknown,\n hasError: boolean\n): void {\n if (logOpts === null || !isFeatureEnabled('logging')) {\n return;\n }\n\n if (logOpts?.['logExit'] === false || hasError) {\n return;\n }\n\n const level = (logOpts?.['level'] as 'debug' | 'info' | 'warn' | 'error' | undefined) || 'debug';\n logger[level](`[Exit] ${operationName}`, {\n operation: operationName,\n type: operationType,\n duration: `${duration}ms`,\n ...(logOpts?.['includeResult'] ? { result } : {}),\n });\n}\n\n/**\n * @Instrument decorator - combines tracing, metrics, and logging\n *\n * @example\n * ```typescript\n * class UserService {\n * @Instrument({\n * operationName: 'getUser',\n * operationType: 'query',\n * trace: true,\n * metrics: true,\n * log: { level: 'debug' }\n * })\n * async getUser(id: string): Promise<User> {\n * // ...\n * }\n * }\n * ```\n */\nexport function Instrument(options: InstrumentOptions = {}): MethodDecorator {\n return function <T>(\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (typeof originalMethod !== 'function') {\n return descriptor;\n }\n\n const className = target.constructor.name;\n const methodName = String(propertyKey);\n const operationName = options.operationName || `${className}.${methodName}`;\n const operationType = options.operationType || 'internal';\n\n // Parse options\n let traceOpts: Record<string, unknown> | null;\n if (options.trace === true) {\n traceOpts = {};\n } else if (options.trace === false || options.trace === undefined) {\n traceOpts = null;\n } else {\n traceOpts = options.trace as Record<string, unknown>;\n }\n\n let metricOpts: Record<string, unknown> | null;\n if (options.metrics === true) {\n metricOpts = {};\n } else if (options.metrics === false || options.metrics === undefined) {\n metricOpts = null;\n } else {\n metricOpts = options.metrics as Record<string, unknown>;\n }\n\n let logOpts: Record<string, unknown> | null;\n if (options.log === true) {\n logOpts = {};\n } else if (options.log === false || options.log === undefined) {\n logOpts = null;\n } else {\n logOpts = options.log as Record<string, unknown>;\n }\n\n // Create metrics if enabled\n let durationHistogram: ReturnType<typeof createHistogram> | null = null;\n let totalCounter: ReturnType<typeof createCounter> | null = null;\n let errorCounter: ReturnType<typeof createCounter> | null = null;\n\n if (metricOpts !== null) {\n const baseName =\n (metricOpts?.['name'] as string | undefined) || `${className.toLowerCase()}_${methodName.toLowerCase()}`;\n durationHistogram = createHistogram(`${baseName}_duration_ms`, `Duration of ${operationName} in ms`);\n totalCounter = createCounter(`${baseName}_total`, `Total calls to ${operationName}`);\n errorCounter = createCounter(`${baseName}_errors_total`, `Total errors in ${operationName}`);\n }\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n // Check skip condition\n if (shouldSkipInstrumentation(options.skip, args)) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n\n const startTime = Date.now();\n let hasError = false;\n let result: unknown;\n\n // Start span and log entry\n const span = startInstrumentationSpan(traceOpts, operationName, operationType, methodName, className, args);\n logInstrumentationEntry(logOpts, operationName, operationType, args);\n\n try {\n result = await (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n handleInstrumentationSuccess(span, traceOpts, result);\n return result;\n } catch (error) {\n hasError = true;\n handleInstrumentationError(span, logOpts, operationName, operationType, error, startTime);\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n\n if (span) {\n span.end();\n }\n\n recordInstrumentationMetrics(\n metricOpts,\n durationHistogram,\n totalCounter,\n errorCounter,\n duration,\n args,\n result,\n hasError\n );\n\n logInstrumentationExit(logOpts, operationName, operationType, duration, result, hasError);\n }\n } as T;\n\n return descriptor;\n };\n}\n\n/**\n * Helper function to create a traced function without decorators\n */\nexport function traced<T extends (...args: unknown[]) => Promise<unknown>>(\n name: string,\n fn: T,\n options?: TraceOptions\n): T {\n return (async (...args: unknown[]) => {\n if (!isFeatureEnabled('tracing')) {\n return fn(...args);\n }\n\n const tracer = getTracer();\n const span = tracer.startSpan(name, options?.kind || SpanKind.INTERNAL);\n\n if (options?.attributes) {\n span.setAttributes(options.attributes);\n }\n\n try {\n const result = await fn(...args);\n span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }) as T;\n}\n\n/**\n * Helper function to create an instrumented function without decorators\n */\nexport function instrumented<T extends (...args: unknown[]) => Promise<unknown>>(\n name: string,\n fn: T,\n options?: InstrumentOptions\n): T {\n const operationType = options?.operationType || 'internal';\n\n // Create metrics\n const durationHistogram =\n options?.metrics !== false\n ? createHistogram(`${name.toLowerCase()}_duration_ms`, `Duration of ${name} in ms`)\n : null;\n const totalCounter =\n options?.metrics !== false ? createCounter(`${name.toLowerCase()}_total`, `Total calls to ${name}`) : null;\n\n return (async (...args: unknown[]) => {\n const startTime = Date.now();\n let span: Span | null = null;\n let hasError = false;\n\n // Start span\n if (options?.trace !== false && isFeatureEnabled('tracing')) {\n span = getTracer().startSpan(name, SpanKind.INTERNAL);\n span.setAttribute('operation.type', operationType);\n }\n\n // Log entry\n if (options?.log !== false && isFeatureEnabled('logging')) {\n logger.debug(`[Enter] ${name}`, { operation: name, type: operationType });\n }\n\n try {\n const result = await fn(...args);\n if (span) span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n hasError = true;\n if (span && error instanceof Error) span.recordException(error);\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n if (span) span.end();\n\n // Record metrics\n if (durationHistogram && isFeatureEnabled('metrics')) {\n durationHistogram.record(duration, { status: hasError ? 'error' : 'success' });\n }\n if (totalCounter && isFeatureEnabled('metrics')) {\n totalCounter.inc({ status: hasError ? 'error' : 'success' });\n }\n\n // Log exit/error\n if (options?.log !== false && isFeatureEnabled('logging')) {\n if (hasError) {\n logger.error(`[Error] ${name}`, { operation: name, duration: `${duration}ms` });\n } else {\n logger.debug(`[Exit] ${name}`, { operation: name, duration: `${duration}ms` });\n }\n }\n }\n }) as T;\n}\n"]}