@ryanzeng/nest-observe 0.1.2 → 0.1.3

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.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 = {}) {
@@ -337,7 +338,8 @@ var NestLoggerInstrumentation = class {
337
338
  disable() {
338
339
  if (!this.enabled) return;
339
340
  const prototype = ConsoleLogger.prototype;
340
- for (const [method, original] of this.originals) prototype[method] = original;
341
+ for (const [method, original] of this.originals)
342
+ prototype[method] = original;
341
343
  this.originals.clear();
342
344
  this.enabled = false;
343
345
  }
@@ -416,7 +418,7 @@ var NestMethodInstrumenter = class {
416
418
  if (!descriptor || typeof original !== "function" || isTraceIgnored(original, type) || isTraceDecorated(original)) continue;
417
419
  const existing = Reflect.get(target, methodName);
418
420
  if (typeof existing === "function" && existing !== original && isTraceDecorated(existing)) continue;
419
- const name = componentName || type.name || "Anonymous";
421
+ const name = typeof componentName === "symbol" ? String(componentName) : typeof componentName === "string" && componentName ? componentName : type.name || "Anonymous";
420
422
  const attributes = {
421
423
  [`nestjs.${kind}`]: name,
422
424
  "nestjs.method": methodName
@@ -469,7 +471,7 @@ var CompatibleNestInstrumentation = class extends NestInstrumentation {
469
471
  const instance = await original.apply(this, args);
470
472
  try {
471
473
  const wrapper = args[1];
472
- if (!instance || typeof instance !== "object" || !wrapper?.metatype) return instance;
474
+ if (!instance || typeof instance !== "object" || !wrapper?.metatype || wrapper.inject !== void 0) return instance;
473
475
  if (["InternalCoreModule", "ObserveModule", "DiscoveryModule"].includes(wrapper.host?.name ?? "")) {
474
476
  return instance;
475
477
  }
@@ -821,7 +823,7 @@ import { hostname } from "os";
821
823
  // package.json
822
824
  var package_default = {
823
825
  name: "@ryanzeng/nest-observe",
824
- version: "0.1.2",
826
+ version: "0.1.3",
825
827
  description: "Zero-config, vendor-neutral OpenTelemetry observability for NestJS",
826
828
  keywords: [
827
829
  "nestjs",
@@ -1327,7 +1329,7 @@ var NestObserveExplorer = class {
1327
1329
  }
1328
1330
  instrument(wrappers, instrumenter, kind) {
1329
1331
  for (const wrapper of wrappers) {
1330
- if (!wrapper.metatype) continue;
1332
+ if (!wrapper.metatype || wrapper.inject !== void 0) continue;
1331
1333
  if (["ObserveModule", "DiscoveryModule", "InternalCoreModule"].includes(wrapper.host?.name ?? "")) continue;
1332
1334
  if (wrapper.metatype === NestObserveExplorer) continue;
1333
1335
  if (wrapper.instance) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../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":["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":["trace","trace","context","metrics","trace","finalize","logs","trace","SpanStatusCode","trace","SpanStatusCode","logs","context","finalize","trace","metrics"]}
1
+ {"version":3,"sources":["../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":["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 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 { 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.3\",\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":["trace","trace","context","metrics","trace","finalize","logs","trace","SpanStatusCode","trace","SpanStatusCode","logs","context","finalize","trace","metrics"]}
package/dist/register.js CHANGED
@@ -395,7 +395,7 @@ var NestMethodInstrumenter = class {
395
395
  if (!descriptor || typeof original !== "function" || isTraceIgnored(original, type) || isTraceDecorated(original)) continue;
396
396
  const existing = Reflect.get(target, methodName);
397
397
  if (typeof existing === "function" && existing !== original && isTraceDecorated(existing)) continue;
398
- const name = componentName || type.name || "Anonymous";
398
+ const name = typeof componentName === "symbol" ? String(componentName) : typeof componentName === "string" && componentName ? componentName : type.name || "Anonymous";
399
399
  const attributes = {
400
400
  [`nestjs.${kind}`]: name,
401
401
  "nestjs.method": methodName
@@ -448,7 +448,7 @@ var CompatibleNestInstrumentation = class extends import_instrumentation_nestjs_
448
448
  const instance = await original.apply(this, args);
449
449
  try {
450
450
  const wrapper = args[1];
451
- if (!instance || typeof instance !== "object" || !wrapper?.metatype) return instance;
451
+ if (!instance || typeof instance !== "object" || !wrapper?.metatype || wrapper.inject !== void 0) return instance;
452
452
  if (["InternalCoreModule", "ObserveModule", "DiscoveryModule"].includes(wrapper.host?.name ?? "")) {
453
453
  return instance;
454
454
  }
@@ -492,14 +492,9 @@ var SEVERITY = {
492
492
  fatal: "FATAL"
493
493
  };
494
494
  function bodyValue(message) {
495
- if (message instanceof Error) return redactText(message.stack ?? `${message.name}: ${message.message}`);
496
- const sanitized = redact(message);
497
- if (sanitized === null || typeof sanitized !== "object") return sanitized;
498
- try {
499
- return JSON.stringify(sanitized, (_key, value) => typeof value === "bigint" ? value.toString() : value);
500
- } catch {
501
- return redactText(String(sanitized));
502
- }
495
+ if (message instanceof Error)
496
+ return redactText(message.stack ?? `${message.name}: ${message.message}`);
497
+ return redact(message);
503
498
  }
504
499
  var NestLoggerInstrumentation = class {
505
500
  constructor(emitter, resourceAttributes = {}) {
@@ -543,7 +538,8 @@ var NestLoggerInstrumentation = class {
543
538
  disable() {
544
539
  if (!this.enabled) return;
545
540
  const prototype = import_common.ConsoleLogger.prototype;
546
- for (const [method, original] of this.originals) prototype[method] = original;
541
+ for (const [method, original] of this.originals)
542
+ prototype[method] = original;
547
543
  this.originals.clear();
548
544
  this.enabled = false;
549
545
  }
@@ -716,7 +712,7 @@ var import_node_os2 = require("os");
716
712
  // package.json
717
713
  var package_default = {
718
714
  name: "@ryanzeng/nest-observe",
719
- version: "0.1.2",
715
+ version: "0.1.3",
720
716
  description: "Zero-config, vendor-neutral OpenTelemetry observability for NestJS",
721
717
  keywords: [
722
718
  "nestjs",