@ryanzeng/nest-observe 0.1.2 → 0.1.4

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/decorators/metadata.ts","../src/decorators/ignore-trace.decorator.ts","../src/decorators/trace.decorator.ts","../src/decorators/invoke.ts","../src/logs/nest-logger-instrumentation.ts","../src/security/redaction.ts","../src/logs/otel-log-emitter.ts","../src/instrumentation/nest-compatible-instrumentation.ts","../src/nest/method-instrumenter.ts","../src/metrics/http-request-metrics.ts","../src/metrics/runtime-metrics.ts","../src/nest/observe.module.ts","../src/sdk.ts","../src/diagnostics.ts","../src/exceptions/process-exception-capture.ts","../src/resource.ts","../package.json","../src/security/span-redaction-processor.ts"],"sourcesContent":["export * from './config';\nexport * from './decorators';\nexport * from './logs';\nexport * from './instrumentation';\nexport * from './metrics';\nexport * from './nest';\nexport * from './resource';\nexport * from './security';\nexport * from './sdk';\nexport * from './types';\n","import { randomUUID } from 'node:crypto';\nimport type { ObserveOptions, ResolvedObserveConfig } from './types';\n\ntype Environment = Record<string, string | undefined>;\n\nconst DEFAULT_ALLOWED_HEADERS = ['accept', 'content-type', 'user-agent', 'x-request-id', 'traceparent'];\n\nfunction booleanValue(value: boolean | string | undefined, fallback: boolean): boolean {\n if (typeof value === 'boolean') return value;\n if (value?.toLowerCase() === 'true') return true;\n if (value?.toLowerCase() === 'false') return false;\n return fallback;\n}\n\nfunction positiveInteger(value: number | string | undefined, fallback: number): number {\n const number = Number(value);\n return Number.isFinite(number) && number > 0 ? Math.floor(number) : fallback;\n}\n\nfunction samplingValue(value: number | string | undefined): number {\n const number = Number(value);\n if (!Number.isFinite(number)) return 1;\n return Math.min(1, Math.max(0, number));\n}\n\nfunction environmentSampling(env: Environment): number {\n const sampler = env.OTEL_TRACES_SAMPLER?.toLowerCase();\n if (sampler === 'always_off' || sampler === 'parentbased_always_off') return 0;\n if (sampler === 'always_on' || sampler === 'parentbased_always_on') return 1;\n return samplingValue(env.OTEL_TRACES_SAMPLER_ARG);\n}\n\nfunction decode(value: string): string {\n try {\n return decodeURIComponent(value.trim());\n } catch {\n return value.trim();\n }\n}\n\nexport function parseKeyValueList(value?: string): Record<string, string> {\n if (!value) return {};\n return Object.fromEntries(value.split(',').flatMap((entry) => {\n const separator = entry.indexOf('=');\n if (separator <= 0) return [];\n const key = decode(entry.slice(0, separator));\n const itemValue = decode(entry.slice(separator + 1));\n return key ? [[key, itemValue]] : [];\n }));\n}\n\nfunction appendSignalPath(endpoint: string | undefined, signal: 'traces' | 'metrics' | 'logs'): string | undefined {\n if (!endpoint) return undefined;\n return `${endpoint.replace(/\\/+$/, '')}/v1/${signal}`;\n}\n\nfunction optionalString(value: string | undefined): string | undefined {\n const result = value?.trim();\n return result ? result : undefined;\n}\n\nexport function resolveObserveConfig(\n options: ObserveOptions = {},\n env: Environment = process.env,\n): ResolvedObserveConfig {\n const otelResources = parseKeyValueList(env.OTEL_RESOURCE_ATTRIBUTES);\n const resourceAttributes = { ...otelResources, ...options.resourceAttributes };\n const genericEndpoint = optionalString(options.endpoint ?? env.OTEL_EXPORTER_OTLP_ENDPOINT);\n const sampling = options.sampling === undefined\n ? environmentSampling(env)\n : samplingValue(options.sampling);\n const allowedHeaders = Array.from(new Set([\n ...DEFAULT_ALLOWED_HEADERS,\n ...(options.allowedHeaders ?? []),\n ].map((header) => header.toLowerCase().trim()).filter(Boolean)));\n\n const result: ResolvedObserveConfig = {\n enabled: booleanValue(options.enabled ?? env.OBSERVE_ENABLED, true),\n serviceName: options.serviceName ?? env.OTEL_SERVICE_NAME ?? otelResources['service.name'] ?? 'nest-application',\n serviceVersion: options.serviceVersion ?? env.OTEL_SERVICE_VERSION ?? otelResources['service.version'] ?? 'unknown',\n environment: options.environment\n ?? env.OBSERVE_ENVIRONMENT\n ?? otelResources['deployment.environment.name']\n ?? env.NODE_ENV\n ?? 'development',\n instanceId: options.instanceId\n ?? otelResources['service.instance.id']\n ?? env.OTEL_SERVICE_INSTANCE_ID\n ?? env.HOSTNAME\n ?? randomUUID(),\n endpoints: {\n traces: optionalString(env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'traces'),\n metrics: optionalString(env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'metrics'),\n logs: optionalString(env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'logs'),\n },\n headers: { ...parseKeyValueList(env.OTEL_EXPORTER_OTLP_HEADERS), ...options.headers },\n traces: booleanValue(options.traces, true),\n logs: booleanValue(options.logs, true),\n metrics: booleanValue(options.metrics, true),\n providerTracing: booleanValue(options.providerTracing, true),\n controllerTracing: booleanValue(options.controllerTracing, true),\n sampling,\n allowedHeaders,\n exportTimeoutMillis: positiveInteger(options.exportTimeoutMillis ?? env.OTEL_EXPORTER_OTLP_TIMEOUT, 10_000),\n metricExportIntervalMillis: positiveInteger(options.metricExportIntervalMillis ?? env.OTEL_METRIC_EXPORT_INTERVAL, 60_000),\n resourceAttributes,\n diagnosticLogging: booleanValue(options.diagnosticLogging, true),\n failFast: booleanValue(options.failFast, false),\n };\n if (options.exporters) result.exporters = options.exporters;\n return result;\n}\n","const ignoredTargets = new WeakSet<object>();\nconst tracedTargets = new WeakSet<object>();\n\nexport function markTraceIgnored(target: object): void {\n ignoredTargets.add(target);\n}\n\nexport function markTraceDecorated(target: object): void {\n tracedTargets.add(target);\n}\n\nexport function isTraceIgnored(method?: object, type?: object): boolean {\n return Boolean((method && ignoredTargets.has(method)) || (type && ignoredTargets.has(type)));\n}\n\nexport function isTraceDecorated(method?: object): boolean {\n return Boolean(method && tracedTargets.has(method));\n}\n","import { markTraceIgnored } from './metadata';\n\ntype IgnoreDecorator = MethodDecorator & ClassDecorator;\n\nexport function IgnoreTrace(): IgnoreDecorator {\n return ((target: object | Function, propertyKey?: string | symbol, descriptor?: PropertyDescriptor) => {\n if (propertyKey !== undefined && descriptor?.value && typeof descriptor.value === 'function') {\n markTraceIgnored(descriptor.value);\n return descriptor;\n }\n markTraceIgnored(target);\n return target;\n }) as IgnoreDecorator;\n}\n","import { trace } from \"@opentelemetry/api\";\nimport { invokeWithSpan } from \"./invoke\";\nimport { isTraceIgnored, markTraceDecorated } from \"./metadata\";\n\nexport interface TraceOptions {\n name?: string;\n attributes?: Record<string, string>;\n}\n\ntype TraceDecorator = MethodDecorator & ClassDecorator;\n\nfunction decorateMethod(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n options: TraceOptions,\n): void {\n const original = descriptor.value as (...args: unknown[]) => unknown;\n if (\n typeof original !== \"function\" ||\n isTraceIgnored(original, target.constructor)\n )\n return;\n const className = target.constructor?.name || \"Anonymous\";\n const methodName = String(propertyKey);\n const wrapped = function (this: unknown, ...args: unknown[]) {\n const tracer = trace.getTracer(\"@ryanzeng/nest-observe\");\n return invokeWithSpan(\n tracer,\n options.name ?? `${className}.${methodName}`,\n {\n \"code.function.name\": methodName,\n \"nestjs.class\": className,\n \"nestjs.method\": methodName,\n ...options.attributes,\n },\n () => original.apply(this, args),\n );\n };\n Object.defineProperty(wrapped, \"name\", {\n value: original.name,\n configurable: true,\n });\n markTraceDecorated(wrapped);\n descriptor.value = wrapped;\n}\n\nexport function Trace(\n nameOrOptions: string | TraceOptions = {},\n): TraceDecorator {\n const options =\n typeof nameOrOptions === \"string\" ? { name: nameOrOptions } : nameOrOptions;\n return ((\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor,\n ) => {\n if (propertyKey !== undefined && descriptor) {\n decorateMethod(target as object, propertyKey, descriptor, options);\n return descriptor;\n }\n const prototype = (target as { prototype?: object }).prototype;\n if (!prototype) return target;\n for (const key of Object.getOwnPropertyNames(prototype)) {\n if (key === \"constructor\") continue;\n const item = Object.getOwnPropertyDescriptor(prototype, key);\n if (!item || typeof item.value !== \"function\") continue;\n decorateMethod(prototype, key, item, options);\n Object.defineProperty(prototype, key, item);\n }\n return target;\n }) as TraceDecorator;\n}\n","import { context, SpanStatusCode, type Span, type Tracer } from '@opentelemetry/api';\nimport { isObservable, Observable } from 'rxjs';\nimport { finalize, tap } from 'rxjs/operators';\n\nfunction fail(span: Span, error: unknown): void {\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) });\n}\n\nexport function invokeWithSpan<T>(\n tracer: Tracer,\n spanName: string,\n attributes: Record<string, string>,\n invoke: () => T,\n onFinish?: (durationSeconds: number, error?: unknown) => void,\n): T {\n return tracer.startActiveSpan(spanName, { attributes }, (span) => {\n const started = process.hrtime.bigint();\n const finish = (error?: unknown) => {\n if (error !== undefined) fail(span, error);\n else span.setStatus({ code: SpanStatusCode.OK });\n onFinish?.(Number(process.hrtime.bigint() - started) / 1e9, error);\n span.end();\n };\n try {\n const result = invoke();\n if (result instanceof Promise) {\n return result.then(\n (value) => { finish(); return value; },\n (error: unknown) => { finish(error); throw error; },\n ) as T;\n }\n if (isObservable(result)) {\n const spanContext = context.active();\n const source = result as Observable<unknown>;\n return new Observable((subscriber) => context.with(spanContext, () => {\n let streamError: unknown;\n return source.pipe(\n tap({ error: (error: unknown) => { streamError = error; } }),\n finalize(() => finish(streamError)),\n ).subscribe(subscriber);\n })) as T;\n }\n finish();\n return result;\n } catch (error) {\n finish(error);\n throw error;\n }\n });\n}\n","import { ConsoleLogger } from '@nestjs/common';\nimport { trace } from '@opentelemetry/api';\nimport { redact, redactText } from '../security/redaction';\nimport type { StructuredLogEmitter, StructuredLogRecord } from './types';\n\ntype LogMethod = 'verbose' | 'debug' | 'log' | 'warn' | 'error' | 'fatal';\ntype ConsoleLoggerWithContext = ConsoleLogger & { context?: string };\n\nconst SEVERITY: Record<LogMethod, StructuredLogRecord['severityText']> = {\n verbose: 'TRACE',\n debug: 'DEBUG',\n log: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n fatal: 'FATAL',\n};\n\nfunction bodyValue(message: unknown): unknown {\n if (message instanceof Error) return redactText(message.stack ?? `${message.name}: ${message.message}`);\n const sanitized = redact(message);\n if (sanitized === null || typeof sanitized !== 'object') return sanitized;\n try {\n return JSON.stringify(sanitized, (_key, value) => (\n typeof value === 'bigint' ? value.toString() : value\n ));\n } catch {\n return redactText(String(sanitized));\n }\n}\n\nexport class NestLoggerInstrumentation {\n private originals = new Map<LogMethod, (...args: unknown[]) => void>();\n private enabled = false;\n\n constructor(\n private readonly emitter: StructuredLogEmitter,\n private readonly resourceAttributes: Record<string, string> = {},\n ) {}\n\n enable(): void {\n if (this.enabled) return;\n this.enabled = true;\n const prototype = ConsoleLogger.prototype as unknown as Record<LogMethod, (...args: unknown[]) => void>;\n for (const method of Object.keys(SEVERITY) as LogMethod[]) {\n const original = prototype[method];\n if (typeof original !== 'function') continue;\n this.originals.set(method, original);\n const emitter = this.emitter;\n const resourceAttributes = this.resourceAttributes;\n prototype[method] = function (this: ConsoleLoggerWithContext, message: unknown, ...args: unknown[]) {\n try {\n const spanContext = trace.getActiveSpan()?.spanContext();\n const contextName = this.context\n ?? (typeof args.at(-1) === 'string' ? String(args.at(-1)) : undefined);\n const attributes: Record<string, string> = { ...resourceAttributes };\n if (contextName) attributes['nestjs.context'] = contextName;\n if (spanContext?.traceId) attributes.trace_id = spanContext.traceId;\n if (spanContext?.spanId) attributes.span_id = spanContext.spanId;\n emitter.emit({\n body: bodyValue(message),\n severityText: SEVERITY[method],\n attributes,\n timestamp: Date.now(),\n });\n } catch {\n // Telemetry is best-effort and may never alter business logging behavior.\n }\n return original.call(this, message, ...args);\n };\n }\n }\n\n disable(): void {\n if (!this.enabled) return;\n const prototype = ConsoleLogger.prototype as unknown as Record<LogMethod, (...args: unknown[]) => void>;\n for (const [method, original] of this.originals) prototype[method] = original;\n this.originals.clear();\n this.enabled = false;\n }\n}\n","export const REDACTED = '[REDACTED]';\n\nconst SENSITIVE_KEY = /(?:authorization|proxy-authorization|cookie|set-cookie|pass(?:word|wd)?|secret|token|api[-_]?key|phone|mobile)/i;\n\nexport function isSensitiveKey(name: string): boolean {\n return SENSITIVE_KEY.test(name);\n}\n\nexport function redactText(value: string): string {\n return value\n .replace(/(?<!\\d)1[3-9]\\d{9}(?!\\d)/g, REDACTED)\n .replace(/\\b(authorization|proxy-authorization)\\s*[:=]\\s*(?:bearer\\s+|basic\\s+)?[^\\s,;]+/gi, `$1=${REDACTED}`)\n .replace(/\\b(password|passwd|secret|token|access_token|api[-_]?key|cookie)\\s*[:=]\\s*[^\\s,;]+/gi, `$1=${REDACTED}`)\n .replace(/\\bbearer\\s+[A-Za-z0-9._~+/=-]+/gi, `Bearer ${REDACTED}`);\n}\n\nfunction errorValue(error: Error): Record<string, string> {\n return {\n name: error.name,\n message: redactText(error.message),\n ...(error.stack ? { stack: redactText(error.stack) } : {}),\n };\n}\n\nfunction visit(value: unknown, seen: WeakSet<object>): unknown {\n if (typeof value === 'string') return redactText(value);\n if (value === null || typeof value !== 'object') return value;\n if (value instanceof Error) return errorValue(value);\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n if (Array.isArray(value)) return value.map((item) => visit(item, seen));\n const output: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n output[key] = SENSITIVE_KEY.test(key) ? REDACTED : visit(item, seen);\n }\n return output;\n}\n\nexport function redact<T>(value: T): T {\n return visit(value, new WeakSet()) as T;\n}\n\nexport function sanitizeHeaders(\n headers: Record<string, string | string[] | undefined>,\n allowedHeaders: readonly string[],\n): Record<string, string> {\n const allowed = new Set(allowedHeaders.map((header) => header.toLowerCase()));\n const output: Record<string, string> = {};\n for (const [originalName, value] of Object.entries(headers)) {\n const name = originalName.toLowerCase();\n if (!allowed.has(name) || value === undefined) continue;\n output[name] = SENSITIVE_KEY.test(name)\n ? REDACTED\n : Array.isArray(value) ? value.join(', ') : value;\n }\n return output;\n}\n","import { context, type Attributes } from \"@opentelemetry/api\";\nimport { logs, SeverityNumber, type Logger } from \"@opentelemetry/api-logs\";\nimport type { StructuredLogEmitter, StructuredLogRecord } from \"./types\";\n\nconst SEVERITY_NUMBER: Record<\n StructuredLogRecord[\"severityText\"],\n SeverityNumber\n> = {\n TRACE: SeverityNumber.TRACE,\n DEBUG: SeverityNumber.DEBUG,\n INFO: SeverityNumber.INFO,\n WARN: SeverityNumber.WARN,\n ERROR: SeverityNumber.ERROR,\n FATAL: SeverityNumber.FATAL,\n};\n\nexport class OpenTelemetryLogEmitter implements StructuredLogEmitter {\n private readonly logger: Logger;\n\n constructor(\n name = \"@ryanzeng/nest-observe\",\n version?: string,\n logger?: Logger,\n ) {\n this.logger = logger ?? logs.getLogger(name, version);\n }\n\n emit(record: StructuredLogRecord): void {\n this.logger.emit({\n body: record.body as never,\n severityText: record.severityText,\n severityNumber: SEVERITY_NUMBER[record.severityText],\n attributes: record.attributes as Attributes,\n ...(record.timestamp === undefined\n ? {}\n : { timestamp: record.timestamp }),\n context: context.active(),\n });\n }\n}\n","import {\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n type InstrumentationConfig,\n} from '@opentelemetry/instrumentation';\nimport { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core';\nimport { NestMethodInstrumenter } from '../nest/method-instrumenter';\n\nconst SUPPORTED_NEST_VERSIONS = ['>=4.0.0 <13'];\n\ntype NestWrapper = {\n instance?: object;\n metatype?: Function;\n name?: string;\n token?: unknown;\n host?: {\n name?: string;\n controllers?: Map<unknown, unknown>;\n };\n};\n\ntype InjectorExports = {\n Injector: {\n prototype: {\n instantiateClass: (...args: unknown[]) => Promise<unknown>;\n };\n };\n};\n\nexport interface CompatibleNestInstrumentationConfig extends InstrumentationConfig {\n providerTracing?: boolean;\n controllerTracing?: boolean;\n}\n\n/** Extends upstream Nest support to v12 and instruments DI-created providers. */\nexport class CompatibleNestInstrumentation extends NestInstrumentation {\n private methodInstrumenter?: NestMethodInstrumenter;\n\n constructor(private readonly observeConfig: CompatibleNestInstrumentationConfig = {}) {\n super(observeConfig);\n }\n\n override init(): InstrumentationNodeModuleDefinition {\n const definition = new InstrumentationNodeModuleDefinition('@nestjs/core', SUPPORTED_NEST_VERSIONS);\n definition.files.push(\n this.getNestFactoryFileInstrumentation(SUPPORTED_NEST_VERSIONS),\n this.getRouterExecutionContextFileInstrumentation(SUPPORTED_NEST_VERSIONS),\n new InstrumentationNodeModuleFile(\n '@nestjs/core/injector/injector.js',\n SUPPORTED_NEST_VERSIONS,\n (moduleExports: InjectorExports) => {\n const instrumentation = this;\n this._wrap(moduleExports.Injector.prototype, 'instantiateClass', (original) => {\n return async function (this: unknown, ...args: unknown[]) {\n const instance = await original.apply(this, args);\n try {\n const wrapper = args[1] as NestWrapper | undefined;\n if (!instance || typeof instance !== 'object' || !wrapper?.metatype) return instance;\n if (['InternalCoreModule', 'ObserveModule', 'DiscoveryModule'].includes(wrapper.host?.name ?? '')) {\n return instance;\n }\n const isController = wrapper.host?.controllers?.get(wrapper.token) === wrapper;\n if ((isController && instrumentation.observeConfig.controllerTracing === false)\n || (!isController && instrumentation.observeConfig.providerTracing === false)) {\n return instance;\n }\n instrumentation.getMethodInstrumenter().instrumentInstance(\n instance,\n isController ? 'controller' : 'provider',\n wrapper.name ?? wrapper.metatype.name,\n );\n } catch {\n // Framework internals vary by Nest version; instrumentation remains best-effort.\n }\n return instance;\n };\n });\n return moduleExports;\n },\n (moduleExports: InjectorExports) => {\n this._unwrap(moduleExports.Injector.prototype, 'instantiateClass');\n },\n ),\n );\n return definition;\n }\n\n private getMethodInstrumenter(): NestMethodInstrumenter {\n return this.methodInstrumenter ??= new NestMethodInstrumenter(this.tracer, this.meter);\n }\n}\n","import type { Meter, Tracer } from '@opentelemetry/api';\nimport { invokeWithSpan } from '../decorators/invoke';\nimport { isTraceDecorated, isTraceIgnored, markTraceDecorated } from '../decorators/metadata';\n\nexport type NestComponentKind = 'provider' | 'controller';\n\nexport class NestMethodInstrumenter {\n private readonly calls;\n private readonly duration;\n private readonly errors;\n private readonly instrumented = new WeakMap<object, Set<string>>();\n\n constructor(private readonly tracer: Tracer, meter: Meter) {\n this.calls = meter.createCounter('nestjs.method.calls', { unit: '{call}' });\n this.duration = meter.createHistogram('nestjs.method.duration', {\n unit: 's',\n advice: { explicitBucketBoundaries: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5] },\n });\n this.errors = meter.createCounter('nestjs.method.errors', { unit: '{error}' });\n }\n\n instrumentInstance(instance: object, kind: NestComponentKind, componentName?: string): void {\n const type = instance.constructor as Function;\n const prototype = Object.getPrototypeOf(instance) as object | null;\n if (!prototype) return;\n this.instrumentTarget(instance, prototype, type, kind, componentName);\n }\n\n instrumentPrototype(type: Function, kind: NestComponentKind, componentName?: string): void {\n const prototype = (type as { prototype?: object }).prototype;\n if (!prototype) return;\n this.instrumentTarget(prototype, prototype, type, kind, componentName);\n }\n\n private instrumentTarget(\n target: object,\n prototype: object,\n type: Function,\n kind: NestComponentKind,\n componentName?: string,\n ): void {\n if (isTraceIgnored(type)) return;\n const completed = this.instrumented.get(target) ?? new Set<string>();\n this.instrumented.set(target, completed);\n for (const methodName of Object.getOwnPropertyNames(prototype)) {\n if (methodName === 'constructor' || completed.has(methodName) || methodName.startsWith('onModule')) continue;\n const descriptor = Object.getOwnPropertyDescriptor(prototype, methodName);\n const original = descriptor?.value as ((...args: unknown[]) => unknown) | undefined;\n if (!descriptor || typeof original !== 'function' || isTraceIgnored(original, type) || isTraceDecorated(original)) continue;\n const existing = Reflect.get(target, methodName) as unknown;\n if (typeof existing === 'function' && existing !== original && isTraceDecorated(existing)) continue;\n const name = componentName || type.name || 'Anonymous';\n const attributes: Record<string, string> = {\n [`nestjs.${kind}`]: name,\n 'nestjs.method': methodName,\n };\n const instrumenter = this;\n const wrapped = function (this: unknown, ...args: unknown[]) {\n instrumenter.calls.add(1, attributes);\n return invokeWithSpan(\n instrumenter.tracer,\n `${name}.${methodName}`,\n attributes,\n () => original.apply(this, args),\n (seconds, error) => {\n instrumenter.duration.record(seconds, attributes);\n if (error !== undefined) instrumenter.errors.add(1, attributes);\n },\n );\n };\n markTraceDecorated(wrapped);\n try {\n Object.defineProperty(target, methodName, { ...descriptor, value: wrapped });\n completed.add(methodName);\n } catch {\n // Frozen or proxy-managed framework instances are intentionally skipped.\n }\n }\n }\n}\n","import type { Meter } from '@opentelemetry/api';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\n\ntype FrameworkRequest = IncomingMessage & {\n baseUrl?: string;\n route?: { path?: string };\n routerPath?: string;\n routeOptions?: { url?: string };\n};\n\nfunction routeFor(request: FrameworkRequest): string {\n const route = request.route?.path ?? request.routerPath ?? request.routeOptions?.url;\n if (!route) return '<unmatched>';\n return `${request.baseUrl ?? ''}${route}` || '<unmatched>';\n}\n\nexport class HttpRequestMetrics {\n private readonly requestCount;\n private readonly requestDuration;\n private readonly errorCount;\n private readonly startedAt = new WeakMap<IncomingMessage, bigint>();\n\n constructor(meter: Meter, private readonly serviceName: string) {\n this.requestCount = meter.createCounter('http.server.request.count', {\n description: 'Number of completed inbound HTTP requests',\n unit: '{request}',\n });\n this.requestDuration = meter.createHistogram('http.server.request.duration', {\n description: 'Inbound HTTP request duration',\n unit: 's',\n advice: { explicitBucketBoundaries: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10] },\n });\n this.errorCount = meter.createCounter('http.server.error.count', {\n description: 'Number of failed inbound HTTP requests',\n unit: '{error}',\n });\n }\n\n start(request: IncomingMessage): boolean {\n if (this.startedAt.has(request)) return false;\n this.startedAt.set(request, process.hrtime.bigint());\n return true;\n }\n\n record(request: IncomingMessage, response: ServerResponse): boolean {\n const started = this.startedAt.get(request);\n if (started === undefined) return false;\n this.startedAt.delete(request);\n const statusCode = Number.isFinite(response.statusCode) ? response.statusCode : 0;\n const attributes = {\n 'service.name': this.serviceName,\n 'http.route': routeFor(request as FrameworkRequest),\n 'http.request.method': request.method ?? 'UNKNOWN',\n 'http.response.status_code': statusCode,\n };\n this.requestCount.add(1, attributes);\n this.requestDuration.record(Number(process.hrtime.bigint() - started) / 1e9, attributes);\n if (statusCode >= 500) this.errorCount.add(1, attributes);\n return true;\n }\n}\n","import { cpus } from 'node:os';\nimport { monitorEventLoopDelay, PerformanceObserver, performance } from 'node:perf_hooks';\nimport type { Meter, ObservableCallback, ObservableResult } from '@opentelemetry/api';\n\ntype RemovableInstrument = {\n addCallback(callback: ObservableCallback): void;\n removeCallback(callback: ObservableCallback): void;\n};\n\nexport class RuntimeMetrics {\n private readonly callbacks: Array<{ instrument: RemovableInstrument; callback: ObservableCallback }> = [];\n private eventLoopDelay: ReturnType<typeof monitorEventLoopDelay> | undefined;\n private gcObserver: PerformanceObserver | undefined;\n private started = false;\n private previousElu = performance.eventLoopUtilization();\n\n constructor(private readonly meter: Meter) {}\n\n private observe(instrument: RemovableInstrument, callback: ObservableCallback): void {\n instrument.addCallback(callback);\n this.callbacks.push({ instrument, callback });\n }\n\n start(): void {\n if (this.started) return;\n this.started = true;\n const systemCpu = this.meter.createObservableGauge('system.cpu.utilization', { unit: '1' });\n this.observe(systemCpu, (result: ObservableResult) => {\n const cores = cpus();\n let idle = 0;\n let total = 0;\n for (const core of cores) {\n idle += core.times.idle;\n total += Object.values(core.times).reduce((sum, value) => sum + value, 0);\n }\n result.observe(total ? (total - idle) / total : 0);\n });\n\n const processCpu = this.meter.createObservableCounter('process.cpu.time', { unit: 's' });\n this.observe(processCpu, (result: ObservableResult) => {\n const cpu = process.cpuUsage();\n result.observe((cpu.user + cpu.system) / 1e6);\n });\n\n const rss = this.meter.createObservableGauge('process.memory.rss', { unit: 'By' });\n const heapUsed = this.meter.createObservableGauge('nodejs.memory.heap.used', { unit: 'By' });\n const heapTotal = this.meter.createObservableGauge('nodejs.memory.heap.total', { unit: 'By' });\n this.observe(rss, (result: ObservableResult) => result.observe(process.memoryUsage().rss));\n this.observe(heapUsed, (result: ObservableResult) => result.observe(process.memoryUsage().heapUsed));\n this.observe(heapTotal, (result: ObservableResult) => result.observe(process.memoryUsage().heapTotal));\n\n this.eventLoopDelay = monitorEventLoopDelay({ resolution: 20 });\n this.eventLoopDelay.enable();\n const delay = this.meter.createObservableGauge('nodejs.eventloop.delay', { unit: 's' });\n this.observe(delay, (result: ObservableResult) => {\n const mean = this.eventLoopDelay?.mean ?? 0;\n result.observe(Number.isFinite(mean) ? mean / 1e9 : 0);\n this.eventLoopDelay?.reset();\n });\n\n const utilization = this.meter.createObservableGauge('nodejs.eventloop.utilization', { unit: '1' });\n this.observe(utilization, (result: ObservableResult) => {\n const current = performance.eventLoopUtilization(this.previousElu);\n this.previousElu = performance.eventLoopUtilization();\n result.observe(current.utilization);\n });\n\n const gc = this.meter.createHistogram('nodejs.gc.duration', { unit: 's' });\n this.gcObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const detail = (entry as unknown as { detail?: { kind?: number } }).detail;\n gc.record(entry.duration / 1_000, { 'nodejs.gc.type': String(detail?.kind ?? 'unknown') });\n }\n });\n try { this.gcObserver.observe({ entryTypes: ['gc'] }); } catch { /* unsupported runtime */ }\n\n const uptime = this.meter.createObservableGauge('process.uptime', { unit: 's' });\n this.observe(uptime, (result: ObservableResult) => result.observe(process.uptime()));\n }\n\n stop(): void {\n for (const { instrument, callback } of this.callbacks) instrument.removeCallback(callback);\n this.callbacks.length = 0;\n this.eventLoopDelay?.disable();\n this.eventLoopDelay = undefined;\n this.gcObserver?.disconnect();\n this.gcObserver = undefined;\n this.started = false;\n }\n}\n","import {\n type CallHandler,\n type ExecutionContext,\n DynamicModule,\n Global,\n Inject,\n Injectable,\n Module,\n type NestInterceptor,\n OnApplicationShutdown,\n OnModuleInit,\n} from '@nestjs/common';\nimport { APP_INTERCEPTOR, DiscoveryModule, DiscoveryService } from '@nestjs/core';\nimport { metrics, trace } from '@opentelemetry/api';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Observable } from 'rxjs';\nimport { finalize } from 'rxjs';\nimport { getObserveRuntime, observe, type ObserveRuntime } from '../sdk';\nimport type { ObserveOptions } from '../types';\nimport { SDK_NAME, SDK_VERSION } from '../resource';\nimport { NestMethodInstrumenter } from './method-instrumenter';\n\nexport const OBSERVE_OPTIONS = Symbol('OBSERVE_OPTIONS');\nexport const OBSERVE_HANDLE = Symbol('OBSERVE_HANDLE');\n\ntype FrameworkResponse = ServerResponse & {\n raw?: ServerResponse;\n};\n\n/** Provides inbound HTTP metrics when module-load instrumentation was registered too late. */\n@Injectable()\nexport class NestHttpMetricsInterceptor implements NestInterceptor {\n constructor(@Inject(OBSERVE_HANDLE) private readonly handle: ObserveRuntime) {}\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n if (context.getType() !== 'http' || !this.handle.started || !this.handle.httpRequestMetrics) {\n return next.handle();\n }\n const http = context.switchToHttp();\n const request = http.getRequest<IncomingMessage>();\n const response = http.getResponse<FrameworkResponse>();\n const started = this.handle.httpRequestMetrics.start(request);\n const result = next.handle();\n if (!started) return result;\n\n const responseEventSource = response.raw ?? response;\n if (typeof responseEventSource.once === 'function') {\n responseEventSource.once('finish', () => {\n this.handle.httpRequestMetrics?.record(request, response);\n });\n return result;\n }\n return result.pipe(finalize(() => {\n this.handle.httpRequestMetrics?.record(request, response);\n }));\n }\n}\n\ntype DiscoveredWrapper = {\n instance?: object;\n metatype?: Function;\n name?: string;\n host?: { name?: string };\n};\n\n@Injectable()\nclass NestObserveExplorer implements OnModuleInit, OnApplicationShutdown {\n constructor(\n @Inject(DiscoveryService) private readonly discovery: DiscoveryService,\n @Inject(OBSERVE_OPTIONS) private readonly options: ObserveOptions,\n @Inject(OBSERVE_HANDLE) private readonly handle: ObserveRuntime,\n ) {}\n\n onModuleInit(): void {\n if (!this.handle.started) return;\n const runtime = getObserveRuntime();\n const tracer = runtime?.tracerProvider?.getTracer(SDK_NAME, SDK_VERSION) ?? trace.getTracer(SDK_NAME, SDK_VERSION);\n const meter = runtime?.meterProvider?.getMeter(SDK_NAME, SDK_VERSION) ?? metrics.getMeter(SDK_NAME, SDK_VERSION);\n const instrumenter = new NestMethodInstrumenter(tracer, meter);\n if (this.options.providerTracing !== false) {\n this.instrument(this.discovery.getProviders() as DiscoveredWrapper[], instrumenter, 'provider');\n }\n if (this.options.controllerTracing !== false) {\n this.instrument(this.discovery.getControllers() as DiscoveredWrapper[], instrumenter, 'controller');\n }\n }\n\n private instrument(\n wrappers: DiscoveredWrapper[],\n instrumenter: NestMethodInstrumenter,\n kind: 'provider' | 'controller',\n ): void {\n for (const wrapper of wrappers) {\n if (!wrapper.metatype) continue;\n if (['ObserveModule', 'DiscoveryModule', 'InternalCoreModule'].includes(wrapper.host?.name ?? '')) continue;\n if ((wrapper.metatype as Function) === NestObserveExplorer) continue;\n if (wrapper.instance) {\n instrumenter.instrumentInstance(wrapper.instance, kind, wrapper.name ?? wrapper.metatype.name);\n } else {\n instrumenter.instrumentPrototype(wrapper.metatype, kind, wrapper.name ?? wrapper.metatype.name);\n }\n }\n }\n\n async onApplicationShutdown(): Promise<void> {\n await this.handle.shutdown();\n }\n}\n\n@Global()\n@Module({})\nexport class ObserveModule {\n static forRoot(options: ObserveOptions = {}): DynamicModule {\n return {\n module: ObserveModule,\n global: true,\n imports: [DiscoveryModule],\n providers: [\n { provide: OBSERVE_OPTIONS, useValue: options },\n { provide: OBSERVE_HANDLE, useFactory: () => observe(options) },\n { provide: APP_INTERCEPTOR, useClass: NestHttpMetricsInterceptor },\n NestObserveExplorer,\n ],\n exports: [OBSERVE_HANDLE],\n };\n }\n}\n","import { logs } from '@opentelemetry/api-logs';\nimport { metrics, trace } from '@opentelemetry/api';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { registerInstrumentations, type Instrumentation } from '@opentelemetry/instrumentation';\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http';\nimport { PrismaInstrumentation } from '@prisma/instrumentation';\nimport { BatchLogRecordProcessor, LoggerProvider, type LogRecordExporter } from '@opentelemetry/sdk-logs';\nimport { AggregationType, MeterProvider, PeriodicExportingMetricReader, type MetricReader } from '@opentelemetry/sdk-metrics';\nimport { AlwaysOffSampler, BatchSpanProcessor, ParentBasedSampler, TraceIdRatioBasedSampler, type SpanExporter, type SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resolveObserveConfig } from './config';\nimport { ObserveDiagnostics, toError, withExporterDiagnostics } from './diagnostics';\nimport { ProcessExceptionCapture } from './exceptions/process-exception-capture';\nimport { CompatibleNestInstrumentation } from './instrumentation';\nimport { NestLoggerInstrumentation, OpenTelemetryLogEmitter } from './logs';\nimport { HttpRequestMetrics, RuntimeMetrics } from './metrics';\nimport { createObserveResource, SDK_NAME, SDK_VERSION } from './resource';\nimport { isSensitiveKey } from './security/redaction';\nimport { SpanRedactionProcessor } from './security/span-redaction-processor';\nimport type {\n ObserveErrorEvent,\n ObserveHandle,\n ObserveOptions,\n ObserveSignal,\n ObserveStatus,\n ResolvedObserveConfig,\n} from './types';\n\nexport interface ObserveRuntime extends ObserveHandle {\n readonly tracerProvider: NodeTracerProvider | undefined;\n readonly meterProvider: MeterProvider | undefined;\n readonly loggerProvider: LoggerProvider | undefined;\n readonly httpRequestMetrics: HttpRequestMetrics | undefined;\n}\n\nclass InactiveObserveHandle implements ObserveRuntime {\n readonly started = false;\n readonly tracerProvider = undefined;\n readonly meterProvider = undefined;\n readonly loggerProvider = undefined;\n readonly httpRequestMetrics = undefined;\n constructor(\n readonly config: Readonly<ResolvedObserveConfig>,\n private readonly diagnostics: ObserveDiagnostics,\n ) {}\n get status(): ObserveStatus { return this.diagnostics.status; }\n get lastError(): ObserveErrorEvent | undefined { return this.diagnostics.lastError; }\n forceFlush(): Promise<void> { return Promise.resolve(); }\n shutdown(): Promise<void> { return Promise.resolve(); }\n}\n\nclass ActiveObserveHandle implements ObserveRuntime {\n readonly started = true;\n private stopped = false;\n\n constructor(\n readonly config: Readonly<ResolvedObserveConfig>,\n readonly tracerProvider: NodeTracerProvider | undefined,\n readonly meterProvider: MeterProvider | undefined,\n readonly loggerProvider: LoggerProvider | undefined,\n readonly httpRequestMetrics: HttpRequestMetrics | undefined,\n private readonly runtimeMetrics: RuntimeMetrics | undefined,\n private readonly loggerInstrumentation: NestLoggerInstrumentation | undefined,\n private readonly exceptionCapture: ProcessExceptionCapture,\n private readonly instrumentations: Instrumentation[],\n private readonly diagnostics: ObserveDiagnostics,\n ) {}\n\n get status(): ObserveStatus { return this.diagnostics.status; }\n get lastError(): ObserveErrorEvent | undefined { return this.diagnostics.lastError; }\n\n async forceFlush(): Promise<void> {\n await this.runSafely('forceFlush', [\n ...(this.config.traces && this.tracerProvider\n ? [['traces', () => this.tracerProvider!.forceFlush()] as const]\n : []),\n ...(this.config.metrics && this.meterProvider\n ? [['metrics', () => this.meterProvider!.forceFlush()] as const]\n : []),\n ...(this.config.logs && this.loggerProvider\n ? [['logs', () => this.loggerProvider!.forceFlush({ timeoutMillis: this.config.exportTimeoutMillis })] as const]\n : []),\n ]);\n }\n\n async shutdown(): Promise<void> {\n if (this.stopped) return;\n this.stopped = true;\n this.loggerInstrumentation?.disable();\n this.exceptionCapture.stop();\n for (const instrumentation of this.instrumentations) {\n try { instrumentation.disable(); } catch (error) {\n this.diagnostics.failure('sdk', 'shutdown', error);\n }\n }\n await this.forceFlush();\n this.runtimeMetrics?.stop();\n await this.runSafely('shutdown', [\n ...(this.tracerProvider ? [['traces', () => this.tracerProvider!.shutdown()] as const] : []),\n ...(this.meterProvider ? [['metrics', () => this.meterProvider!.shutdown()] as const] : []),\n ...(this.loggerProvider ? [['logs', () => this.loggerProvider!.shutdown()] as const] : []),\n ]);\n if (activeRuntime === this) activeRuntime = undefined;\n this.diagnostics.stop();\n }\n\n private async runSafely(\n stage: 'forceFlush' | 'shutdown',\n operations: ReadonlyArray<readonly [ObserveSignal, () => Promise<void>]>,\n ): Promise<void> {\n await Promise.all(operations.map(async ([signal, operation]) => {\n try {\n await operation();\n } catch (error) {\n this.diagnostics.failure(signal, stage, error);\n }\n }));\n }\n}\n\nlet activeRuntime: ObserveRuntime | undefined;\n\nfunction exporterConfig(url: string | undefined, config: ResolvedObserveConfig) {\n return {\n ...(url ? { url } : {}),\n headers: config.headers,\n timeoutMillis: config.exportTimeoutMillis,\n };\n}\n\nfunction createTraceProvider(\n config: ResolvedObserveConfig,\n resource: ReturnType<typeof createObserveResource>,\n diagnostics: ObserveDiagnostics,\n) {\n if (!config.traces && !config.metrics) return undefined;\n const spanProcessors: SpanProcessor[] = [new SpanRedactionProcessor()];\n if (config.traces) {\n const exporter = config.exporters?.span\n ?? new OTLPTraceExporter(exporterConfig(config.endpoints.traces, config));\n spanProcessors.push(new BatchSpanProcessor(withExporterDiagnostics(\n exporter,\n 'traces',\n diagnostics,\n ) as SpanExporter, {\n exportTimeoutMillis: config.exportTimeoutMillis,\n maxQueueSize: 2_048,\n maxExportBatchSize: 512,\n }));\n }\n const provider = new NodeTracerProvider({\n resource,\n sampler: config.traces\n ? new ParentBasedSampler({ root: new TraceIdRatioBasedSampler(config.sampling) })\n : new AlwaysOffSampler(),\n spanProcessors,\n spanLimits: { attributeCountLimit: 64, eventCountLimit: 64, linkCountLimit: 16 },\n });\n provider.register();\n return provider;\n}\n\nfunction createMeterProvider(\n config: ResolvedObserveConfig,\n resource: ReturnType<typeof createObserveResource>,\n diagnostics: ObserveDiagnostics,\n) {\n if (!config.metrics) return undefined;\n let reader: MetricReader;\n if (config.exporters?.metricReader) {\n reader = config.exporters.metricReader;\n } else {\n reader = new PeriodicExportingMetricReader({\n exporter: withExporterDiagnostics(\n new OTLPMetricExporter(exporterConfig(config.endpoints.metrics, config)),\n 'metrics',\n diagnostics,\n ),\n exportIntervalMillis: config.metricExportIntervalMillis,\n exportTimeoutMillis: Math.min(config.exportTimeoutMillis, config.metricExportIntervalMillis),\n cardinalityLimits: { default: 2_000, histogram: 2_000 },\n });\n }\n const provider = new MeterProvider({\n resource,\n readers: [reader],\n views: [{\n instrumentName: 'http.server.request.duration',\n meterName: '@opentelemetry/instrumentation-http',\n aggregation: { type: AggregationType.DROP },\n }],\n });\n metrics.setGlobalMeterProvider(provider);\n return provider;\n}\n\nfunction createLoggerProvider(\n config: ResolvedObserveConfig,\n resource: ReturnType<typeof createObserveResource>,\n diagnostics: ObserveDiagnostics,\n) {\n if (!config.logs) return undefined;\n const exporter = config.exporters?.log\n ?? new OTLPLogExporter(exporterConfig(config.endpoints.logs, config));\n const provider = new LoggerProvider({\n resource,\n processors: [new BatchLogRecordProcessor({\n exporter: withExporterDiagnostics(exporter, 'logs', diagnostics) as LogRecordExporter,\n exportTimeoutMillis: config.exportTimeoutMillis,\n maxQueueSize: 2_048,\n maxExportBatchSize: 512,\n })],\n });\n logs.setGlobalLoggerProvider(provider);\n return provider;\n}\n\nexport function observe(options: ObserveOptions = {}): ObserveRuntime {\n if (activeRuntime?.started) return activeRuntime;\n const config = resolveObserveConfig(options);\n const diagnostics = new ObserveDiagnostics(config.diagnosticLogging, options.onError);\n if (!config.enabled) {\n diagnostics.inactive();\n return new InactiveObserveHandle(config, diagnostics);\n }\n let tracerProvider: NodeTracerProvider | undefined;\n let meterProvider: MeterProvider | undefined;\n let loggerProvider: LoggerProvider | undefined;\n let runtimeMetrics: RuntimeMetrics | undefined;\n let loggerInstrumentation: NestLoggerInstrumentation | undefined;\n let exceptionCapture: ProcessExceptionCapture | undefined;\n const instrumentations: Instrumentation[] = [];\n try {\n const resource = createObserveResource(config);\n meterProvider = createMeterProvider(config, resource, diagnostics);\n const meter = meterProvider?.getMeter(SDK_NAME, SDK_VERSION);\n const httpRequestMetrics = meter ? new HttpRequestMetrics(meter, config.serviceName) : undefined;\n tracerProvider = createTraceProvider(config, resource, diagnostics);\n loggerProvider = createLoggerProvider(config, resource, diagnostics);\n runtimeMetrics = meter ? new RuntimeMetrics(meter) : undefined;\n runtimeMetrics?.start();\n\n const otelLogger = loggerProvider?.getLogger(SDK_NAME, SDK_VERSION);\n const logEmitter = config.logs\n ? new OpenTelemetryLogEmitter(SDK_NAME, SDK_VERSION, otelLogger)\n : undefined;\n loggerInstrumentation = logEmitter\n ? new NestLoggerInstrumentation(logEmitter, {\n 'service.name': config.serviceName,\n 'service.version': config.serviceVersion,\n 'deployment.environment.name': config.environment,\n })\n : undefined;\n loggerInstrumentation?.enable();\n exceptionCapture = new ProcessExceptionCapture(logEmitter);\n exceptionCapture.start();\n\n if (config.traces || config.metrics) {\n const safeHeaders = config.allowedHeaders.filter((header) => !isSensitiveKey(header));\n instrumentations.push(new HttpInstrumentation({\n requireParentforOutgoingSpans: false,\n headersToSpanAttributes: {\n client: { requestHeaders: safeHeaders, responseHeaders: safeHeaders },\n server: { requestHeaders: safeHeaders, responseHeaders: safeHeaders },\n },\n redactedQueryParams: [\n 'sig', 'Signature', 'AWSAccessKeyId', 'X-Goog-Signature',\n 'password', 'passwd', 'token', 'access_token', 'api_key', 'secret',\n ],\n ...(httpRequestMetrics ? {\n requestHook: (_span, request) => {\n if (!('getHeader' in request)) httpRequestMetrics.start(request as never);\n },\n applyCustomAttributesOnSpan: (_span, request, response) => {\n if ('setHeader' in response) httpRequestMetrics.record(request as never, response as never);\n },\n } : {}),\n }));\n instrumentations.push(new CompatibleNestInstrumentation({\n providerTracing: config.providerTracing,\n controllerTracing: config.controllerTracing,\n }));\n if (config.traces) instrumentations.push(new PrismaInstrumentation() as unknown as Instrumentation);\n registerInstrumentations({\n instrumentations,\n ...(tracerProvider ? { tracerProvider } : {}),\n ...(meterProvider ? { meterProvider } : {}),\n });\n }\n const runtime = new ActiveObserveHandle(\n config,\n tracerProvider,\n meterProvider,\n loggerProvider,\n httpRequestMetrics,\n runtimeMetrics,\n loggerInstrumentation,\n exceptionCapture,\n instrumentations,\n diagnostics,\n );\n diagnostics.activate();\n activeRuntime = runtime;\n return runtime;\n } catch (error) {\n diagnostics.failure('sdk', 'initialization', error);\n loggerInstrumentation?.disable();\n runtimeMetrics?.stop();\n exceptionCapture?.stop();\n for (const instrumentation of instrumentations) {\n try { instrumentation.disable(); } catch { /* best effort */ }\n }\n void Promise.allSettled([\n tracerProvider?.shutdown(),\n meterProvider?.shutdown(),\n loggerProvider?.shutdown(),\n ].filter((item): item is Promise<void> => Boolean(item)));\n diagnostics.inactive();\n if (config.failFast) throw toError(error);\n return new InactiveObserveHandle(config, diagnostics);\n }\n}\n\nexport function getObserveRuntime(): ObserveRuntime | undefined {\n return activeRuntime;\n}\n","import { redactText } from './security/redaction';\nimport type {\n ObserveErrorEvent,\n ObserveErrorStage,\n ObserveSignal,\n ObserveStatus,\n} from './types';\n\ntype ExportResultLike = { code: number; error?: Error };\ntype ExportCallback = (result: ExportResultLike) => void;\ntype ExporterLike = { export(items: unknown, callback: ExportCallback): void };\n\nexport function toError(value: unknown): Error {\n if (value instanceof Error) return value;\n if (typeof value === 'string') return new Error(value);\n try {\n return new Error(JSON.stringify(value));\n } catch {\n return new Error(String(value));\n }\n}\n\nfunction sanitizeError(error: Error): Error {\n const sanitized = new Error(redactText(error.message));\n sanitized.name = error.name;\n if (error.stack) sanitized.stack = redactText(error.stack);\n return sanitized;\n}\n\n/** Tracks pipeline health and reports each distinct failure once until recovery. */\nexport class ObserveDiagnostics {\n private currentStatus: ObserveStatus = 'starting';\n private currentError: ObserveErrorEvent | undefined;\n private readonly failedSignals = new Set<ObserveSignal>();\n private readonly reported = new Set<string>();\n\n constructor(\n private readonly logging: boolean,\n private readonly onError?: (event: ObserveErrorEvent) => void,\n ) {}\n\n get status(): ObserveStatus { return this.currentStatus; }\n get lastError(): ObserveErrorEvent | undefined { return this.currentError; }\n\n activate(): void {\n if (this.currentStatus === 'starting') this.currentStatus = 'active';\n }\n\n inactive(): void {\n this.currentStatus = 'inactive';\n }\n\n stop(): void {\n this.currentStatus = 'stopped';\n }\n\n success(signal: ObserveSignal): void {\n this.failedSignals.delete(signal);\n for (const fingerprint of this.reported) {\n if (fingerprint.startsWith(`${signal}\\0`)) this.reported.delete(fingerprint);\n }\n if (this.currentStatus === 'degraded' && this.failedSignals.size === 0) {\n this.currentStatus = 'active';\n }\n }\n\n failure(signal: ObserveSignal, stage: ObserveErrorStage, value: unknown): void {\n const error = sanitizeError(toError(value));\n const event: ObserveErrorEvent = { signal, stage, error, timestamp: Date.now() };\n this.currentError = event;\n this.failedSignals.add(signal);\n if (this.currentStatus !== 'inactive' && this.currentStatus !== 'stopped') {\n this.currentStatus = 'degraded';\n }\n\n const fingerprint = `${signal}\\0${stage}\\0${error.name}\\0${error.message}`;\n if (this.reported.has(fingerprint)) return;\n this.reported.add(fingerprint);\n\n try { this.onError?.(event); } catch { /* diagnostics must never affect business code */ }\n if (!this.logging) return;\n try {\n process.stderr.write(\n `[nest-observe] ${signal} ${stage} failed: ${redactText(error.message)}\\n`,\n );\n } catch {\n // Diagnostics are best-effort and must never affect business code.\n }\n }\n}\n\n/** Observes asynchronous OTLP callback failures without changing exporter behavior. */\nexport function withExporterDiagnostics<T extends object>(\n exporter: T,\n signal: Exclude<ObserveSignal, 'sdk'>,\n diagnostics: ObserveDiagnostics,\n): T {\n const delegate = exporter as unknown as ExporterLike;\n return new Proxy(exporter, {\n get(target, property) {\n if (property === 'export') {\n return (items: unknown, callback: ExportCallback): void => {\n try {\n delegate.export.call(target, items, (result) => {\n if (result.code === 0) {\n diagnostics.success(signal);\n } else {\n diagnostics.failure(\n signal,\n 'export',\n result.error ?? new Error(`${signal} export failed`),\n );\n }\n callback(result);\n });\n } catch (error) {\n diagnostics.failure(signal, 'export', error);\n throw error;\n }\n };\n }\n const value = Reflect.get(target, property, target) as unknown;\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n","import { trace, SpanStatusCode } from '@opentelemetry/api';\nimport type { StructuredLogEmitter } from '../logs/types';\nimport { redactText } from '../security/redaction';\n\nfunction asError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nexport class ProcessExceptionCapture {\n private listening = false;\n private readonly onUncaughtException = (value: unknown) => this.capture(value, 'uncaughtException');\n\n constructor(private readonly emitter?: StructuredLogEmitter) {}\n\n start(): void {\n if (this.listening) return;\n this.listening = true;\n process.on('uncaughtExceptionMonitor', this.onUncaughtException);\n }\n\n stop(): void {\n if (!this.listening) return;\n process.off('uncaughtExceptionMonitor', this.onUncaughtException);\n this.listening = false;\n }\n\n capture(value: unknown, source = 'nestjs'): void {\n try {\n const error = asError(value);\n const span = trace.getActiveSpan();\n span?.recordException(error);\n span?.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n const spanContext = span?.spanContext();\n this.emitter?.emit({\n body: redactText(error.stack ?? error.message),\n severityText: 'ERROR',\n attributes: {\n 'exception.type': error.name,\n 'exception.message': redactText(error.message),\n 'exception.stacktrace': redactText(error.stack ?? ''),\n 'exception.source': source,\n ...(spanContext ? { trace_id: spanContext.traceId, span_id: spanContext.spanId } : {}),\n },\n timestamp: Date.now(),\n });\n } catch {\n // Exception reporting must not replace or swallow the original exception.\n }\n }\n}\n","import {\n defaultResource,\n resourceFromAttributes,\n type Resource,\n} from \"@opentelemetry/resources\";\nimport { hostname } from \"node:os\";\nimport pkg from \"../package.json\";\nimport type { ResolvedObserveConfig } from \"./types\";\nexport const SDK_NAME = pkg.name;\nexport const SDK_VERSION = pkg.version;\n\nexport function createObserveResource(config: ResolvedObserveConfig): Resource {\n return defaultResource().merge(\n resourceFromAttributes({\n ...config.resourceAttributes,\n \"service.name\": config.serviceName,\n \"service.version\": config.serviceVersion,\n \"deployment.environment.name\": config.environment,\n \"service.instance.id\": config.instanceId,\n \"telemetry.sdk.name\": SDK_NAME,\n \"telemetry.sdk.version\": SDK_VERSION,\n \"host.name\": config.resourceAttributes[\"host.name\"] ?? hostname(),\n }),\n );\n}\n","{\n \"name\": \"@ryanzeng/nest-observe\",\n \"version\": \"0.1.2\",\n \"description\": \"Zero-config, vendor-neutral OpenTelemetry observability for NestJS\",\n \"keywords\": [\n \"nestjs\",\n \"opentelemetry\",\n \"observability\",\n \"otlp\",\n \"tracing\",\n \"metrics\",\n \"logging\"\n ],\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/ryanzen9/nest-observe#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/ryanzen9/nest-observe/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ryanzen9/nest-observe.git\"\n },\n \"packageManager\": \"pnpm@10.13.1\",\n \"sideEffects\": [\n \"./dist/register.js\",\n \"./dist/register.mjs\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"./register\": {\n \"import\": {\n \"types\": \"./dist/register.d.mts\",\n \"default\": \"./dist/register.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/register.d.ts\",\n \"default\": \"./dist/register.js\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"check\": \"pnpm typecheck && pnpm test && pnpm build\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"peerDependencies\": {\n \"@nestjs/common\": \">=10 <13\",\n \"@nestjs/core\": \">=10 <13\",\n \"reflect-metadata\": \">=0.1.12 <1\",\n \"rxjs\": \"^7.1.0\"\n },\n \"dependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.221.0\",\n \"@opentelemetry/exporter-logs-otlp-proto\": \"^0.221.0\",\n \"@opentelemetry/exporter-metrics-otlp-proto\": \"^0.221.0\",\n \"@opentelemetry/exporter-trace-otlp-proto\": \"^0.221.0\",\n \"@opentelemetry/instrumentation\": \"^0.221.0\",\n \"@opentelemetry/instrumentation-http\": \"^0.221.0\",\n \"@opentelemetry/instrumentation-nestjs-core\": \"^0.67.0\",\n \"@opentelemetry/resources\": \"^2.10.0\",\n \"@opentelemetry/sdk-logs\": \"^0.221.0\",\n \"@opentelemetry/sdk-metrics\": \"^2.10.0\",\n \"@opentelemetry/sdk-trace-base\": \"^2.10.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.10.0\",\n \"@prisma/instrumentation\": \"^7.10.0\"\n },\n \"devDependencies\": {\n \"@nestjs/common\": \"^12.0.1\",\n \"@nestjs/core\": \"^12.0.1\",\n \"@nestjs/testing\": \"^12.0.1\",\n \"@opentelemetry/sdk-trace-base\": \"^2.10.0\",\n \"@types/node\": \"^24.0.0\",\n \"reflect-metadata\": \"^0.2.2\",\n \"rxjs\": \"^7.8.2\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import type { Attributes, AttributeValue, Context, Span } from '@opentelemetry/api';\nimport type { ReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { isSensitiveKey, redactText, REDACTED } from './redaction';\n\nconst DROP_VALUE = /(?:request\\.body|db\\.(?:query\\.)?parameters?|db\\.statement\\.parameters?|redis\\.(?:args|value))/i;\n\nfunction cleanValue(value: AttributeValue): AttributeValue {\n if (typeof value === 'string') return redactText(value);\n if (Array.isArray(value)) {\n return value.map((item) => typeof item === 'string' ? redactText(item) : item) as AttributeValue;\n }\n return value;\n}\n\nfunction cleanAttributes(attributes: Attributes | undefined): void {\n if (!attributes) return;\n const mutable = attributes as Record<string, AttributeValue | undefined>;\n for (const [key, value] of Object.entries(mutable)) {\n if (value === undefined) continue;\n if (DROP_VALUE.test(key) || isSensitiveKey(key)) mutable[key] = REDACTED;\n else mutable[key] = cleanValue(value);\n }\n}\n\n/** Last-line protection for spans emitted by third-party instrumentation. */\nexport class SpanRedactionProcessor implements SpanProcessor {\n onStart(_span: Span, _parentContext: Context): void {}\n\n onEnd(span: ReadableSpan): void {\n const mutable = span as ReadableSpan & {\n name: string;\n status: { code: number; message?: string };\n events: Array<{ attributes?: Attributes }>;\n };\n try {\n mutable.name = redactText(mutable.name);\n cleanAttributes(mutable.attributes);\n if (mutable.status.message) mutable.status.message = redactText(mutable.status.message);\n for (const event of mutable.events) cleanAttributes(event.attributes);\n } catch {\n // A non-standard immutable span is left untouched rather than breaking export.\n }\n }\n\n forceFlush(): Promise<void> { return Promise.resolve(); }\n shutdown(): Promise<void> { return Promise.resolve(); }\n}\n"],"mappings":"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","names":["import_api","import_api","import_api","import_common","import_api","import_rxjs","import_api_logs","import_api","import_instrumentation","import_api","import_node_os","context"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/decorators/metadata.ts","../src/decorators/ignore-trace.decorator.ts","../src/decorators/trace.decorator.ts","../src/decorators/invoke.ts","../src/logs/nest-logger-instrumentation.ts","../src/security/redaction.ts","../src/logs/otel-log-emitter.ts","../src/instrumentation/nest-compatible-instrumentation.ts","../src/nest/method-instrumenter.ts","../src/metrics/http-request-metrics.ts","../src/metrics/runtime-metrics.ts","../src/nest/observe.module.ts","../src/sdk.ts","../src/diagnostics.ts","../src/exceptions/process-exception-capture.ts","../src/resource.ts","../package.json","../src/security/span-redaction-processor.ts"],"sourcesContent":["export * from './config';\nexport * from './decorators';\nexport * from './logs';\nexport * from './instrumentation';\nexport * from './metrics';\nexport * from './nest';\nexport * from './resource';\nexport * from './security';\nexport * from './sdk';\nexport * from './types';\n","import { randomUUID } from 'node:crypto';\nimport type { ObserveOptions, ResolvedObserveConfig } from './types';\n\ntype Environment = Record<string, string | undefined>;\n\nconst DEFAULT_ALLOWED_HEADERS = ['accept', 'content-type', 'user-agent', 'x-request-id', 'traceparent'];\n\nfunction booleanValue(value: boolean | string | undefined, fallback: boolean): boolean {\n if (typeof value === 'boolean') return value;\n if (value?.toLowerCase() === 'true') return true;\n if (value?.toLowerCase() === 'false') return false;\n return fallback;\n}\n\nfunction positiveInteger(value: number | string | undefined, fallback: number): number {\n const number = Number(value);\n return Number.isFinite(number) && number > 0 ? Math.floor(number) : fallback;\n}\n\nfunction samplingValue(value: number | string | undefined): number {\n const number = Number(value);\n if (!Number.isFinite(number)) return 1;\n return Math.min(1, Math.max(0, number));\n}\n\nfunction environmentSampling(env: Environment): number {\n const sampler = env.OTEL_TRACES_SAMPLER?.toLowerCase();\n if (sampler === 'always_off' || sampler === 'parentbased_always_off') return 0;\n if (sampler === 'always_on' || sampler === 'parentbased_always_on') return 1;\n return samplingValue(env.OTEL_TRACES_SAMPLER_ARG);\n}\n\nfunction decode(value: string): string {\n try {\n return decodeURIComponent(value.trim());\n } catch {\n return value.trim();\n }\n}\n\nexport function parseKeyValueList(value?: string): Record<string, string> {\n if (!value) return {};\n return Object.fromEntries(value.split(',').flatMap((entry) => {\n const separator = entry.indexOf('=');\n if (separator <= 0) return [];\n const key = decode(entry.slice(0, separator));\n const itemValue = decode(entry.slice(separator + 1));\n return key ? [[key, itemValue]] : [];\n }));\n}\n\nfunction appendSignalPath(endpoint: string | undefined, signal: 'traces' | 'metrics' | 'logs'): string | undefined {\n if (!endpoint) return undefined;\n return `${endpoint.replace(/\\/+$/, '')}/v1/${signal}`;\n}\n\nfunction optionalString(value: string | undefined): string | undefined {\n const result = value?.trim();\n return result ? result : undefined;\n}\n\nexport function resolveObserveConfig(\n options: ObserveOptions = {},\n env: Environment = process.env,\n): ResolvedObserveConfig {\n const otelResources = parseKeyValueList(env.OTEL_RESOURCE_ATTRIBUTES);\n const resourceAttributes = { ...otelResources, ...options.resourceAttributes };\n const genericEndpoint = optionalString(options.endpoint ?? env.OTEL_EXPORTER_OTLP_ENDPOINT);\n const sampling = options.sampling === undefined\n ? environmentSampling(env)\n : samplingValue(options.sampling);\n const allowedHeaders = Array.from(new Set([\n ...DEFAULT_ALLOWED_HEADERS,\n ...(options.allowedHeaders ?? []),\n ].map((header) => header.toLowerCase().trim()).filter(Boolean)));\n\n const result: ResolvedObserveConfig = {\n enabled: booleanValue(options.enabled ?? env.OBSERVE_ENABLED, true),\n serviceName: options.serviceName ?? env.OTEL_SERVICE_NAME ?? otelResources['service.name'] ?? 'nest-application',\n serviceVersion: options.serviceVersion ?? env.OTEL_SERVICE_VERSION ?? otelResources['service.version'] ?? 'unknown',\n environment: options.environment\n ?? env.OBSERVE_ENVIRONMENT\n ?? otelResources['deployment.environment.name']\n ?? env.NODE_ENV\n ?? 'development',\n instanceId: options.instanceId\n ?? otelResources['service.instance.id']\n ?? env.OTEL_SERVICE_INSTANCE_ID\n ?? env.HOSTNAME\n ?? randomUUID(),\n endpoints: {\n traces: optionalString(env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'traces'),\n metrics: optionalString(env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'metrics'),\n logs: optionalString(env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'logs'),\n },\n headers: { ...parseKeyValueList(env.OTEL_EXPORTER_OTLP_HEADERS), ...options.headers },\n traces: booleanValue(options.traces, true),\n logs: booleanValue(options.logs, true),\n metrics: booleanValue(options.metrics, true),\n providerTracing: booleanValue(options.providerTracing, true),\n controllerTracing: booleanValue(options.controllerTracing, true),\n sampling,\n allowedHeaders,\n exportTimeoutMillis: positiveInteger(options.exportTimeoutMillis ?? env.OTEL_EXPORTER_OTLP_TIMEOUT, 10_000),\n metricExportIntervalMillis: positiveInteger(options.metricExportIntervalMillis ?? env.OTEL_METRIC_EXPORT_INTERVAL, 60_000),\n resourceAttributes,\n diagnosticLogging: booleanValue(options.diagnosticLogging, true),\n failFast: booleanValue(options.failFast, false),\n };\n if (options.exporters) result.exporters = options.exporters;\n return result;\n}\n","const ignoredTargets = new WeakSet<object>();\nconst tracedTargets = new WeakSet<object>();\n\nexport function markTraceIgnored(target: object): void {\n ignoredTargets.add(target);\n}\n\nexport function markTraceDecorated(target: object): void {\n tracedTargets.add(target);\n}\n\nexport function isTraceIgnored(method?: object, type?: object): boolean {\n return Boolean((method && ignoredTargets.has(method)) || (type && ignoredTargets.has(type)));\n}\n\nexport function isTraceDecorated(method?: object): boolean {\n return Boolean(method && tracedTargets.has(method));\n}\n","import { markTraceIgnored } from './metadata';\n\ntype IgnoreDecorator = MethodDecorator & ClassDecorator;\n\nexport function IgnoreTrace(): IgnoreDecorator {\n return ((target: object | Function, propertyKey?: string | symbol, descriptor?: PropertyDescriptor) => {\n if (propertyKey !== undefined && descriptor?.value && typeof descriptor.value === 'function') {\n markTraceIgnored(descriptor.value);\n return descriptor;\n }\n markTraceIgnored(target);\n return target;\n }) as IgnoreDecorator;\n}\n","import { trace } from \"@opentelemetry/api\";\nimport { invokeWithSpan } from \"./invoke\";\nimport { isTraceIgnored, markTraceDecorated } from \"./metadata\";\n\nexport interface TraceOptions {\n name?: string;\n attributes?: Record<string, string>;\n}\n\ntype TraceDecorator = MethodDecorator & ClassDecorator;\n\nfunction copyOwnMetadata(source: Function, target: Function): void {\n for (const metadataKey of Reflect.getOwnMetadataKeys(source)) {\n Reflect.defineMetadata(metadataKey, Reflect.getOwnMetadata(metadataKey, source), target);\n }\n}\n\nfunction decorateMethod(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n options: TraceOptions,\n): void {\n const original = descriptor.value as (...args: unknown[]) => unknown;\n if (\n typeof original !== \"function\" ||\n isTraceIgnored(original, target.constructor)\n )\n return;\n const className = target.constructor?.name || \"Anonymous\";\n const methodName = String(propertyKey);\n const wrapped = function (this: unknown, ...args: unknown[]) {\n const tracer = trace.getTracer(\"@ryanzeng/nest-observe\");\n return invokeWithSpan(\n tracer,\n options.name ?? `${className}.${methodName}`,\n {\n \"code.function.name\": methodName,\n \"nestjs.class\": className,\n \"nestjs.method\": methodName,\n ...options.attributes,\n },\n () => original.apply(this, args),\n );\n };\n Object.defineProperty(wrapped, \"name\", {\n value: original.name,\n configurable: true,\n });\n copyOwnMetadata(original, wrapped);\n markTraceDecorated(wrapped);\n descriptor.value = wrapped;\n}\n\nexport function Trace(\n nameOrOptions: string | TraceOptions = {},\n): TraceDecorator {\n const options =\n typeof nameOrOptions === \"string\" ? { name: nameOrOptions } : nameOrOptions;\n return ((\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor,\n ) => {\n if (propertyKey !== undefined && descriptor) {\n decorateMethod(target as object, propertyKey, descriptor, options);\n return descriptor;\n }\n const prototype = (target as { prototype?: object }).prototype;\n if (!prototype) return target;\n for (const key of Object.getOwnPropertyNames(prototype)) {\n if (key === \"constructor\") continue;\n const item = Object.getOwnPropertyDescriptor(prototype, key);\n if (!item || typeof item.value !== \"function\") continue;\n decorateMethod(prototype, key, item, options);\n Object.defineProperty(prototype, key, item);\n }\n return target;\n }) as TraceDecorator;\n}\n","import { context, SpanStatusCode, type Span, type Tracer } from '@opentelemetry/api';\nimport { isObservable, Observable } from 'rxjs';\nimport { finalize, tap } from 'rxjs/operators';\n\nfunction fail(span: Span, error: unknown): void {\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) });\n}\n\nexport function invokeWithSpan<T>(\n tracer: Tracer,\n spanName: string,\n attributes: Record<string, string>,\n invoke: () => T,\n onFinish?: (durationSeconds: number, error?: unknown) => void,\n): T {\n return tracer.startActiveSpan(spanName, { attributes }, (span) => {\n const started = process.hrtime.bigint();\n const finish = (error?: unknown) => {\n if (error !== undefined) fail(span, error);\n else span.setStatus({ code: SpanStatusCode.OK });\n onFinish?.(Number(process.hrtime.bigint() - started) / 1e9, error);\n span.end();\n };\n try {\n const result = invoke();\n if (result instanceof Promise) {\n return result.then(\n (value) => { finish(); return value; },\n (error: unknown) => { finish(error); throw error; },\n ) as T;\n }\n if (isObservable(result)) {\n const spanContext = context.active();\n const source = result as Observable<unknown>;\n return new Observable((subscriber) => context.with(spanContext, () => {\n let streamError: unknown;\n return source.pipe(\n tap({ error: (error: unknown) => { streamError = error; } }),\n finalize(() => finish(streamError)),\n ).subscribe(subscriber);\n })) as T;\n }\n finish();\n return result;\n } catch (error) {\n finish(error);\n throw error;\n }\n });\n}\n","import { ConsoleLogger } from \"@nestjs/common\";\nimport { trace } from \"@opentelemetry/api\";\nimport { redact, redactText } from \"../security/redaction\";\nimport type { StructuredLogEmitter, StructuredLogRecord } from \"./types\";\n\ntype LogMethod = \"verbose\" | \"debug\" | \"log\" | \"warn\" | \"error\" | \"fatal\";\ntype ConsoleLoggerWithContext = ConsoleLogger & { context?: string };\n\nconst SEVERITY: Record<LogMethod, StructuredLogRecord[\"severityText\"]> = {\n verbose: \"TRACE\",\n debug: \"DEBUG\",\n log: \"INFO\",\n warn: \"WARN\",\n error: \"ERROR\",\n fatal: \"FATAL\",\n};\n\nfunction bodyValue(message: unknown): unknown {\n if (message instanceof Error)\n return redactText(message.stack ?? `${message.name}: ${message.message}`);\n return redact(message);\n}\n\nexport class NestLoggerInstrumentation {\n private originals = new Map<LogMethod, (...args: unknown[]) => void>();\n private enabled = false;\n\n constructor(\n private readonly emitter: StructuredLogEmitter,\n private readonly resourceAttributes: Record<string, string> = {},\n ) {}\n\n enable(): void {\n if (this.enabled) return;\n this.enabled = true;\n const prototype = ConsoleLogger.prototype as unknown as Record<\n LogMethod,\n (...args: unknown[]) => void\n >;\n for (const method of Object.keys(SEVERITY) as LogMethod[]) {\n const original = prototype[method];\n if (typeof original !== \"function\") continue;\n this.originals.set(method, original);\n const emitter = this.emitter;\n const resourceAttributes = this.resourceAttributes;\n prototype[method] = function (\n this: ConsoleLoggerWithContext,\n message: unknown,\n ...args: unknown[]\n ) {\n try {\n // Nest 11+ filters log levels per instance (constructor logLevels,\n // setLogLevels, Logger.overrideLogger). Honor the same gate so\n // exported records match console output. Nest 10 has no\n // isLevelEnabled, so the feature check keeps exports unconditional.\n const gated = this as ConsoleLoggerWithContext & {\n isLevelEnabled?: (level: LogMethod) => boolean;\n };\n if (typeof gated.isLevelEnabled === \"function\" && !gated.isLevelEnabled(method)) {\n return original.call(this, message, ...args);\n }\n const spanContext = trace.getActiveSpan()?.spanContext();\n const contextName =\n this.context ??\n (typeof args.at(-1) === \"string\" ? String(args.at(-1)) : undefined);\n const attributes: Record<string, string> = { ...resourceAttributes };\n if (contextName) attributes[\"nestjs.context\"] = contextName;\n if (spanContext?.traceId) attributes.trace_id = spanContext.traceId;\n if (spanContext?.spanId) attributes.span_id = spanContext.spanId;\n emitter.emit({\n body: bodyValue(message),\n severityText: SEVERITY[method],\n attributes,\n timestamp: Date.now(),\n });\n } catch {\n // Telemetry is best-effort and may never alter business logging behavior.\n }\n return original.call(this, message, ...args);\n };\n }\n }\n\n disable(): void {\n if (!this.enabled) return;\n const prototype = ConsoleLogger.prototype as unknown as Record<\n LogMethod,\n (...args: unknown[]) => void\n >;\n for (const [method, original] of this.originals)\n prototype[method] = original;\n this.originals.clear();\n this.enabled = false;\n }\n}\n","export const REDACTED = '[REDACTED]';\n\nconst SENSITIVE_KEY = /(?:authorization|proxy-authorization|cookie|set-cookie|pass(?:word|wd)?|secret|token|api[-_]?key|phone|mobile)/i;\n\nexport function isSensitiveKey(name: string): boolean {\n return SENSITIVE_KEY.test(name);\n}\n\nexport function redactText(value: string): string {\n return value\n .replace(/(?<!\\d)1[3-9]\\d{9}(?!\\d)/g, REDACTED)\n .replace(/\\b(authorization|proxy-authorization)\\s*[:=]\\s*(?:bearer\\s+|basic\\s+)?[^\\s,;]+/gi, `$1=${REDACTED}`)\n .replace(/\\b(password|passwd|secret|token|access_token|api[-_]?key|cookie)\\s*[:=]\\s*[^\\s,;]+/gi, `$1=${REDACTED}`)\n .replace(/\\bbearer\\s+[A-Za-z0-9._~+/=-]+/gi, `Bearer ${REDACTED}`);\n}\n\nfunction errorValue(error: Error): Record<string, string> {\n return {\n name: error.name,\n message: redactText(error.message),\n ...(error.stack ? { stack: redactText(error.stack) } : {}),\n };\n}\n\nfunction visit(value: unknown, seen: WeakSet<object>): unknown {\n if (typeof value === 'string') return redactText(value);\n if (value === null || typeof value !== 'object') return value;\n if (value instanceof Error) return errorValue(value);\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n if (Array.isArray(value)) return value.map((item) => visit(item, seen));\n const output: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n output[key] = SENSITIVE_KEY.test(key) ? REDACTED : visit(item, seen);\n }\n return output;\n}\n\nexport function redact<T>(value: T): T {\n return visit(value, new WeakSet()) as T;\n}\n\nexport function sanitizeHeaders(\n headers: Record<string, string | string[] | undefined>,\n allowedHeaders: readonly string[],\n): Record<string, string> {\n const allowed = new Set(allowedHeaders.map((header) => header.toLowerCase()));\n const output: Record<string, string> = {};\n for (const [originalName, value] of Object.entries(headers)) {\n const name = originalName.toLowerCase();\n if (!allowed.has(name) || value === undefined) continue;\n output[name] = SENSITIVE_KEY.test(name)\n ? REDACTED\n : Array.isArray(value) ? value.join(', ') : value;\n }\n return output;\n}\n","import { context, type Attributes } from \"@opentelemetry/api\";\nimport { logs, SeverityNumber, type Logger } from \"@opentelemetry/api-logs\";\nimport type { StructuredLogEmitter, StructuredLogRecord } from \"./types\";\n\nconst SEVERITY_NUMBER: Record<\n StructuredLogRecord[\"severityText\"],\n SeverityNumber\n> = {\n TRACE: SeverityNumber.TRACE,\n DEBUG: SeverityNumber.DEBUG,\n INFO: SeverityNumber.INFO,\n WARN: SeverityNumber.WARN,\n ERROR: SeverityNumber.ERROR,\n FATAL: SeverityNumber.FATAL,\n};\n\nexport class OpenTelemetryLogEmitter implements StructuredLogEmitter {\n private readonly logger: Logger;\n\n constructor(\n name = \"@ryanzeng/nest-observe\",\n version?: string,\n logger?: Logger,\n ) {\n this.logger = logger ?? logs.getLogger(name, version);\n }\n\n emit(record: StructuredLogRecord): void {\n this.logger.emit({\n body: record.body as never,\n severityText: record.severityText,\n severityNumber: SEVERITY_NUMBER[record.severityText],\n attributes: record.attributes as Attributes,\n ...(record.timestamp === undefined\n ? {}\n : { timestamp: record.timestamp }),\n context: context.active(),\n });\n }\n}\n","import {\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n type InstrumentationConfig,\n} from '@opentelemetry/instrumentation';\nimport { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core';\nimport { NestMethodInstrumenter } from '../nest/method-instrumenter';\n\nconst SUPPORTED_NEST_VERSIONS = ['>=4.0.0 <13'];\n\ntype NestWrapper = {\n instance?: object;\n metatype?: Function;\n name?: unknown;\n inject?: unknown[];\n token?: unknown;\n host?: {\n name?: string;\n controllers?: Map<unknown, unknown>;\n };\n};\n\ntype InjectorExports = {\n Injector: {\n prototype: {\n instantiateClass: (...args: unknown[]) => Promise<unknown>;\n };\n };\n};\n\nexport interface CompatibleNestInstrumentationConfig extends InstrumentationConfig {\n providerTracing?: boolean;\n controllerTracing?: boolean;\n}\n\n/** Extends upstream Nest support to v12 and instruments DI-created providers. */\nexport class CompatibleNestInstrumentation extends NestInstrumentation {\n private methodInstrumenter?: NestMethodInstrumenter;\n\n constructor(private readonly observeConfig: CompatibleNestInstrumentationConfig = {}) {\n super(observeConfig);\n }\n\n override init(): InstrumentationNodeModuleDefinition {\n const definition = new InstrumentationNodeModuleDefinition('@nestjs/core', SUPPORTED_NEST_VERSIONS);\n definition.files.push(\n this.getNestFactoryFileInstrumentation(SUPPORTED_NEST_VERSIONS),\n this.getRouterExecutionContextFileInstrumentation(SUPPORTED_NEST_VERSIONS),\n new InstrumentationNodeModuleFile(\n '@nestjs/core/injector/injector.js',\n SUPPORTED_NEST_VERSIONS,\n (moduleExports: InjectorExports) => {\n const instrumentation = this;\n this._wrap(moduleExports.Injector.prototype, 'instantiateClass', (original) => {\n return async function (this: unknown, ...args: unknown[]) {\n const instance = await original.apply(this, args);\n try {\n const wrapper = args[1] as NestWrapper | undefined;\n if (!instance || typeof instance !== 'object' || !wrapper?.metatype\n || wrapper.inject !== undefined) return instance;\n if (['InternalCoreModule', 'ObserveModule', 'DiscoveryModule'].includes(wrapper.host?.name ?? '')) {\n return instance;\n }\n const isController = wrapper.host?.controllers?.get(wrapper.token) === wrapper;\n if ((isController && instrumentation.observeConfig.controllerTracing === false)\n || (!isController && instrumentation.observeConfig.providerTracing === false)) {\n return instance;\n }\n instrumentation.getMethodInstrumenter().instrumentInstance(\n instance,\n isController ? 'controller' : 'provider',\n wrapper.name ?? wrapper.metatype.name,\n );\n } catch {\n // Framework internals vary by Nest version; instrumentation remains best-effort.\n }\n return instance;\n };\n });\n return moduleExports;\n },\n (moduleExports: InjectorExports) => {\n this._unwrap(moduleExports.Injector.prototype, 'instantiateClass');\n },\n ),\n );\n return definition;\n }\n\n private getMethodInstrumenter(): NestMethodInstrumenter {\n return this.methodInstrumenter ??= new NestMethodInstrumenter(this.tracer, this.meter);\n }\n}\n","import type { Meter, Tracer } from '@opentelemetry/api';\nimport { invokeWithSpan } from '../decorators/invoke';\nimport { isTraceDecorated, isTraceIgnored, markTraceDecorated } from '../decorators/metadata';\n\nexport type NestComponentKind = 'provider' | 'controller';\n\nexport class NestMethodInstrumenter {\n private readonly calls;\n private readonly duration;\n private readonly errors;\n private readonly instrumented = new WeakMap<object, Set<string>>();\n\n constructor(private readonly tracer: Tracer, meter: Meter) {\n this.calls = meter.createCounter('nestjs.method.calls', { unit: '{call}' });\n this.duration = meter.createHistogram('nestjs.method.duration', {\n unit: 's',\n advice: { explicitBucketBoundaries: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5] },\n });\n this.errors = meter.createCounter('nestjs.method.errors', { unit: '{error}' });\n }\n\n instrumentInstance(instance: object, kind: NestComponentKind, componentName?: unknown): void {\n const type = instance.constructor as Function;\n const prototype = Object.getPrototypeOf(instance) as object | null;\n if (!prototype) return;\n this.instrumentTarget(instance, prototype, type, kind, componentName);\n }\n\n instrumentPrototype(type: Function, kind: NestComponentKind, componentName?: unknown): void {\n const prototype = (type as { prototype?: object }).prototype;\n if (!prototype) return;\n this.instrumentTarget(prototype, prototype, type, kind, componentName);\n }\n\n private instrumentTarget(\n target: object,\n prototype: object,\n type: Function,\n kind: NestComponentKind,\n componentName?: unknown,\n ): void {\n if (isTraceIgnored(type)) return;\n const completed = this.instrumented.get(target) ?? new Set<string>();\n this.instrumented.set(target, completed);\n for (const methodName of Object.getOwnPropertyNames(prototype)) {\n if (methodName === 'constructor' || completed.has(methodName) || methodName.startsWith('onModule')) continue;\n const descriptor = Object.getOwnPropertyDescriptor(prototype, methodName);\n const original = descriptor?.value as ((...args: unknown[]) => unknown) | undefined;\n if (!descriptor || typeof original !== 'function' || isTraceIgnored(original, type) || isTraceDecorated(original)) continue;\n const existing = Reflect.get(target, methodName) as unknown;\n if (typeof existing === 'function' && existing !== original && isTraceDecorated(existing)) continue;\n const name = typeof componentName === 'symbol'\n ? String(componentName)\n : typeof componentName === 'string' && componentName\n ? componentName\n : type.name || 'Anonymous';\n const attributes: Record<string, string> = {\n [`nestjs.${kind}`]: name,\n 'nestjs.method': methodName,\n };\n const instrumenter = this;\n const wrapped = function (this: unknown, ...args: unknown[]) {\n instrumenter.calls.add(1, attributes);\n return invokeWithSpan(\n instrumenter.tracer,\n `${name}.${methodName}`,\n attributes,\n () => original.apply(this, args),\n (seconds, error) => {\n instrumenter.duration.record(seconds, attributes);\n if (error !== undefined) instrumenter.errors.add(1, attributes);\n },\n );\n };\n markTraceDecorated(wrapped);\n try {\n Object.defineProperty(target, methodName, { ...descriptor, value: wrapped });\n completed.add(methodName);\n } catch {\n // Frozen or proxy-managed framework instances are intentionally skipped.\n }\n }\n }\n}\n","import type { Meter } from '@opentelemetry/api';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\n\ntype FrameworkRequest = IncomingMessage & {\n baseUrl?: string;\n route?: { path?: string };\n routerPath?: string;\n routeOptions?: { url?: string };\n};\n\nfunction routeFor(request: FrameworkRequest): string {\n const route = request.route?.path ?? request.routerPath ?? request.routeOptions?.url;\n if (!route) return '<unmatched>';\n return `${request.baseUrl ?? ''}${route}` || '<unmatched>';\n}\n\nexport class HttpRequestMetrics {\n private readonly requestCount;\n private readonly requestDuration;\n private readonly errorCount;\n private readonly startedAt = new WeakMap<IncomingMessage, bigint>();\n\n constructor(meter: Meter, private readonly serviceName: string) {\n this.requestCount = meter.createCounter('http.server.request.count', {\n description: 'Number of completed inbound HTTP requests',\n unit: '{request}',\n });\n this.requestDuration = meter.createHistogram('http.server.request.duration', {\n description: 'Inbound HTTP request duration',\n unit: 's',\n advice: { explicitBucketBoundaries: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10] },\n });\n this.errorCount = meter.createCounter('http.server.error.count', {\n description: 'Number of failed inbound HTTP requests',\n unit: '{error}',\n });\n }\n\n start(request: IncomingMessage): boolean {\n if (this.startedAt.has(request)) return false;\n this.startedAt.set(request, process.hrtime.bigint());\n return true;\n }\n\n record(request: IncomingMessage, response: ServerResponse): boolean {\n const started = this.startedAt.get(request);\n if (started === undefined) return false;\n this.startedAt.delete(request);\n const statusCode = Number.isFinite(response.statusCode) ? response.statusCode : 0;\n const attributes = {\n 'service.name': this.serviceName,\n 'http.route': routeFor(request as FrameworkRequest),\n 'http.request.method': request.method ?? 'UNKNOWN',\n 'http.response.status_code': statusCode,\n };\n this.requestCount.add(1, attributes);\n this.requestDuration.record(Number(process.hrtime.bigint() - started) / 1e9, attributes);\n if (statusCode >= 500) this.errorCount.add(1, attributes);\n return true;\n }\n}\n","import { cpus } from 'node:os';\nimport { monitorEventLoopDelay, PerformanceObserver, performance } from 'node:perf_hooks';\nimport type { Meter, ObservableCallback, ObservableResult } from '@opentelemetry/api';\n\ntype RemovableInstrument = {\n addCallback(callback: ObservableCallback): void;\n removeCallback(callback: ObservableCallback): void;\n};\n\nexport class RuntimeMetrics {\n private readonly callbacks: Array<{ instrument: RemovableInstrument; callback: ObservableCallback }> = [];\n private eventLoopDelay: ReturnType<typeof monitorEventLoopDelay> | undefined;\n private gcObserver: PerformanceObserver | undefined;\n private started = false;\n private previousElu = performance.eventLoopUtilization();\n\n constructor(private readonly meter: Meter) {}\n\n private observe(instrument: RemovableInstrument, callback: ObservableCallback): void {\n instrument.addCallback(callback);\n this.callbacks.push({ instrument, callback });\n }\n\n start(): void {\n if (this.started) return;\n this.started = true;\n const systemCpu = this.meter.createObservableGauge('system.cpu.utilization', { unit: '1' });\n this.observe(systemCpu, (result: ObservableResult) => {\n const cores = cpus();\n let idle = 0;\n let total = 0;\n for (const core of cores) {\n idle += core.times.idle;\n total += Object.values(core.times).reduce((sum, value) => sum + value, 0);\n }\n result.observe(total ? (total - idle) / total : 0);\n });\n\n const processCpu = this.meter.createObservableCounter('process.cpu.time', { unit: 's' });\n this.observe(processCpu, (result: ObservableResult) => {\n const cpu = process.cpuUsage();\n result.observe((cpu.user + cpu.system) / 1e6);\n });\n\n const rss = this.meter.createObservableGauge('process.memory.rss', { unit: 'By' });\n const heapUsed = this.meter.createObservableGauge('nodejs.memory.heap.used', { unit: 'By' });\n const heapTotal = this.meter.createObservableGauge('nodejs.memory.heap.total', { unit: 'By' });\n this.observe(rss, (result: ObservableResult) => result.observe(process.memoryUsage().rss));\n this.observe(heapUsed, (result: ObservableResult) => result.observe(process.memoryUsage().heapUsed));\n this.observe(heapTotal, (result: ObservableResult) => result.observe(process.memoryUsage().heapTotal));\n\n this.eventLoopDelay = monitorEventLoopDelay({ resolution: 20 });\n this.eventLoopDelay.enable();\n const delay = this.meter.createObservableGauge('nodejs.eventloop.delay', { unit: 's' });\n this.observe(delay, (result: ObservableResult) => {\n const mean = this.eventLoopDelay?.mean ?? 0;\n result.observe(Number.isFinite(mean) ? mean / 1e9 : 0);\n this.eventLoopDelay?.reset();\n });\n\n const utilization = this.meter.createObservableGauge('nodejs.eventloop.utilization', { unit: '1' });\n this.observe(utilization, (result: ObservableResult) => {\n const current = performance.eventLoopUtilization(this.previousElu);\n this.previousElu = performance.eventLoopUtilization();\n result.observe(current.utilization);\n });\n\n const gc = this.meter.createHistogram('nodejs.gc.duration', { unit: 's' });\n this.gcObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const detail = (entry as unknown as { detail?: { kind?: number } }).detail;\n gc.record(entry.duration / 1_000, { 'nodejs.gc.type': String(detail?.kind ?? 'unknown') });\n }\n });\n try { this.gcObserver.observe({ entryTypes: ['gc'] }); } catch { /* unsupported runtime */ }\n\n const uptime = this.meter.createObservableGauge('process.uptime', { unit: 's' });\n this.observe(uptime, (result: ObservableResult) => result.observe(process.uptime()));\n }\n\n stop(): void {\n for (const { instrument, callback } of this.callbacks) instrument.removeCallback(callback);\n this.callbacks.length = 0;\n this.eventLoopDelay?.disable();\n this.eventLoopDelay = undefined;\n this.gcObserver?.disconnect();\n this.gcObserver = undefined;\n this.started = false;\n }\n}\n","import {\n type CallHandler,\n type ExecutionContext,\n DynamicModule,\n Global,\n Inject,\n Injectable,\n Module,\n type NestInterceptor,\n OnApplicationShutdown,\n OnModuleInit,\n} from '@nestjs/common';\nimport { APP_INTERCEPTOR, DiscoveryModule, DiscoveryService } from '@nestjs/core';\nimport { metrics, trace } from '@opentelemetry/api';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Observable } from 'rxjs';\nimport { finalize } from 'rxjs';\nimport { getObserveRuntime, observe, type ObserveRuntime } from '../sdk';\nimport type { ObserveOptions } from '../types';\nimport { SDK_NAME, SDK_VERSION } from '../resource';\nimport { NestMethodInstrumenter } from './method-instrumenter';\n\nexport const OBSERVE_OPTIONS = Symbol('OBSERVE_OPTIONS');\nexport const OBSERVE_HANDLE = Symbol('OBSERVE_HANDLE');\n\ntype FrameworkResponse = ServerResponse & {\n raw?: ServerResponse;\n};\n\n/** Provides inbound HTTP metrics when module-load instrumentation was registered too late. */\n@Injectable()\nexport class NestHttpMetricsInterceptor implements NestInterceptor {\n constructor(@Inject(OBSERVE_HANDLE) private readonly handle: ObserveRuntime) {}\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n if (context.getType() !== 'http' || !this.handle.started || !this.handle.httpRequestMetrics) {\n return next.handle();\n }\n const http = context.switchToHttp();\n const request = http.getRequest<IncomingMessage>();\n const response = http.getResponse<FrameworkResponse>();\n const started = this.handle.httpRequestMetrics.start(request);\n const result = next.handle();\n if (!started) return result;\n\n const responseEventSource = response.raw ?? response;\n if (typeof responseEventSource.once === 'function') {\n responseEventSource.once('finish', () => {\n this.handle.httpRequestMetrics?.record(request, response);\n });\n return result;\n }\n return result.pipe(finalize(() => {\n this.handle.httpRequestMetrics?.record(request, response);\n }));\n }\n}\n\ntype DiscoveredWrapper = {\n instance?: object;\n metatype?: Function;\n name?: unknown;\n inject?: unknown[];\n host?: { name?: string };\n};\n\n@Injectable()\nclass NestObserveExplorer implements OnModuleInit, OnApplicationShutdown {\n constructor(\n @Inject(DiscoveryService) private readonly discovery: DiscoveryService,\n @Inject(OBSERVE_OPTIONS) private readonly options: ObserveOptions,\n @Inject(OBSERVE_HANDLE) private readonly handle: ObserveRuntime,\n ) {}\n\n onModuleInit(): void {\n if (!this.handle.started) return;\n const runtime = getObserveRuntime();\n const tracer = runtime?.tracerProvider?.getTracer(SDK_NAME, SDK_VERSION) ?? trace.getTracer(SDK_NAME, SDK_VERSION);\n const meter = runtime?.meterProvider?.getMeter(SDK_NAME, SDK_VERSION) ?? metrics.getMeter(SDK_NAME, SDK_VERSION);\n const instrumenter = new NestMethodInstrumenter(tracer, meter);\n if (this.options.providerTracing !== false) {\n this.instrument(this.discovery.getProviders() as DiscoveredWrapper[], instrumenter, 'provider');\n }\n if (this.options.controllerTracing !== false) {\n this.instrument(this.discovery.getControllers() as DiscoveredWrapper[], instrumenter, 'controller');\n }\n }\n\n private instrument(\n wrappers: DiscoveredWrapper[],\n instrumenter: NestMethodInstrumenter,\n kind: 'provider' | 'controller',\n ): void {\n for (const wrapper of wrappers) {\n // Factory providers may return arbitrary external clients (Redis, queues, SDKs).\n // They are not Nest-owned class instances and must not be monkey-patched.\n if (!wrapper.metatype || wrapper.inject !== undefined) continue;\n if (['ObserveModule', 'DiscoveryModule', 'InternalCoreModule'].includes(wrapper.host?.name ?? '')) continue;\n if ((wrapper.metatype as Function) === NestObserveExplorer) continue;\n if (wrapper.instance) {\n instrumenter.instrumentInstance(wrapper.instance, kind, wrapper.name ?? wrapper.metatype.name);\n } else {\n instrumenter.instrumentPrototype(wrapper.metatype, kind, wrapper.name ?? wrapper.metatype.name);\n }\n }\n }\n\n async onApplicationShutdown(): Promise<void> {\n await this.handle.shutdown();\n }\n}\n\n@Global()\n@Module({})\nexport class ObserveModule {\n static forRoot(options: ObserveOptions = {}): DynamicModule {\n return {\n module: ObserveModule,\n global: true,\n imports: [DiscoveryModule],\n providers: [\n { provide: OBSERVE_OPTIONS, useValue: options },\n { provide: OBSERVE_HANDLE, useFactory: () => observe(options) },\n { provide: APP_INTERCEPTOR, useClass: NestHttpMetricsInterceptor },\n NestObserveExplorer,\n ],\n exports: [OBSERVE_HANDLE],\n };\n }\n}\n","import { logs } from '@opentelemetry/api-logs';\nimport { metrics, trace } from '@opentelemetry/api';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { registerInstrumentations, type Instrumentation } from '@opentelemetry/instrumentation';\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http';\nimport { BatchLogRecordProcessor, LoggerProvider, type LogRecordExporter } from '@opentelemetry/sdk-logs';\nimport { AggregationType, MeterProvider, PeriodicExportingMetricReader, type MetricReader } from '@opentelemetry/sdk-metrics';\nimport { AlwaysOffSampler, BatchSpanProcessor, ParentBasedSampler, TraceIdRatioBasedSampler, type SpanExporter, type SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resolveObserveConfig } from './config';\nimport { ObserveDiagnostics, toError, withExporterDiagnostics } from './diagnostics';\nimport { ProcessExceptionCapture } from './exceptions/process-exception-capture';\nimport { CompatibleNestInstrumentation } from './instrumentation';\nimport { NestLoggerInstrumentation, OpenTelemetryLogEmitter } from './logs';\nimport { HttpRequestMetrics, RuntimeMetrics } from './metrics';\nimport { createObserveResource, SDK_NAME, SDK_VERSION } from './resource';\nimport { isSensitiveKey } from './security/redaction';\nimport { SpanRedactionProcessor } from './security/span-redaction-processor';\nimport type {\n ObserveErrorEvent,\n ObserveHandle,\n ObserveOptions,\n ObserveSignal,\n ObserveStatus,\n ResolvedObserveConfig,\n} from './types';\n\nexport interface ObserveRuntime extends ObserveHandle {\n readonly tracerProvider: NodeTracerProvider | undefined;\n readonly meterProvider: MeterProvider | undefined;\n readonly loggerProvider: LoggerProvider | undefined;\n readonly httpRequestMetrics: HttpRequestMetrics | undefined;\n}\n\nclass InactiveObserveHandle implements ObserveRuntime {\n readonly started = false;\n readonly tracerProvider = undefined;\n readonly meterProvider = undefined;\n readonly loggerProvider = undefined;\n readonly httpRequestMetrics = undefined;\n constructor(\n readonly config: Readonly<ResolvedObserveConfig>,\n private readonly diagnostics: ObserveDiagnostics,\n ) {}\n get status(): ObserveStatus { return this.diagnostics.status; }\n get lastError(): ObserveErrorEvent | undefined { return this.diagnostics.lastError; }\n forceFlush(): Promise<void> { return Promise.resolve(); }\n shutdown(): Promise<void> { return Promise.resolve(); }\n}\n\nclass ActiveObserveHandle implements ObserveRuntime {\n readonly started = true;\n private stopped = false;\n\n constructor(\n readonly config: Readonly<ResolvedObserveConfig>,\n readonly tracerProvider: NodeTracerProvider | undefined,\n readonly meterProvider: MeterProvider | undefined,\n readonly loggerProvider: LoggerProvider | undefined,\n readonly httpRequestMetrics: HttpRequestMetrics | undefined,\n private readonly runtimeMetrics: RuntimeMetrics | undefined,\n private readonly loggerInstrumentation: NestLoggerInstrumentation | undefined,\n private readonly exceptionCapture: ProcessExceptionCapture,\n private readonly instrumentations: Instrumentation[],\n private readonly diagnostics: ObserveDiagnostics,\n ) {}\n\n get status(): ObserveStatus { return this.diagnostics.status; }\n get lastError(): ObserveErrorEvent | undefined { return this.diagnostics.lastError; }\n\n async forceFlush(): Promise<void> {\n await this.runSafely('forceFlush', [\n ...(this.config.traces && this.tracerProvider\n ? [['traces', () => this.tracerProvider!.forceFlush()] as const]\n : []),\n ...(this.config.metrics && this.meterProvider\n ? [['metrics', () => this.meterProvider!.forceFlush()] as const]\n : []),\n ...(this.config.logs && this.loggerProvider\n ? [['logs', () => this.loggerProvider!.forceFlush({ timeoutMillis: this.config.exportTimeoutMillis })] as const]\n : []),\n ]);\n }\n\n async shutdown(): Promise<void> {\n if (this.stopped) return;\n this.stopped = true;\n this.loggerInstrumentation?.disable();\n this.exceptionCapture.stop();\n for (const instrumentation of this.instrumentations) {\n try { instrumentation.disable(); } catch (error) {\n this.diagnostics.failure('sdk', 'shutdown', error);\n }\n }\n await this.forceFlush();\n this.runtimeMetrics?.stop();\n await this.runSafely('shutdown', [\n ...(this.tracerProvider ? [['traces', () => this.tracerProvider!.shutdown()] as const] : []),\n ...(this.meterProvider ? [['metrics', () => this.meterProvider!.shutdown()] as const] : []),\n ...(this.loggerProvider ? [['logs', () => this.loggerProvider!.shutdown()] as const] : []),\n ]);\n if (activeRuntime === this) activeRuntime = undefined;\n this.diagnostics.stop();\n }\n\n private async runSafely(\n stage: 'forceFlush' | 'shutdown',\n operations: ReadonlyArray<readonly [ObserveSignal, () => Promise<void>]>,\n ): Promise<void> {\n await Promise.all(operations.map(async ([signal, operation]) => {\n try {\n await operation();\n } catch (error) {\n this.diagnostics.failure(signal, stage, error);\n }\n }));\n }\n}\n\nlet activeRuntime: ObserveRuntime | undefined;\n\nfunction exporterConfig(url: string | undefined, config: ResolvedObserveConfig) {\n return {\n ...(url ? { url } : {}),\n headers: config.headers,\n timeoutMillis: config.exportTimeoutMillis,\n };\n}\n\nfunction createTraceProvider(\n config: ResolvedObserveConfig,\n resource: ReturnType<typeof createObserveResource>,\n diagnostics: ObserveDiagnostics,\n) {\n if (!config.traces && !config.metrics) return undefined;\n const spanProcessors: SpanProcessor[] = [new SpanRedactionProcessor()];\n if (config.traces) {\n const exporter = config.exporters?.span\n ?? new OTLPTraceExporter(exporterConfig(config.endpoints.traces, config));\n spanProcessors.push(new BatchSpanProcessor(withExporterDiagnostics(\n exporter,\n 'traces',\n diagnostics,\n ) as SpanExporter, {\n exportTimeoutMillis: config.exportTimeoutMillis,\n maxQueueSize: 2_048,\n maxExportBatchSize: 512,\n }));\n }\n const provider = new NodeTracerProvider({\n resource,\n sampler: config.traces\n ? new ParentBasedSampler({ root: new TraceIdRatioBasedSampler(config.sampling) })\n : new AlwaysOffSampler(),\n spanProcessors,\n spanLimits: { attributeCountLimit: 64, eventCountLimit: 64, linkCountLimit: 16 },\n });\n provider.register();\n return provider;\n}\n\nfunction createMeterProvider(\n config: ResolvedObserveConfig,\n resource: ReturnType<typeof createObserveResource>,\n diagnostics: ObserveDiagnostics,\n) {\n if (!config.metrics) return undefined;\n let reader: MetricReader;\n if (config.exporters?.metricReader) {\n reader = config.exporters.metricReader;\n } else {\n reader = new PeriodicExportingMetricReader({\n exporter: withExporterDiagnostics(\n new OTLPMetricExporter(exporterConfig(config.endpoints.metrics, config)),\n 'metrics',\n diagnostics,\n ),\n exportIntervalMillis: config.metricExportIntervalMillis,\n exportTimeoutMillis: Math.min(config.exportTimeoutMillis, config.metricExportIntervalMillis),\n cardinalityLimits: { default: 2_000, histogram: 2_000 },\n });\n }\n const provider = new MeterProvider({\n resource,\n readers: [reader],\n views: [{\n instrumentName: 'http.server.request.duration',\n meterName: '@opentelemetry/instrumentation-http',\n aggregation: { type: AggregationType.DROP },\n }],\n });\n metrics.setGlobalMeterProvider(provider);\n return provider;\n}\n\nfunction createLoggerProvider(\n config: ResolvedObserveConfig,\n resource: ReturnType<typeof createObserveResource>,\n diagnostics: ObserveDiagnostics,\n) {\n if (!config.logs) return undefined;\n const exporter = config.exporters?.log\n ?? new OTLPLogExporter(exporterConfig(config.endpoints.logs, config));\n const provider = new LoggerProvider({\n resource,\n processors: [new BatchLogRecordProcessor({\n exporter: withExporterDiagnostics(exporter, 'logs', diagnostics) as LogRecordExporter,\n exportTimeoutMillis: config.exportTimeoutMillis,\n maxQueueSize: 2_048,\n maxExportBatchSize: 512,\n })],\n });\n logs.setGlobalLoggerProvider(provider);\n return provider;\n}\n\nexport function observe(options: ObserveOptions = {}): ObserveRuntime {\n if (activeRuntime?.started) return activeRuntime;\n const config = resolveObserveConfig(options);\n const diagnostics = new ObserveDiagnostics(config.diagnosticLogging, options.onError);\n if (!config.enabled) {\n diagnostics.inactive();\n return new InactiveObserveHandle(config, diagnostics);\n }\n let tracerProvider: NodeTracerProvider | undefined;\n let meterProvider: MeterProvider | undefined;\n let loggerProvider: LoggerProvider | undefined;\n let runtimeMetrics: RuntimeMetrics | undefined;\n let loggerInstrumentation: NestLoggerInstrumentation | undefined;\n let exceptionCapture: ProcessExceptionCapture | undefined;\n const instrumentations: Instrumentation[] = [];\n try {\n const resource = createObserveResource(config);\n meterProvider = createMeterProvider(config, resource, diagnostics);\n const meter = meterProvider?.getMeter(SDK_NAME, SDK_VERSION);\n const httpRequestMetrics = meter ? new HttpRequestMetrics(meter, config.serviceName) : undefined;\n tracerProvider = createTraceProvider(config, resource, diagnostics);\n loggerProvider = createLoggerProvider(config, resource, diagnostics);\n runtimeMetrics = meter ? new RuntimeMetrics(meter) : undefined;\n runtimeMetrics?.start();\n\n const otelLogger = loggerProvider?.getLogger(SDK_NAME, SDK_VERSION);\n const logEmitter = config.logs\n ? new OpenTelemetryLogEmitter(SDK_NAME, SDK_VERSION, otelLogger)\n : undefined;\n loggerInstrumentation = logEmitter\n ? new NestLoggerInstrumentation(logEmitter, {\n 'service.name': config.serviceName,\n 'service.version': config.serviceVersion,\n 'deployment.environment.name': config.environment,\n })\n : undefined;\n loggerInstrumentation?.enable();\n exceptionCapture = new ProcessExceptionCapture(logEmitter);\n exceptionCapture.start();\n\n if (config.traces || config.metrics) {\n const safeHeaders = config.allowedHeaders.filter((header) => !isSensitiveKey(header));\n instrumentations.push(new HttpInstrumentation({\n requireParentforOutgoingSpans: false,\n headersToSpanAttributes: {\n client: { requestHeaders: safeHeaders, responseHeaders: safeHeaders },\n server: { requestHeaders: safeHeaders, responseHeaders: safeHeaders },\n },\n redactedQueryParams: [\n 'sig', 'Signature', 'AWSAccessKeyId', 'X-Goog-Signature',\n 'password', 'passwd', 'token', 'access_token', 'api_key', 'secret',\n ],\n ...(httpRequestMetrics ? {\n requestHook: (_span, request) => {\n if (!('getHeader' in request)) httpRequestMetrics.start(request as never);\n },\n applyCustomAttributesOnSpan: (_span, request, response) => {\n if ('setHeader' in response) httpRequestMetrics.record(request as never, response as never);\n },\n } : {}),\n }));\n instrumentations.push(new CompatibleNestInstrumentation({\n providerTracing: config.providerTracing,\n controllerTracing: config.controllerTracing,\n }));\n registerInstrumentations({\n instrumentations,\n ...(tracerProvider ? { tracerProvider } : {}),\n ...(meterProvider ? { meterProvider } : {}),\n });\n }\n const runtime = new ActiveObserveHandle(\n config,\n tracerProvider,\n meterProvider,\n loggerProvider,\n httpRequestMetrics,\n runtimeMetrics,\n loggerInstrumentation,\n exceptionCapture,\n instrumentations,\n diagnostics,\n );\n diagnostics.activate();\n activeRuntime = runtime;\n return runtime;\n } catch (error) {\n diagnostics.failure('sdk', 'initialization', error);\n loggerInstrumentation?.disable();\n runtimeMetrics?.stop();\n exceptionCapture?.stop();\n for (const instrumentation of instrumentations) {\n try { instrumentation.disable(); } catch { /* best effort */ }\n }\n void Promise.allSettled([\n tracerProvider?.shutdown(),\n meterProvider?.shutdown(),\n loggerProvider?.shutdown(),\n ].filter((item): item is Promise<void> => Boolean(item)));\n diagnostics.inactive();\n if (config.failFast) throw toError(error);\n return new InactiveObserveHandle(config, diagnostics);\n }\n}\n\nexport function getObserveRuntime(): ObserveRuntime | undefined {\n return activeRuntime;\n}\n","import { redactText } from './security/redaction';\nimport type {\n ObserveErrorEvent,\n ObserveErrorStage,\n ObserveSignal,\n ObserveStatus,\n} from './types';\n\ntype ExportResultLike = { code: number; error?: Error };\ntype ExportCallback = (result: ExportResultLike) => void;\ntype ExporterLike = { export(items: unknown, callback: ExportCallback): void };\n\nexport function toError(value: unknown): Error {\n if (value instanceof Error) return value;\n if (typeof value === 'string') return new Error(value);\n try {\n return new Error(JSON.stringify(value));\n } catch {\n return new Error(String(value));\n }\n}\n\nfunction sanitizeError(error: Error): Error {\n const sanitized = new Error(redactText(error.message));\n sanitized.name = error.name;\n if (error.stack) sanitized.stack = redactText(error.stack);\n return sanitized;\n}\n\n/** Tracks pipeline health and reports each distinct failure once until recovery. */\nexport class ObserveDiagnostics {\n private currentStatus: ObserveStatus = 'starting';\n private currentError: ObserveErrorEvent | undefined;\n private readonly failedSignals = new Set<ObserveSignal>();\n private readonly reported = new Set<string>();\n\n constructor(\n private readonly logging: boolean,\n private readonly onError?: (event: ObserveErrorEvent) => void,\n ) {}\n\n get status(): ObserveStatus { return this.currentStatus; }\n get lastError(): ObserveErrorEvent | undefined { return this.currentError; }\n\n activate(): void {\n if (this.currentStatus === 'starting') this.currentStatus = 'active';\n }\n\n inactive(): void {\n this.currentStatus = 'inactive';\n }\n\n stop(): void {\n this.currentStatus = 'stopped';\n }\n\n success(signal: ObserveSignal): void {\n this.failedSignals.delete(signal);\n for (const fingerprint of this.reported) {\n if (fingerprint.startsWith(`${signal}\\0`)) this.reported.delete(fingerprint);\n }\n if (this.currentStatus === 'degraded' && this.failedSignals.size === 0) {\n this.currentStatus = 'active';\n }\n }\n\n failure(signal: ObserveSignal, stage: ObserveErrorStage, value: unknown): void {\n const error = sanitizeError(toError(value));\n const event: ObserveErrorEvent = { signal, stage, error, timestamp: Date.now() };\n this.currentError = event;\n this.failedSignals.add(signal);\n if (this.currentStatus !== 'inactive' && this.currentStatus !== 'stopped') {\n this.currentStatus = 'degraded';\n }\n\n const fingerprint = `${signal}\\0${stage}\\0${error.name}\\0${error.message}`;\n if (this.reported.has(fingerprint)) return;\n this.reported.add(fingerprint);\n\n try { this.onError?.(event); } catch { /* diagnostics must never affect business code */ }\n if (!this.logging) return;\n try {\n process.stderr.write(\n `[nest-observe] ${signal} ${stage} failed: ${redactText(error.message)}\\n`,\n );\n } catch {\n // Diagnostics are best-effort and must never affect business code.\n }\n }\n}\n\n/** Observes asynchronous OTLP callback failures without changing exporter behavior. */\nexport function withExporterDiagnostics<T extends object>(\n exporter: T,\n signal: Exclude<ObserveSignal, 'sdk'>,\n diagnostics: ObserveDiagnostics,\n): T {\n const delegate = exporter as unknown as ExporterLike;\n return new Proxy(exporter, {\n get(target, property) {\n if (property === 'export') {\n return (items: unknown, callback: ExportCallback): void => {\n try {\n delegate.export.call(target, items, (result) => {\n if (result.code === 0) {\n diagnostics.success(signal);\n } else {\n diagnostics.failure(\n signal,\n 'export',\n result.error ?? new Error(`${signal} export failed`),\n );\n }\n callback(result);\n });\n } catch (error) {\n diagnostics.failure(signal, 'export', error);\n throw error;\n }\n };\n }\n const value = Reflect.get(target, property, target) as unknown;\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n","import { trace, SpanStatusCode } from '@opentelemetry/api';\nimport type { StructuredLogEmitter } from '../logs/types';\nimport { redactText } from '../security/redaction';\n\nfunction asError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nexport class ProcessExceptionCapture {\n private listening = false;\n private readonly onUncaughtException = (value: unknown) => this.capture(value, 'uncaughtException');\n\n constructor(private readonly emitter?: StructuredLogEmitter) {}\n\n start(): void {\n if (this.listening) return;\n this.listening = true;\n process.on('uncaughtExceptionMonitor', this.onUncaughtException);\n }\n\n stop(): void {\n if (!this.listening) return;\n process.off('uncaughtExceptionMonitor', this.onUncaughtException);\n this.listening = false;\n }\n\n capture(value: unknown, source = 'nestjs'): void {\n try {\n const error = asError(value);\n const span = trace.getActiveSpan();\n span?.recordException(error);\n span?.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n const spanContext = span?.spanContext();\n this.emitter?.emit({\n body: redactText(error.stack ?? error.message),\n severityText: 'ERROR',\n attributes: {\n 'exception.type': error.name,\n 'exception.message': redactText(error.message),\n 'exception.stacktrace': redactText(error.stack ?? ''),\n 'exception.source': source,\n ...(spanContext ? { trace_id: spanContext.traceId, span_id: spanContext.spanId } : {}),\n },\n timestamp: Date.now(),\n });\n } catch {\n // Exception reporting must not replace or swallow the original exception.\n }\n }\n}\n","import {\n defaultResource,\n resourceFromAttributes,\n type Resource,\n} from \"@opentelemetry/resources\";\nimport { hostname } from \"node:os\";\nimport pkg from \"../package.json\";\nimport type { ResolvedObserveConfig } from \"./types\";\nexport const SDK_NAME = pkg.name;\nexport const SDK_VERSION = pkg.version;\n\nexport function createObserveResource(config: ResolvedObserveConfig): Resource {\n return defaultResource().merge(\n resourceFromAttributes({\n ...config.resourceAttributes,\n \"service.name\": config.serviceName,\n \"service.version\": config.serviceVersion,\n \"deployment.environment.name\": config.environment,\n \"service.instance.id\": config.instanceId,\n \"telemetry.sdk.name\": SDK_NAME,\n \"telemetry.sdk.version\": SDK_VERSION,\n \"host.name\": config.resourceAttributes[\"host.name\"] ?? hostname(),\n }),\n );\n}\n","{\n \"name\": \"@ryanzeng/nest-observe\",\n \"version\": \"0.1.4\",\n \"description\": \"Zero-config, vendor-neutral OpenTelemetry observability for NestJS\",\n \"keywords\": [\n \"nestjs\",\n \"opentelemetry\",\n \"observability\",\n \"otlp\",\n \"tracing\",\n \"metrics\",\n \"logging\"\n ],\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/ryanzen9/nest-observe#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/ryanzen9/nest-observe/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ryanzen9/nest-observe.git\"\n },\n \"packageManager\": \"pnpm@10.13.1\",\n \"sideEffects\": [\n \"./dist/register.js\",\n \"./dist/register.mjs\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"./register\": {\n \"import\": {\n \"types\": \"./dist/register.d.mts\",\n \"default\": \"./dist/register.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/register.d.ts\",\n \"default\": \"./dist/register.js\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"check\": \"pnpm typecheck && pnpm test && pnpm build\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"peerDependencies\": {\n \"@nestjs/common\": \">=10 <13\",\n \"@nestjs/core\": \">=10 <13\",\n \"reflect-metadata\": \">=0.1.12 <1\",\n \"rxjs\": \"^7.1.0\"\n },\n \"dependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.221.0\",\n \"@opentelemetry/exporter-logs-otlp-proto\": \"^0.221.0\",\n \"@opentelemetry/exporter-metrics-otlp-proto\": \"^0.221.0\",\n \"@opentelemetry/exporter-trace-otlp-proto\": \"^0.221.0\",\n \"@opentelemetry/instrumentation\": \"^0.221.0\",\n \"@opentelemetry/instrumentation-http\": \"^0.221.0\",\n \"@opentelemetry/instrumentation-nestjs-core\": \"^0.67.0\",\n \"@opentelemetry/resources\": \"^2.10.0\",\n \"@opentelemetry/sdk-logs\": \"^0.221.0\",\n \"@opentelemetry/sdk-metrics\": \"^2.10.0\",\n \"@opentelemetry/sdk-trace-base\": \"^2.10.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.10.0\"\n },\n \"devDependencies\": {\n \"@nestjs/common\": \"^12.0.1\",\n \"@nestjs/core\": \"^12.0.1\",\n \"@nestjs/testing\": \"^12.0.1\",\n \"@opentelemetry/sdk-trace-base\": \"^2.10.0\",\n \"@types/node\": \"^24.0.0\",\n \"reflect-metadata\": \"^0.2.2\",\n \"rxjs\": \"^7.8.2\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import type { Attributes, AttributeValue, Context, Span } from '@opentelemetry/api';\nimport type { ReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { isSensitiveKey, redactText, REDACTED } from './redaction';\n\nconst DROP_VALUE = /(?:request\\.body|db\\.(?:query\\.)?parameters?|db\\.statement\\.parameters?|redis\\.(?:args|value))/i;\n\nfunction cleanValue(value: AttributeValue): AttributeValue {\n if (typeof value === 'string') return redactText(value);\n if (Array.isArray(value)) {\n return value.map((item) => typeof item === 'string' ? redactText(item) : item) as AttributeValue;\n }\n return value;\n}\n\nfunction cleanAttributes(attributes: Attributes | undefined): void {\n if (!attributes) return;\n const mutable = attributes as Record<string, AttributeValue | undefined>;\n for (const [key, value] of Object.entries(mutable)) {\n if (value === undefined) continue;\n if (DROP_VALUE.test(key) || isSensitiveKey(key)) mutable[key] = REDACTED;\n else mutable[key] = cleanValue(value);\n }\n}\n\n/** Last-line protection for spans emitted by third-party instrumentation. */\nexport class SpanRedactionProcessor implements SpanProcessor {\n onStart(_span: Span, _parentContext: Context): void {}\n\n onEnd(span: ReadableSpan): void {\n const mutable = span as ReadableSpan & {\n name: string;\n status: { code: number; message?: string };\n events: Array<{ attributes?: Attributes }>;\n };\n try {\n mutable.name = redactText(mutable.name);\n cleanAttributes(mutable.attributes);\n if (mutable.status.message) mutable.status.message = redactText(mutable.status.message);\n for (const event of mutable.events) cleanAttributes(event.attributes);\n } catch {\n // A non-standard immutable span is left untouched rather than breaking export.\n }\n }\n\n forceFlush(): Promise<void> { return Promise.resolve(); }\n shutdown(): Promise<void> { return Promise.resolve(); }\n}\n"],"mappings":"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","names":["import_api","import_api","import_api","import_common","import_api","import_rxjs","import_api_logs","import_api","import_instrumentation","import_api","import_node_os","context"]}
package/dist/index.mjs CHANGED
@@ -182,6 +182,11 @@ function invokeWithSpan(tracer, spanName, attributes, invoke, onFinish) {
182
182
  }
183
183
 
184
184
  // src/decorators/trace.decorator.ts
185
+ function copyOwnMetadata(source, target) {
186
+ for (const metadataKey of Reflect.getOwnMetadataKeys(source)) {
187
+ Reflect.defineMetadata(metadataKey, Reflect.getOwnMetadata(metadataKey, source), target);
188
+ }
189
+ }
185
190
  function decorateMethod(target, propertyKey, descriptor, options) {
186
191
  const original = descriptor.value;
187
192
  if (typeof original !== "function" || isTraceIgnored(original, target.constructor))
@@ -206,6 +211,7 @@ function decorateMethod(target, propertyKey, descriptor, options) {
206
211
  value: original.name,
207
212
  configurable: true
208
213
  });
214
+ copyOwnMetadata(original, wrapped);
209
215
  markTraceDecorated(wrapped);
210
216
  descriptor.value = wrapped;
211
217
  }
@@ -286,14 +292,9 @@ var SEVERITY = {
286
292
  fatal: "FATAL"
287
293
  };
288
294
  function bodyValue(message) {
289
- if (message instanceof Error) return redactText(message.stack ?? `${message.name}: ${message.message}`);
290
- const sanitized = redact(message);
291
- if (sanitized === null || typeof sanitized !== "object") return sanitized;
292
- try {
293
- return JSON.stringify(sanitized, (_key, value) => typeof value === "bigint" ? value.toString() : value);
294
- } catch {
295
- return redactText(String(sanitized));
296
- }
295
+ if (message instanceof Error)
296
+ return redactText(message.stack ?? `${message.name}: ${message.message}`);
297
+ return redact(message);
297
298
  }
298
299
  var NestLoggerInstrumentation = class {
299
300
  constructor(emitter, resourceAttributes = {}) {
@@ -316,6 +317,10 @@ var NestLoggerInstrumentation = class {
316
317
  const resourceAttributes = this.resourceAttributes;
317
318
  prototype[method] = function(message, ...args) {
318
319
  try {
320
+ const gated = this;
321
+ if (typeof gated.isLevelEnabled === "function" && !gated.isLevelEnabled(method)) {
322
+ return original.call(this, message, ...args);
323
+ }
319
324
  const spanContext = trace2.getActiveSpan()?.spanContext();
320
325
  const contextName = this.context ?? (typeof args.at(-1) === "string" ? String(args.at(-1)) : void 0);
321
326
  const attributes = { ...resourceAttributes };
@@ -337,7 +342,8 @@ var NestLoggerInstrumentation = class {
337
342
  disable() {
338
343
  if (!this.enabled) return;
339
344
  const prototype = ConsoleLogger.prototype;
340
- for (const [method, original] of this.originals) prototype[method] = original;
345
+ for (const [method, original] of this.originals)
346
+ prototype[method] = original;
341
347
  this.originals.clear();
342
348
  this.enabled = false;
343
349
  }
@@ -416,7 +422,7 @@ var NestMethodInstrumenter = class {
416
422
  if (!descriptor || typeof original !== "function" || isTraceIgnored(original, type) || isTraceDecorated(original)) continue;
417
423
  const existing = Reflect.get(target, methodName);
418
424
  if (typeof existing === "function" && existing !== original && isTraceDecorated(existing)) continue;
419
- const name = componentName || type.name || "Anonymous";
425
+ const name = typeof componentName === "symbol" ? String(componentName) : typeof componentName === "string" && componentName ? componentName : type.name || "Anonymous";
420
426
  const attributes = {
421
427
  [`nestjs.${kind}`]: name,
422
428
  "nestjs.method": methodName
@@ -469,7 +475,7 @@ var CompatibleNestInstrumentation = class extends NestInstrumentation {
469
475
  const instance = await original.apply(this, args);
470
476
  try {
471
477
  const wrapper = args[1];
472
- if (!instance || typeof instance !== "object" || !wrapper?.metatype) return instance;
478
+ if (!instance || typeof instance !== "object" || !wrapper?.metatype || wrapper.inject !== void 0) return instance;
473
479
  if (["InternalCoreModule", "ObserveModule", "DiscoveryModule"].includes(wrapper.host?.name ?? "")) {
474
480
  return instance;
475
481
  }
@@ -652,7 +658,6 @@ import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-proto";
652
658
  import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
653
659
  import { registerInstrumentations } from "@opentelemetry/instrumentation";
654
660
  import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
655
- import { PrismaInstrumentation } from "@prisma/instrumentation";
656
661
  import { BatchLogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs";
657
662
  import { AggregationType, MeterProvider, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
658
663
  import { AlwaysOffSampler, BatchSpanProcessor, ParentBasedSampler, TraceIdRatioBasedSampler } from "@opentelemetry/sdk-trace-base";
@@ -821,7 +826,7 @@ import { hostname } from "os";
821
826
  // package.json
822
827
  var package_default = {
823
828
  name: "@ryanzeng/nest-observe",
824
- version: "0.1.2",
829
+ version: "0.1.4",
825
830
  description: "Zero-config, vendor-neutral OpenTelemetry observability for NestJS",
826
831
  keywords: [
827
832
  "nestjs",
@@ -906,8 +911,7 @@ var package_default = {
906
911
  "@opentelemetry/sdk-logs": "^0.221.0",
907
912
  "@opentelemetry/sdk-metrics": "^2.10.0",
908
913
  "@opentelemetry/sdk-trace-base": "^2.10.0",
909
- "@opentelemetry/sdk-trace-node": "^2.10.0",
910
- "@prisma/instrumentation": "^7.10.0"
914
+ "@opentelemetry/sdk-trace-node": "^2.10.0"
911
915
  },
912
916
  devDependencies: {
913
917
  "@nestjs/common": "^12.0.1",
@@ -1222,7 +1226,6 @@ function observe(options = {}) {
1222
1226
  providerTracing: config.providerTracing,
1223
1227
  controllerTracing: config.controllerTracing
1224
1228
  }));
1225
- if (config.traces) instrumentations.push(new PrismaInstrumentation());
1226
1229
  registerInstrumentations({
1227
1230
  instrumentations,
1228
1231
  ...tracerProvider ? { tracerProvider } : {},
@@ -1327,7 +1330,7 @@ var NestObserveExplorer = class {
1327
1330
  }
1328
1331
  instrument(wrappers, instrumenter, kind) {
1329
1332
  for (const wrapper of wrappers) {
1330
- if (!wrapper.metatype) continue;
1333
+ if (!wrapper.metatype || wrapper.inject !== void 0) continue;
1331
1334
  if (["ObserveModule", "DiscoveryModule", "InternalCoreModule"].includes(wrapper.host?.name ?? "")) continue;
1332
1335
  if (wrapper.metatype === NestObserveExplorer) continue;
1333
1336
  if (wrapper.instance) {