@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/README.md +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +15 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +15 -13
- package/dist/index.mjs.map +1 -1
- package/dist/register.js +8 -12
- package/dist/register.js.map +1 -1
- package/dist/register.mjs +8 -12
- package/dist/register.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -97,7 +97,7 @@ Traces:
|
|
|
97
97
|
Logs:
|
|
98
98
|
|
|
99
99
|
- 默认 Nest `Logger` 的 `verbose/debug/log/warn/error/fatal`
|
|
100
|
-
-
|
|
100
|
+
- 对象和数组消息会在脱敏后保持结构化 body,由观测后端或查询侧决定如何展开、展示或序列化
|
|
101
101
|
- OTLP severity、`nestjs.context`、`trace_id`、`span_id`
|
|
102
102
|
- `service.name`、`service.version`、`deployment.environment.name`
|
|
103
103
|
- `StructuredLogEmitter` 抽象可用于后续 Pino/Winston adapter
|
package/dist/index.d.mts
CHANGED
|
@@ -177,8 +177,8 @@ declare class NestMethodInstrumenter {
|
|
|
177
177
|
private readonly errors;
|
|
178
178
|
private readonly instrumented;
|
|
179
179
|
constructor(tracer: Tracer, meter: Meter);
|
|
180
|
-
instrumentInstance(instance: object, kind: NestComponentKind, componentName?:
|
|
181
|
-
instrumentPrototype(type: Function, kind: NestComponentKind, componentName?:
|
|
180
|
+
instrumentInstance(instance: object, kind: NestComponentKind, componentName?: unknown): void;
|
|
181
|
+
instrumentPrototype(type: Function, kind: NestComponentKind, componentName?: unknown): void;
|
|
182
182
|
private instrumentTarget;
|
|
183
183
|
}
|
|
184
184
|
|
package/dist/index.d.ts
CHANGED
|
@@ -177,8 +177,8 @@ declare class NestMethodInstrumenter {
|
|
|
177
177
|
private readonly errors;
|
|
178
178
|
private readonly instrumented;
|
|
179
179
|
constructor(tracer: Tracer, meter: Meter);
|
|
180
|
-
instrumentInstance(instance: object, kind: NestComponentKind, componentName?:
|
|
181
|
-
instrumentPrototype(type: Function, kind: NestComponentKind, componentName?:
|
|
180
|
+
instrumentInstance(instance: object, kind: NestComponentKind, componentName?: unknown): void;
|
|
181
|
+
instrumentPrototype(type: Function, kind: NestComponentKind, componentName?: unknown): void;
|
|
182
182
|
private instrumentTarget;
|
|
183
183
|
}
|
|
184
184
|
|
package/dist/index.js
CHANGED
|
@@ -233,6 +233,11 @@ function invokeWithSpan(tracer, spanName, attributes, invoke, onFinish) {
|
|
|
233
233
|
}
|
|
234
234
|
|
|
235
235
|
// src/decorators/trace.decorator.ts
|
|
236
|
+
function copyOwnMetadata(source, target) {
|
|
237
|
+
for (const metadataKey of Reflect.getOwnMetadataKeys(source)) {
|
|
238
|
+
Reflect.defineMetadata(metadataKey, Reflect.getOwnMetadata(metadataKey, source), target);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
236
241
|
function decorateMethod(target, propertyKey, descriptor, options) {
|
|
237
242
|
const original = descriptor.value;
|
|
238
243
|
if (typeof original !== "function" || isTraceIgnored(original, target.constructor))
|
|
@@ -257,6 +262,7 @@ function decorateMethod(target, propertyKey, descriptor, options) {
|
|
|
257
262
|
value: original.name,
|
|
258
263
|
configurable: true
|
|
259
264
|
});
|
|
265
|
+
copyOwnMetadata(original, wrapped);
|
|
260
266
|
markTraceDecorated(wrapped);
|
|
261
267
|
descriptor.value = wrapped;
|
|
262
268
|
}
|
|
@@ -337,14 +343,9 @@ var SEVERITY = {
|
|
|
337
343
|
fatal: "FATAL"
|
|
338
344
|
};
|
|
339
345
|
function bodyValue(message) {
|
|
340
|
-
if (message instanceof Error)
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
try {
|
|
344
|
-
return JSON.stringify(sanitized, (_key, value) => typeof value === "bigint" ? value.toString() : value);
|
|
345
|
-
} catch {
|
|
346
|
-
return redactText(String(sanitized));
|
|
347
|
-
}
|
|
346
|
+
if (message instanceof Error)
|
|
347
|
+
return redactText(message.stack ?? `${message.name}: ${message.message}`);
|
|
348
|
+
return redact(message);
|
|
348
349
|
}
|
|
349
350
|
var NestLoggerInstrumentation = class {
|
|
350
351
|
constructor(emitter, resourceAttributes = {}) {
|
|
@@ -388,7 +389,8 @@ var NestLoggerInstrumentation = class {
|
|
|
388
389
|
disable() {
|
|
389
390
|
if (!this.enabled) return;
|
|
390
391
|
const prototype = import_common.ConsoleLogger.prototype;
|
|
391
|
-
for (const [method, original] of this.originals)
|
|
392
|
+
for (const [method, original] of this.originals)
|
|
393
|
+
prototype[method] = original;
|
|
392
394
|
this.originals.clear();
|
|
393
395
|
this.enabled = false;
|
|
394
396
|
}
|
|
@@ -464,7 +466,7 @@ var NestMethodInstrumenter = class {
|
|
|
464
466
|
if (!descriptor || typeof original !== "function" || isTraceIgnored(original, type) || isTraceDecorated(original)) continue;
|
|
465
467
|
const existing = Reflect.get(target, methodName);
|
|
466
468
|
if (typeof existing === "function" && existing !== original && isTraceDecorated(existing)) continue;
|
|
467
|
-
const name = componentName
|
|
469
|
+
const name = typeof componentName === "symbol" ? String(componentName) : typeof componentName === "string" && componentName ? componentName : type.name || "Anonymous";
|
|
468
470
|
const attributes = {
|
|
469
471
|
[`nestjs.${kind}`]: name,
|
|
470
472
|
"nestjs.method": methodName
|
|
@@ -517,7 +519,7 @@ var CompatibleNestInstrumentation = class extends import_instrumentation_nestjs_
|
|
|
517
519
|
const instance = await original.apply(this, args);
|
|
518
520
|
try {
|
|
519
521
|
const wrapper = args[1];
|
|
520
|
-
if (!instance || typeof instance !== "object" || !wrapper?.metatype) return instance;
|
|
522
|
+
if (!instance || typeof instance !== "object" || !wrapper?.metatype || wrapper.inject !== void 0) return instance;
|
|
521
523
|
if (["InternalCoreModule", "ObserveModule", "DiscoveryModule"].includes(wrapper.host?.name ?? "")) {
|
|
522
524
|
return instance;
|
|
523
525
|
}
|
|
@@ -861,7 +863,7 @@ var import_node_os2 = require("os");
|
|
|
861
863
|
// package.json
|
|
862
864
|
var package_default = {
|
|
863
865
|
name: "@ryanzeng/nest-observe",
|
|
864
|
-
version: "0.1.
|
|
866
|
+
version: "0.1.3",
|
|
865
867
|
description: "Zero-config, vendor-neutral OpenTelemetry observability for NestJS",
|
|
866
868
|
keywords: [
|
|
867
869
|
"nestjs",
|
|
@@ -1367,7 +1369,7 @@ var NestObserveExplorer = class {
|
|
|
1367
1369
|
}
|
|
1368
1370
|
instrument(wrappers, instrumenter, kind) {
|
|
1369
1371
|
for (const wrapper of wrappers) {
|
|
1370
|
-
if (!wrapper.metatype) continue;
|
|
1372
|
+
if (!wrapper.metatype || wrapper.inject !== void 0) continue;
|
|
1371
1373
|
if (["ObserveModule", "DiscoveryModule", "InternalCoreModule"].includes(wrapper.host?.name ?? "")) continue;
|
|
1372
1374
|
if (wrapper.metatype === NestObserveExplorer) continue;
|
|
1373
1375
|
if (wrapper.instance) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/decorators/metadata.ts","../src/decorators/ignore-trace.decorator.ts","../src/decorators/trace.decorator.ts","../src/decorators/invoke.ts","../src/logs/nest-logger-instrumentation.ts","../src/security/redaction.ts","../src/logs/otel-log-emitter.ts","../src/instrumentation/nest-compatible-instrumentation.ts","../src/nest/method-instrumenter.ts","../src/metrics/http-request-metrics.ts","../src/metrics/runtime-metrics.ts","../src/nest/observe.module.ts","../src/sdk.ts","../src/diagnostics.ts","../src/exceptions/process-exception-capture.ts","../src/resource.ts","../package.json","../src/security/span-redaction-processor.ts"],"sourcesContent":["export * from './config';\nexport * from './decorators';\nexport * from './logs';\nexport * from './instrumentation';\nexport * from './metrics';\nexport * from './nest';\nexport * from './resource';\nexport * from './security';\nexport * from './sdk';\nexport * from './types';\n","import { randomUUID } from 'node:crypto';\nimport type { ObserveOptions, ResolvedObserveConfig } from './types';\n\ntype Environment = Record<string, string | undefined>;\n\nconst DEFAULT_ALLOWED_HEADERS = ['accept', 'content-type', 'user-agent', 'x-request-id', 'traceparent'];\n\nfunction booleanValue(value: boolean | string | undefined, fallback: boolean): boolean {\n if (typeof value === 'boolean') return value;\n if (value?.toLowerCase() === 'true') return true;\n if (value?.toLowerCase() === 'false') return false;\n return fallback;\n}\n\nfunction positiveInteger(value: number | string | undefined, fallback: number): number {\n const number = Number(value);\n return Number.isFinite(number) && number > 0 ? Math.floor(number) : fallback;\n}\n\nfunction samplingValue(value: number | string | undefined): number {\n const number = Number(value);\n if (!Number.isFinite(number)) return 1;\n return Math.min(1, Math.max(0, number));\n}\n\nfunction environmentSampling(env: Environment): number {\n const sampler = env.OTEL_TRACES_SAMPLER?.toLowerCase();\n if (sampler === 'always_off' || sampler === 'parentbased_always_off') return 0;\n if (sampler === 'always_on' || sampler === 'parentbased_always_on') return 1;\n return samplingValue(env.OTEL_TRACES_SAMPLER_ARG);\n}\n\nfunction decode(value: string): string {\n try {\n return decodeURIComponent(value.trim());\n } catch {\n return value.trim();\n }\n}\n\nexport function parseKeyValueList(value?: string): Record<string, string> {\n if (!value) return {};\n return Object.fromEntries(value.split(',').flatMap((entry) => {\n const separator = entry.indexOf('=');\n if (separator <= 0) return [];\n const key = decode(entry.slice(0, separator));\n const itemValue = decode(entry.slice(separator + 1));\n return key ? [[key, itemValue]] : [];\n }));\n}\n\nfunction appendSignalPath(endpoint: string | undefined, signal: 'traces' | 'metrics' | 'logs'): string | undefined {\n if (!endpoint) return undefined;\n return `${endpoint.replace(/\\/+$/, '')}/v1/${signal}`;\n}\n\nfunction optionalString(value: string | undefined): string | undefined {\n const result = value?.trim();\n return result ? result : undefined;\n}\n\nexport function resolveObserveConfig(\n options: ObserveOptions = {},\n env: Environment = process.env,\n): ResolvedObserveConfig {\n const otelResources = parseKeyValueList(env.OTEL_RESOURCE_ATTRIBUTES);\n const resourceAttributes = { ...otelResources, ...options.resourceAttributes };\n const genericEndpoint = optionalString(options.endpoint ?? env.OTEL_EXPORTER_OTLP_ENDPOINT);\n const sampling = options.sampling === undefined\n ? environmentSampling(env)\n : samplingValue(options.sampling);\n const allowedHeaders = Array.from(new Set([\n ...DEFAULT_ALLOWED_HEADERS,\n ...(options.allowedHeaders ?? []),\n ].map((header) => header.toLowerCase().trim()).filter(Boolean)));\n\n const result: ResolvedObserveConfig = {\n enabled: booleanValue(options.enabled ?? env.OBSERVE_ENABLED, true),\n serviceName: options.serviceName ?? env.OTEL_SERVICE_NAME ?? otelResources['service.name'] ?? 'nest-application',\n serviceVersion: options.serviceVersion ?? env.OTEL_SERVICE_VERSION ?? otelResources['service.version'] ?? 'unknown',\n environment: options.environment\n ?? env.OBSERVE_ENVIRONMENT\n ?? otelResources['deployment.environment.name']\n ?? env.NODE_ENV\n ?? 'development',\n instanceId: options.instanceId\n ?? otelResources['service.instance.id']\n ?? env.OTEL_SERVICE_INSTANCE_ID\n ?? env.HOSTNAME\n ?? randomUUID(),\n endpoints: {\n traces: optionalString(env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'traces'),\n metrics: optionalString(env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'metrics'),\n logs: optionalString(env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'logs'),\n },\n headers: { ...parseKeyValueList(env.OTEL_EXPORTER_OTLP_HEADERS), ...options.headers },\n traces: booleanValue(options.traces, true),\n logs: booleanValue(options.logs, true),\n metrics: booleanValue(options.metrics, true),\n providerTracing: booleanValue(options.providerTracing, true),\n controllerTracing: booleanValue(options.controllerTracing, true),\n sampling,\n allowedHeaders,\n exportTimeoutMillis: positiveInteger(options.exportTimeoutMillis ?? env.OTEL_EXPORTER_OTLP_TIMEOUT, 10_000),\n metricExportIntervalMillis: positiveInteger(options.metricExportIntervalMillis ?? env.OTEL_METRIC_EXPORT_INTERVAL, 60_000),\n resourceAttributes,\n diagnosticLogging: booleanValue(options.diagnosticLogging, true),\n failFast: booleanValue(options.failFast, false),\n };\n if (options.exporters) result.exporters = options.exporters;\n return result;\n}\n","const ignoredTargets = new WeakSet<object>();\nconst tracedTargets = new WeakSet<object>();\n\nexport function markTraceIgnored(target: object): void {\n ignoredTargets.add(target);\n}\n\nexport function markTraceDecorated(target: object): void {\n tracedTargets.add(target);\n}\n\nexport function isTraceIgnored(method?: object, type?: object): boolean {\n return Boolean((method && ignoredTargets.has(method)) || (type && ignoredTargets.has(type)));\n}\n\nexport function isTraceDecorated(method?: object): boolean {\n return Boolean(method && tracedTargets.has(method));\n}\n","import { markTraceIgnored } from './metadata';\n\ntype IgnoreDecorator = MethodDecorator & ClassDecorator;\n\nexport function IgnoreTrace(): IgnoreDecorator {\n return ((target: object | Function, propertyKey?: string | symbol, descriptor?: PropertyDescriptor) => {\n if (propertyKey !== undefined && descriptor?.value && typeof descriptor.value === 'function') {\n markTraceIgnored(descriptor.value);\n return descriptor;\n }\n markTraceIgnored(target);\n return target;\n }) as IgnoreDecorator;\n}\n","import { trace } from \"@opentelemetry/api\";\nimport { invokeWithSpan } from \"./invoke\";\nimport { isTraceIgnored, markTraceDecorated } from \"./metadata\";\n\nexport interface TraceOptions {\n name?: string;\n attributes?: Record<string, string>;\n}\n\ntype TraceDecorator = MethodDecorator & ClassDecorator;\n\nfunction decorateMethod(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n options: TraceOptions,\n): void {\n const original = descriptor.value as (...args: unknown[]) => unknown;\n if (\n typeof original !== \"function\" ||\n isTraceIgnored(original, target.constructor)\n )\n return;\n const className = target.constructor?.name || \"Anonymous\";\n const methodName = String(propertyKey);\n const wrapped = function (this: unknown, ...args: unknown[]) {\n const tracer = trace.getTracer(\"@ryanzeng/nest-observe\");\n return invokeWithSpan(\n tracer,\n options.name ?? `${className}.${methodName}`,\n {\n \"code.function.name\": methodName,\n \"nestjs.class\": className,\n \"nestjs.method\": methodName,\n ...options.attributes,\n },\n () => original.apply(this, args),\n );\n };\n Object.defineProperty(wrapped, \"name\", {\n value: original.name,\n configurable: true,\n });\n markTraceDecorated(wrapped);\n descriptor.value = wrapped;\n}\n\nexport function Trace(\n nameOrOptions: string | TraceOptions = {},\n): TraceDecorator {\n const options =\n typeof nameOrOptions === \"string\" ? { name: nameOrOptions } : nameOrOptions;\n return ((\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor,\n ) => {\n if (propertyKey !== undefined && descriptor) {\n decorateMethod(target as object, propertyKey, descriptor, options);\n return descriptor;\n }\n const prototype = (target as { prototype?: object }).prototype;\n if (!prototype) return target;\n for (const key of Object.getOwnPropertyNames(prototype)) {\n if (key === \"constructor\") continue;\n const item = Object.getOwnPropertyDescriptor(prototype, key);\n if (!item || typeof item.value !== \"function\") continue;\n decorateMethod(prototype, key, item, options);\n Object.defineProperty(prototype, key, item);\n }\n return target;\n }) as TraceDecorator;\n}\n","import { context, SpanStatusCode, type Span, type Tracer } from '@opentelemetry/api';\nimport { isObservable, Observable } from 'rxjs';\nimport { finalize, tap } from 'rxjs/operators';\n\nfunction fail(span: Span, error: unknown): void {\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) });\n}\n\nexport function invokeWithSpan<T>(\n tracer: Tracer,\n spanName: string,\n attributes: Record<string, string>,\n invoke: () => T,\n onFinish?: (durationSeconds: number, error?: unknown) => void,\n): T {\n return tracer.startActiveSpan(spanName, { attributes }, (span) => {\n const started = process.hrtime.bigint();\n const finish = (error?: unknown) => {\n if (error !== undefined) fail(span, error);\n else span.setStatus({ code: SpanStatusCode.OK });\n onFinish?.(Number(process.hrtime.bigint() - started) / 1e9, error);\n span.end();\n };\n try {\n const result = invoke();\n if (result instanceof Promise) {\n return result.then(\n (value) => { finish(); return value; },\n (error: unknown) => { finish(error); throw error; },\n ) as T;\n }\n if (isObservable(result)) {\n const spanContext = context.active();\n const source = result as Observable<unknown>;\n return new Observable((subscriber) => context.with(spanContext, () => {\n let streamError: unknown;\n return source.pipe(\n tap({ error: (error: unknown) => { streamError = error; } }),\n finalize(() => finish(streamError)),\n ).subscribe(subscriber);\n })) as T;\n }\n finish();\n return result;\n } catch (error) {\n finish(error);\n throw error;\n }\n });\n}\n","import { ConsoleLogger } from '@nestjs/common';\nimport { trace } from '@opentelemetry/api';\nimport { redact, redactText } from '../security/redaction';\nimport type { StructuredLogEmitter, StructuredLogRecord } from './types';\n\ntype LogMethod = 'verbose' | 'debug' | 'log' | 'warn' | 'error' | 'fatal';\ntype ConsoleLoggerWithContext = ConsoleLogger & { context?: string };\n\nconst SEVERITY: Record<LogMethod, StructuredLogRecord['severityText']> = {\n verbose: 'TRACE',\n debug: 'DEBUG',\n log: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n fatal: 'FATAL',\n};\n\nfunction bodyValue(message: unknown): unknown {\n if (message instanceof Error) return redactText(message.stack ?? `${message.name}: ${message.message}`);\n const sanitized = redact(message);\n if (sanitized === null || typeof sanitized !== 'object') return sanitized;\n try {\n return JSON.stringify(sanitized, (_key, value) => (\n typeof value === 'bigint' ? value.toString() : value\n ));\n } catch {\n return redactText(String(sanitized));\n }\n}\n\nexport class NestLoggerInstrumentation {\n private originals = new Map<LogMethod, (...args: unknown[]) => void>();\n private enabled = false;\n\n constructor(\n private readonly emitter: StructuredLogEmitter,\n private readonly resourceAttributes: Record<string, string> = {},\n ) {}\n\n enable(): void {\n if (this.enabled) return;\n this.enabled = true;\n const prototype = ConsoleLogger.prototype as unknown as Record<LogMethod, (...args: unknown[]) => void>;\n for (const method of Object.keys(SEVERITY) as LogMethod[]) {\n const original = prototype[method];\n if (typeof original !== 'function') continue;\n this.originals.set(method, original);\n const emitter = this.emitter;\n const resourceAttributes = this.resourceAttributes;\n prototype[method] = function (this: ConsoleLoggerWithContext, message: unknown, ...args: unknown[]) {\n try {\n const spanContext = trace.getActiveSpan()?.spanContext();\n const contextName = this.context\n ?? (typeof args.at(-1) === 'string' ? String(args.at(-1)) : undefined);\n const attributes: Record<string, string> = { ...resourceAttributes };\n if (contextName) attributes['nestjs.context'] = contextName;\n if (spanContext?.traceId) attributes.trace_id = spanContext.traceId;\n if (spanContext?.spanId) attributes.span_id = spanContext.spanId;\n emitter.emit({\n body: bodyValue(message),\n severityText: SEVERITY[method],\n attributes,\n timestamp: Date.now(),\n });\n } catch {\n // Telemetry is best-effort and may never alter business logging behavior.\n }\n return original.call(this, message, ...args);\n };\n }\n }\n\n disable(): void {\n if (!this.enabled) return;\n const prototype = ConsoleLogger.prototype as unknown as Record<LogMethod, (...args: unknown[]) => void>;\n for (const [method, original] of this.originals) prototype[method] = original;\n this.originals.clear();\n this.enabled = false;\n }\n}\n","export const REDACTED = '[REDACTED]';\n\nconst SENSITIVE_KEY = /(?:authorization|proxy-authorization|cookie|set-cookie|pass(?:word|wd)?|secret|token|api[-_]?key|phone|mobile)/i;\n\nexport function isSensitiveKey(name: string): boolean {\n return SENSITIVE_KEY.test(name);\n}\n\nexport function redactText(value: string): string {\n return value\n .replace(/(?<!\\d)1[3-9]\\d{9}(?!\\d)/g, REDACTED)\n .replace(/\\b(authorization|proxy-authorization)\\s*[:=]\\s*(?:bearer\\s+|basic\\s+)?[^\\s,;]+/gi, `$1=${REDACTED}`)\n .replace(/\\b(password|passwd|secret|token|access_token|api[-_]?key|cookie)\\s*[:=]\\s*[^\\s,;]+/gi, `$1=${REDACTED}`)\n .replace(/\\bbearer\\s+[A-Za-z0-9._~+/=-]+/gi, `Bearer ${REDACTED}`);\n}\n\nfunction errorValue(error: Error): Record<string, string> {\n return {\n name: error.name,\n message: redactText(error.message),\n ...(error.stack ? { stack: redactText(error.stack) } : {}),\n };\n}\n\nfunction visit(value: unknown, seen: WeakSet<object>): unknown {\n if (typeof value === 'string') return redactText(value);\n if (value === null || typeof value !== 'object') return value;\n if (value instanceof Error) return errorValue(value);\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n if (Array.isArray(value)) return value.map((item) => visit(item, seen));\n const output: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n output[key] = SENSITIVE_KEY.test(key) ? REDACTED : visit(item, seen);\n }\n return output;\n}\n\nexport function redact<T>(value: T): T {\n return visit(value, new WeakSet()) as T;\n}\n\nexport function sanitizeHeaders(\n headers: Record<string, string | string[] | undefined>,\n allowedHeaders: readonly string[],\n): Record<string, string> {\n const allowed = new Set(allowedHeaders.map((header) => header.toLowerCase()));\n const output: Record<string, string> = {};\n for (const [originalName, value] of Object.entries(headers)) {\n const name = originalName.toLowerCase();\n if (!allowed.has(name) || value === undefined) continue;\n output[name] = SENSITIVE_KEY.test(name)\n ? REDACTED\n : Array.isArray(value) ? value.join(', ') : value;\n }\n return output;\n}\n","import { context, type Attributes } from \"@opentelemetry/api\";\nimport { logs, SeverityNumber, type Logger } from \"@opentelemetry/api-logs\";\nimport type { StructuredLogEmitter, StructuredLogRecord } from \"./types\";\n\nconst SEVERITY_NUMBER: Record<\n StructuredLogRecord[\"severityText\"],\n SeverityNumber\n> = {\n TRACE: SeverityNumber.TRACE,\n DEBUG: SeverityNumber.DEBUG,\n INFO: SeverityNumber.INFO,\n WARN: SeverityNumber.WARN,\n ERROR: SeverityNumber.ERROR,\n FATAL: SeverityNumber.FATAL,\n};\n\nexport class OpenTelemetryLogEmitter implements StructuredLogEmitter {\n private readonly logger: Logger;\n\n constructor(\n name = \"@ryanzeng/nest-observe\",\n version?: string,\n logger?: Logger,\n ) {\n this.logger = logger ?? logs.getLogger(name, version);\n }\n\n emit(record: StructuredLogRecord): void {\n this.logger.emit({\n body: record.body as never,\n severityText: record.severityText,\n severityNumber: SEVERITY_NUMBER[record.severityText],\n attributes: record.attributes as Attributes,\n ...(record.timestamp === undefined\n ? {}\n : { timestamp: record.timestamp }),\n context: context.active(),\n });\n }\n}\n","import {\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n type InstrumentationConfig,\n} from '@opentelemetry/instrumentation';\nimport { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core';\nimport { NestMethodInstrumenter } from '../nest/method-instrumenter';\n\nconst SUPPORTED_NEST_VERSIONS = ['>=4.0.0 <13'];\n\ntype NestWrapper = {\n instance?: object;\n metatype?: Function;\n name?: string;\n token?: unknown;\n host?: {\n name?: string;\n controllers?: Map<unknown, unknown>;\n };\n};\n\ntype InjectorExports = {\n Injector: {\n prototype: {\n instantiateClass: (...args: unknown[]) => Promise<unknown>;\n };\n };\n};\n\nexport interface CompatibleNestInstrumentationConfig extends InstrumentationConfig {\n providerTracing?: boolean;\n controllerTracing?: boolean;\n}\n\n/** Extends upstream Nest support to v12 and instruments DI-created providers. */\nexport class CompatibleNestInstrumentation extends NestInstrumentation {\n private methodInstrumenter?: NestMethodInstrumenter;\n\n constructor(private readonly observeConfig: CompatibleNestInstrumentationConfig = {}) {\n super(observeConfig);\n }\n\n override init(): InstrumentationNodeModuleDefinition {\n const definition = new InstrumentationNodeModuleDefinition('@nestjs/core', SUPPORTED_NEST_VERSIONS);\n definition.files.push(\n this.getNestFactoryFileInstrumentation(SUPPORTED_NEST_VERSIONS),\n this.getRouterExecutionContextFileInstrumentation(SUPPORTED_NEST_VERSIONS),\n new InstrumentationNodeModuleFile(\n '@nestjs/core/injector/injector.js',\n SUPPORTED_NEST_VERSIONS,\n (moduleExports: InjectorExports) => {\n const instrumentation = this;\n this._wrap(moduleExports.Injector.prototype, 'instantiateClass', (original) => {\n return async function (this: unknown, ...args: unknown[]) {\n const instance = await original.apply(this, args);\n try {\n const wrapper = args[1] as NestWrapper | undefined;\n if (!instance || typeof instance !== 'object' || !wrapper?.metatype) return instance;\n if (['InternalCoreModule', 'ObserveModule', 'DiscoveryModule'].includes(wrapper.host?.name ?? '')) {\n return instance;\n }\n const isController = wrapper.host?.controllers?.get(wrapper.token) === wrapper;\n if ((isController && instrumentation.observeConfig.controllerTracing === false)\n || (!isController && instrumentation.observeConfig.providerTracing === false)) {\n return instance;\n }\n instrumentation.getMethodInstrumenter().instrumentInstance(\n instance,\n isController ? 'controller' : 'provider',\n wrapper.name ?? wrapper.metatype.name,\n );\n } catch {\n // Framework internals vary by Nest version; instrumentation remains best-effort.\n }\n return instance;\n };\n });\n return moduleExports;\n },\n (moduleExports: InjectorExports) => {\n this._unwrap(moduleExports.Injector.prototype, 'instantiateClass');\n },\n ),\n );\n return definition;\n }\n\n private getMethodInstrumenter(): NestMethodInstrumenter {\n return this.methodInstrumenter ??= new NestMethodInstrumenter(this.tracer, this.meter);\n }\n}\n","import type { Meter, Tracer } from '@opentelemetry/api';\nimport { invokeWithSpan } from '../decorators/invoke';\nimport { isTraceDecorated, isTraceIgnored, markTraceDecorated } from '../decorators/metadata';\n\nexport type NestComponentKind = 'provider' | 'controller';\n\nexport class NestMethodInstrumenter {\n private readonly calls;\n private readonly duration;\n private readonly errors;\n private readonly instrumented = new WeakMap<object, Set<string>>();\n\n constructor(private readonly tracer: Tracer, meter: Meter) {\n this.calls = meter.createCounter('nestjs.method.calls', { unit: '{call}' });\n this.duration = meter.createHistogram('nestjs.method.duration', {\n unit: 's',\n advice: { explicitBucketBoundaries: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5] },\n });\n this.errors = meter.createCounter('nestjs.method.errors', { unit: '{error}' });\n }\n\n instrumentInstance(instance: object, kind: NestComponentKind, componentName?: string): void {\n const type = instance.constructor as Function;\n const prototype = Object.getPrototypeOf(instance) as object | null;\n if (!prototype) return;\n this.instrumentTarget(instance, prototype, type, kind, componentName);\n }\n\n instrumentPrototype(type: Function, kind: NestComponentKind, componentName?: string): void {\n const prototype = (type as { prototype?: object }).prototype;\n if (!prototype) return;\n this.instrumentTarget(prototype, prototype, type, kind, componentName);\n }\n\n private instrumentTarget(\n target: object,\n prototype: object,\n type: Function,\n kind: NestComponentKind,\n componentName?: string,\n ): void {\n if (isTraceIgnored(type)) return;\n const completed = this.instrumented.get(target) ?? new Set<string>();\n this.instrumented.set(target, completed);\n for (const methodName of Object.getOwnPropertyNames(prototype)) {\n if (methodName === 'constructor' || completed.has(methodName) || methodName.startsWith('onModule')) continue;\n const descriptor = Object.getOwnPropertyDescriptor(prototype, methodName);\n const original = descriptor?.value as ((...args: unknown[]) => unknown) | undefined;\n if (!descriptor || typeof original !== 'function' || isTraceIgnored(original, type) || isTraceDecorated(original)) continue;\n const existing = Reflect.get(target, methodName) as unknown;\n if (typeof existing === 'function' && existing !== original && isTraceDecorated(existing)) continue;\n const name = componentName || type.name || 'Anonymous';\n const attributes: Record<string, string> = {\n [`nestjs.${kind}`]: name,\n 'nestjs.method': methodName,\n };\n const instrumenter = this;\n const wrapped = function (this: unknown, ...args: unknown[]) {\n instrumenter.calls.add(1, attributes);\n return invokeWithSpan(\n instrumenter.tracer,\n `${name}.${methodName}`,\n attributes,\n () => original.apply(this, args),\n (seconds, error) => {\n instrumenter.duration.record(seconds, attributes);\n if (error !== undefined) instrumenter.errors.add(1, attributes);\n },\n );\n };\n markTraceDecorated(wrapped);\n try {\n Object.defineProperty(target, methodName, { ...descriptor, value: wrapped });\n completed.add(methodName);\n } catch {\n // Frozen or proxy-managed framework instances are intentionally skipped.\n }\n }\n }\n}\n","import type { Meter } from '@opentelemetry/api';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\n\ntype FrameworkRequest = IncomingMessage & {\n baseUrl?: string;\n route?: { path?: string };\n routerPath?: string;\n routeOptions?: { url?: string };\n};\n\nfunction routeFor(request: FrameworkRequest): string {\n const route = request.route?.path ?? request.routerPath ?? request.routeOptions?.url;\n if (!route) return '<unmatched>';\n return `${request.baseUrl ?? ''}${route}` || '<unmatched>';\n}\n\nexport class HttpRequestMetrics {\n private readonly requestCount;\n private readonly requestDuration;\n private readonly errorCount;\n private readonly startedAt = new WeakMap<IncomingMessage, bigint>();\n\n constructor(meter: Meter, private readonly serviceName: string) {\n this.requestCount = meter.createCounter('http.server.request.count', {\n description: 'Number of completed inbound HTTP requests',\n unit: '{request}',\n });\n this.requestDuration = meter.createHistogram('http.server.request.duration', {\n description: 'Inbound HTTP request duration',\n unit: 's',\n advice: { explicitBucketBoundaries: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10] },\n });\n this.errorCount = meter.createCounter('http.server.error.count', {\n description: 'Number of failed inbound HTTP requests',\n unit: '{error}',\n });\n }\n\n start(request: IncomingMessage): boolean {\n if (this.startedAt.has(request)) return false;\n this.startedAt.set(request, process.hrtime.bigint());\n return true;\n }\n\n record(request: IncomingMessage, response: ServerResponse): boolean {\n const started = this.startedAt.get(request);\n if (started === undefined) return false;\n this.startedAt.delete(request);\n const statusCode = Number.isFinite(response.statusCode) ? response.statusCode : 0;\n const attributes = {\n 'service.name': this.serviceName,\n 'http.route': routeFor(request as FrameworkRequest),\n 'http.request.method': request.method ?? 'UNKNOWN',\n 'http.response.status_code': statusCode,\n };\n this.requestCount.add(1, attributes);\n this.requestDuration.record(Number(process.hrtime.bigint() - started) / 1e9, attributes);\n if (statusCode >= 500) this.errorCount.add(1, attributes);\n return true;\n }\n}\n","import { cpus } from 'node:os';\nimport { monitorEventLoopDelay, PerformanceObserver, performance } from 'node:perf_hooks';\nimport type { Meter, ObservableCallback, ObservableResult } from '@opentelemetry/api';\n\ntype RemovableInstrument = {\n addCallback(callback: ObservableCallback): void;\n removeCallback(callback: ObservableCallback): void;\n};\n\nexport class RuntimeMetrics {\n private readonly callbacks: Array<{ instrument: RemovableInstrument; callback: ObservableCallback }> = [];\n private eventLoopDelay: ReturnType<typeof monitorEventLoopDelay> | undefined;\n private gcObserver: PerformanceObserver | undefined;\n private started = false;\n private previousElu = performance.eventLoopUtilization();\n\n constructor(private readonly meter: Meter) {}\n\n private observe(instrument: RemovableInstrument, callback: ObservableCallback): void {\n instrument.addCallback(callback);\n this.callbacks.push({ instrument, callback });\n }\n\n start(): void {\n if (this.started) return;\n this.started = true;\n const systemCpu = this.meter.createObservableGauge('system.cpu.utilization', { unit: '1' });\n this.observe(systemCpu, (result: ObservableResult) => {\n const cores = cpus();\n let idle = 0;\n let total = 0;\n for (const core of cores) {\n idle += core.times.idle;\n total += Object.values(core.times).reduce((sum, value) => sum + value, 0);\n }\n result.observe(total ? (total - idle) / total : 0);\n });\n\n const processCpu = this.meter.createObservableCounter('process.cpu.time', { unit: 's' });\n this.observe(processCpu, (result: ObservableResult) => {\n const cpu = process.cpuUsage();\n result.observe((cpu.user + cpu.system) / 1e6);\n });\n\n const rss = this.meter.createObservableGauge('process.memory.rss', { unit: 'By' });\n const heapUsed = this.meter.createObservableGauge('nodejs.memory.heap.used', { unit: 'By' });\n const heapTotal = this.meter.createObservableGauge('nodejs.memory.heap.total', { unit: 'By' });\n this.observe(rss, (result: ObservableResult) => result.observe(process.memoryUsage().rss));\n this.observe(heapUsed, (result: ObservableResult) => result.observe(process.memoryUsage().heapUsed));\n this.observe(heapTotal, (result: ObservableResult) => result.observe(process.memoryUsage().heapTotal));\n\n this.eventLoopDelay = monitorEventLoopDelay({ resolution: 20 });\n this.eventLoopDelay.enable();\n const delay = this.meter.createObservableGauge('nodejs.eventloop.delay', { unit: 's' });\n this.observe(delay, (result: ObservableResult) => {\n const mean = this.eventLoopDelay?.mean ?? 0;\n result.observe(Number.isFinite(mean) ? mean / 1e9 : 0);\n this.eventLoopDelay?.reset();\n });\n\n const utilization = this.meter.createObservableGauge('nodejs.eventloop.utilization', { unit: '1' });\n this.observe(utilization, (result: ObservableResult) => {\n const current = performance.eventLoopUtilization(this.previousElu);\n this.previousElu = performance.eventLoopUtilization();\n result.observe(current.utilization);\n });\n\n const gc = this.meter.createHistogram('nodejs.gc.duration', { unit: 's' });\n this.gcObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const detail = (entry as unknown as { detail?: { kind?: number } }).detail;\n gc.record(entry.duration / 1_000, { 'nodejs.gc.type': String(detail?.kind ?? 'unknown') });\n }\n });\n try { this.gcObserver.observe({ entryTypes: ['gc'] }); } catch { /* unsupported runtime */ }\n\n const uptime = this.meter.createObservableGauge('process.uptime', { unit: 's' });\n this.observe(uptime, (result: ObservableResult) => result.observe(process.uptime()));\n }\n\n stop(): void {\n for (const { instrument, callback } of this.callbacks) instrument.removeCallback(callback);\n this.callbacks.length = 0;\n this.eventLoopDelay?.disable();\n this.eventLoopDelay = undefined;\n this.gcObserver?.disconnect();\n this.gcObserver = undefined;\n this.started = false;\n }\n}\n","import {\n type CallHandler,\n type ExecutionContext,\n DynamicModule,\n Global,\n Inject,\n Injectable,\n Module,\n type NestInterceptor,\n OnApplicationShutdown,\n OnModuleInit,\n} from '@nestjs/common';\nimport { APP_INTERCEPTOR, DiscoveryModule, DiscoveryService } from '@nestjs/core';\nimport { metrics, trace } from '@opentelemetry/api';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Observable } from 'rxjs';\nimport { finalize } from 'rxjs';\nimport { getObserveRuntime, observe, type ObserveRuntime } from '../sdk';\nimport type { ObserveOptions } from '../types';\nimport { SDK_NAME, SDK_VERSION } from '../resource';\nimport { NestMethodInstrumenter } from './method-instrumenter';\n\nexport const OBSERVE_OPTIONS = Symbol('OBSERVE_OPTIONS');\nexport const OBSERVE_HANDLE = Symbol('OBSERVE_HANDLE');\n\ntype FrameworkResponse = ServerResponse & {\n raw?: ServerResponse;\n};\n\n/** Provides inbound HTTP metrics when module-load instrumentation was registered too late. */\n@Injectable()\nexport class NestHttpMetricsInterceptor implements NestInterceptor {\n constructor(@Inject(OBSERVE_HANDLE) private readonly handle: ObserveRuntime) {}\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n if (context.getType() !== 'http' || !this.handle.started || !this.handle.httpRequestMetrics) {\n return next.handle();\n }\n const http = context.switchToHttp();\n const request = http.getRequest<IncomingMessage>();\n const response = http.getResponse<FrameworkResponse>();\n const started = this.handle.httpRequestMetrics.start(request);\n const result = next.handle();\n if (!started) return result;\n\n const responseEventSource = response.raw ?? response;\n if (typeof responseEventSource.once === 'function') {\n responseEventSource.once('finish', () => {\n this.handle.httpRequestMetrics?.record(request, response);\n });\n return result;\n }\n return result.pipe(finalize(() => {\n this.handle.httpRequestMetrics?.record(request, response);\n }));\n }\n}\n\ntype DiscoveredWrapper = {\n instance?: object;\n metatype?: Function;\n name?: string;\n host?: { name?: string };\n};\n\n@Injectable()\nclass NestObserveExplorer implements OnModuleInit, OnApplicationShutdown {\n constructor(\n @Inject(DiscoveryService) private readonly discovery: DiscoveryService,\n @Inject(OBSERVE_OPTIONS) private readonly options: ObserveOptions,\n @Inject(OBSERVE_HANDLE) private readonly handle: ObserveRuntime,\n ) {}\n\n onModuleInit(): void {\n if (!this.handle.started) return;\n const runtime = getObserveRuntime();\n const tracer = runtime?.tracerProvider?.getTracer(SDK_NAME, SDK_VERSION) ?? trace.getTracer(SDK_NAME, SDK_VERSION);\n const meter = runtime?.meterProvider?.getMeter(SDK_NAME, SDK_VERSION) ?? metrics.getMeter(SDK_NAME, SDK_VERSION);\n const instrumenter = new NestMethodInstrumenter(tracer, meter);\n if (this.options.providerTracing !== false) {\n this.instrument(this.discovery.getProviders() as DiscoveredWrapper[], instrumenter, 'provider');\n }\n if (this.options.controllerTracing !== false) {\n this.instrument(this.discovery.getControllers() as DiscoveredWrapper[], instrumenter, 'controller');\n }\n }\n\n private instrument(\n wrappers: DiscoveredWrapper[],\n instrumenter: NestMethodInstrumenter,\n kind: 'provider' | 'controller',\n ): void {\n for (const wrapper of wrappers) {\n if (!wrapper.metatype) continue;\n if (['ObserveModule', 'DiscoveryModule', 'InternalCoreModule'].includes(wrapper.host?.name ?? '')) continue;\n if ((wrapper.metatype as Function) === NestObserveExplorer) continue;\n if (wrapper.instance) {\n instrumenter.instrumentInstance(wrapper.instance, kind, wrapper.name ?? wrapper.metatype.name);\n } else {\n instrumenter.instrumentPrototype(wrapper.metatype, kind, wrapper.name ?? wrapper.metatype.name);\n }\n }\n }\n\n async onApplicationShutdown(): Promise<void> {\n await this.handle.shutdown();\n }\n}\n\n@Global()\n@Module({})\nexport class ObserveModule {\n static forRoot(options: ObserveOptions = {}): DynamicModule {\n return {\n module: ObserveModule,\n global: true,\n imports: [DiscoveryModule],\n providers: [\n { provide: OBSERVE_OPTIONS, useValue: options },\n { provide: OBSERVE_HANDLE, useFactory: () => observe(options) },\n { provide: APP_INTERCEPTOR, useClass: NestHttpMetricsInterceptor },\n NestObserveExplorer,\n ],\n exports: [OBSERVE_HANDLE],\n };\n }\n}\n","import { logs } from '@opentelemetry/api-logs';\nimport { metrics, trace } from '@opentelemetry/api';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { registerInstrumentations, type Instrumentation } from '@opentelemetry/instrumentation';\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http';\nimport { PrismaInstrumentation } from '@prisma/instrumentation';\nimport { BatchLogRecordProcessor, LoggerProvider, type LogRecordExporter } from '@opentelemetry/sdk-logs';\nimport { AggregationType, MeterProvider, PeriodicExportingMetricReader, type MetricReader } from '@opentelemetry/sdk-metrics';\nimport { AlwaysOffSampler, BatchSpanProcessor, ParentBasedSampler, TraceIdRatioBasedSampler, type SpanExporter, type SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resolveObserveConfig } from './config';\nimport { ObserveDiagnostics, toError, withExporterDiagnostics } from './diagnostics';\nimport { ProcessExceptionCapture } from './exceptions/process-exception-capture';\nimport { CompatibleNestInstrumentation } from './instrumentation';\nimport { NestLoggerInstrumentation, OpenTelemetryLogEmitter } from './logs';\nimport { HttpRequestMetrics, RuntimeMetrics } from './metrics';\nimport { createObserveResource, SDK_NAME, SDK_VERSION } from './resource';\nimport { isSensitiveKey } from './security/redaction';\nimport { SpanRedactionProcessor } from './security/span-redaction-processor';\nimport type {\n ObserveErrorEvent,\n ObserveHandle,\n ObserveOptions,\n ObserveSignal,\n ObserveStatus,\n ResolvedObserveConfig,\n} from './types';\n\nexport interface ObserveRuntime extends ObserveHandle {\n readonly tracerProvider: NodeTracerProvider | undefined;\n readonly meterProvider: MeterProvider | undefined;\n readonly loggerProvider: LoggerProvider | undefined;\n readonly httpRequestMetrics: HttpRequestMetrics | undefined;\n}\n\nclass InactiveObserveHandle implements ObserveRuntime {\n readonly started = false;\n readonly tracerProvider = undefined;\n readonly meterProvider = undefined;\n readonly loggerProvider = undefined;\n readonly httpRequestMetrics = undefined;\n constructor(\n readonly config: Readonly<ResolvedObserveConfig>,\n private readonly diagnostics: ObserveDiagnostics,\n ) {}\n get status(): ObserveStatus { return this.diagnostics.status; }\n get lastError(): ObserveErrorEvent | undefined { return this.diagnostics.lastError; }\n forceFlush(): Promise<void> { return Promise.resolve(); }\n shutdown(): Promise<void> { return Promise.resolve(); }\n}\n\nclass ActiveObserveHandle implements ObserveRuntime {\n readonly started = true;\n private stopped = false;\n\n constructor(\n readonly config: Readonly<ResolvedObserveConfig>,\n readonly tracerProvider: NodeTracerProvider | undefined,\n readonly meterProvider: MeterProvider | undefined,\n readonly loggerProvider: LoggerProvider | undefined,\n readonly httpRequestMetrics: HttpRequestMetrics | undefined,\n private readonly runtimeMetrics: RuntimeMetrics | undefined,\n private readonly loggerInstrumentation: NestLoggerInstrumentation | undefined,\n private readonly exceptionCapture: ProcessExceptionCapture,\n private readonly instrumentations: Instrumentation[],\n private readonly diagnostics: ObserveDiagnostics,\n ) {}\n\n get status(): ObserveStatus { return this.diagnostics.status; }\n get lastError(): ObserveErrorEvent | undefined { return this.diagnostics.lastError; }\n\n async forceFlush(): Promise<void> {\n await this.runSafely('forceFlush', [\n ...(this.config.traces && this.tracerProvider\n ? [['traces', () => this.tracerProvider!.forceFlush()] as const]\n : []),\n ...(this.config.metrics && this.meterProvider\n ? [['metrics', () => this.meterProvider!.forceFlush()] as const]\n : []),\n ...(this.config.logs && this.loggerProvider\n ? [['logs', () => this.loggerProvider!.forceFlush({ timeoutMillis: this.config.exportTimeoutMillis })] as const]\n : []),\n ]);\n }\n\n async shutdown(): Promise<void> {\n if (this.stopped) return;\n this.stopped = true;\n this.loggerInstrumentation?.disable();\n this.exceptionCapture.stop();\n for (const instrumentation of this.instrumentations) {\n try { instrumentation.disable(); } catch (error) {\n this.diagnostics.failure('sdk', 'shutdown', error);\n }\n }\n await this.forceFlush();\n this.runtimeMetrics?.stop();\n await this.runSafely('shutdown', [\n ...(this.tracerProvider ? [['traces', () => this.tracerProvider!.shutdown()] as const] : []),\n ...(this.meterProvider ? [['metrics', () => this.meterProvider!.shutdown()] as const] : []),\n ...(this.loggerProvider ? [['logs', () => this.loggerProvider!.shutdown()] as const] : []),\n ]);\n if (activeRuntime === this) activeRuntime = undefined;\n this.diagnostics.stop();\n }\n\n private async runSafely(\n stage: 'forceFlush' | 'shutdown',\n operations: ReadonlyArray<readonly [ObserveSignal, () => Promise<void>]>,\n ): Promise<void> {\n await Promise.all(operations.map(async ([signal, operation]) => {\n try {\n await operation();\n } catch (error) {\n this.diagnostics.failure(signal, stage, error);\n }\n }));\n }\n}\n\nlet activeRuntime: ObserveRuntime | undefined;\n\nfunction exporterConfig(url: string | undefined, config: ResolvedObserveConfig) {\n return {\n ...(url ? { url } : {}),\n headers: config.headers,\n timeoutMillis: config.exportTimeoutMillis,\n };\n}\n\nfunction createTraceProvider(\n config: ResolvedObserveConfig,\n resource: ReturnType<typeof createObserveResource>,\n diagnostics: ObserveDiagnostics,\n) {\n if (!config.traces && !config.metrics) return undefined;\n const spanProcessors: SpanProcessor[] = [new SpanRedactionProcessor()];\n if (config.traces) {\n const exporter = config.exporters?.span\n ?? new OTLPTraceExporter(exporterConfig(config.endpoints.traces, config));\n spanProcessors.push(new BatchSpanProcessor(withExporterDiagnostics(\n exporter,\n 'traces',\n diagnostics,\n ) as SpanExporter, {\n exportTimeoutMillis: config.exportTimeoutMillis,\n maxQueueSize: 2_048,\n maxExportBatchSize: 512,\n }));\n }\n const provider = new NodeTracerProvider({\n resource,\n sampler: config.traces\n ? new ParentBasedSampler({ root: new TraceIdRatioBasedSampler(config.sampling) })\n : new AlwaysOffSampler(),\n spanProcessors,\n spanLimits: { attributeCountLimit: 64, eventCountLimit: 64, linkCountLimit: 16 },\n });\n provider.register();\n return provider;\n}\n\nfunction createMeterProvider(\n config: ResolvedObserveConfig,\n resource: ReturnType<typeof createObserveResource>,\n diagnostics: ObserveDiagnostics,\n) {\n if (!config.metrics) return undefined;\n let reader: MetricReader;\n if (config.exporters?.metricReader) {\n reader = config.exporters.metricReader;\n } else {\n reader = new PeriodicExportingMetricReader({\n exporter: withExporterDiagnostics(\n new OTLPMetricExporter(exporterConfig(config.endpoints.metrics, config)),\n 'metrics',\n diagnostics,\n ),\n exportIntervalMillis: config.metricExportIntervalMillis,\n exportTimeoutMillis: Math.min(config.exportTimeoutMillis, config.metricExportIntervalMillis),\n cardinalityLimits: { default: 2_000, histogram: 2_000 },\n });\n }\n const provider = new MeterProvider({\n resource,\n readers: [reader],\n views: [{\n instrumentName: 'http.server.request.duration',\n meterName: '@opentelemetry/instrumentation-http',\n aggregation: { type: AggregationType.DROP },\n }],\n });\n metrics.setGlobalMeterProvider(provider);\n return provider;\n}\n\nfunction createLoggerProvider(\n config: ResolvedObserveConfig,\n resource: ReturnType<typeof createObserveResource>,\n diagnostics: ObserveDiagnostics,\n) {\n if (!config.logs) return undefined;\n const exporter = config.exporters?.log\n ?? new OTLPLogExporter(exporterConfig(config.endpoints.logs, config));\n const provider = new LoggerProvider({\n resource,\n processors: [new BatchLogRecordProcessor({\n exporter: withExporterDiagnostics(exporter, 'logs', diagnostics) as LogRecordExporter,\n exportTimeoutMillis: config.exportTimeoutMillis,\n maxQueueSize: 2_048,\n maxExportBatchSize: 512,\n })],\n });\n logs.setGlobalLoggerProvider(provider);\n return provider;\n}\n\nexport function observe(options: ObserveOptions = {}): ObserveRuntime {\n if (activeRuntime?.started) return activeRuntime;\n const config = resolveObserveConfig(options);\n const diagnostics = new ObserveDiagnostics(config.diagnosticLogging, options.onError);\n if (!config.enabled) {\n diagnostics.inactive();\n return new InactiveObserveHandle(config, diagnostics);\n }\n let tracerProvider: NodeTracerProvider | undefined;\n let meterProvider: MeterProvider | undefined;\n let loggerProvider: LoggerProvider | undefined;\n let runtimeMetrics: RuntimeMetrics | undefined;\n let loggerInstrumentation: NestLoggerInstrumentation | undefined;\n let exceptionCapture: ProcessExceptionCapture | undefined;\n const instrumentations: Instrumentation[] = [];\n try {\n const resource = createObserveResource(config);\n meterProvider = createMeterProvider(config, resource, diagnostics);\n const meter = meterProvider?.getMeter(SDK_NAME, SDK_VERSION);\n const httpRequestMetrics = meter ? new HttpRequestMetrics(meter, config.serviceName) : undefined;\n tracerProvider = createTraceProvider(config, resource, diagnostics);\n loggerProvider = createLoggerProvider(config, resource, diagnostics);\n runtimeMetrics = meter ? new RuntimeMetrics(meter) : undefined;\n runtimeMetrics?.start();\n\n const otelLogger = loggerProvider?.getLogger(SDK_NAME, SDK_VERSION);\n const logEmitter = config.logs\n ? new OpenTelemetryLogEmitter(SDK_NAME, SDK_VERSION, otelLogger)\n : undefined;\n loggerInstrumentation = logEmitter\n ? new NestLoggerInstrumentation(logEmitter, {\n 'service.name': config.serviceName,\n 'service.version': config.serviceVersion,\n 'deployment.environment.name': config.environment,\n })\n : undefined;\n loggerInstrumentation?.enable();\n exceptionCapture = new ProcessExceptionCapture(logEmitter);\n exceptionCapture.start();\n\n if (config.traces || config.metrics) {\n const safeHeaders = config.allowedHeaders.filter((header) => !isSensitiveKey(header));\n instrumentations.push(new HttpInstrumentation({\n requireParentforOutgoingSpans: false,\n headersToSpanAttributes: {\n client: { requestHeaders: safeHeaders, responseHeaders: safeHeaders },\n server: { requestHeaders: safeHeaders, responseHeaders: safeHeaders },\n },\n redactedQueryParams: [\n 'sig', 'Signature', 'AWSAccessKeyId', 'X-Goog-Signature',\n 'password', 'passwd', 'token', 'access_token', 'api_key', 'secret',\n ],\n ...(httpRequestMetrics ? {\n requestHook: (_span, request) => {\n if (!('getHeader' in request)) httpRequestMetrics.start(request as never);\n },\n applyCustomAttributesOnSpan: (_span, request, response) => {\n if ('setHeader' in response) httpRequestMetrics.record(request as never, response as never);\n },\n } : {}),\n }));\n instrumentations.push(new CompatibleNestInstrumentation({\n providerTracing: config.providerTracing,\n controllerTracing: config.controllerTracing,\n }));\n if (config.traces) instrumentations.push(new PrismaInstrumentation() as unknown as Instrumentation);\n registerInstrumentations({\n instrumentations,\n ...(tracerProvider ? { tracerProvider } : {}),\n ...(meterProvider ? { meterProvider } : {}),\n });\n }\n const runtime = new ActiveObserveHandle(\n config,\n tracerProvider,\n meterProvider,\n loggerProvider,\n httpRequestMetrics,\n runtimeMetrics,\n loggerInstrumentation,\n exceptionCapture,\n instrumentations,\n diagnostics,\n );\n diagnostics.activate();\n activeRuntime = runtime;\n return runtime;\n } catch (error) {\n diagnostics.failure('sdk', 'initialization', error);\n loggerInstrumentation?.disable();\n runtimeMetrics?.stop();\n exceptionCapture?.stop();\n for (const instrumentation of instrumentations) {\n try { instrumentation.disable(); } catch { /* best effort */ }\n }\n void Promise.allSettled([\n tracerProvider?.shutdown(),\n meterProvider?.shutdown(),\n loggerProvider?.shutdown(),\n ].filter((item): item is Promise<void> => Boolean(item)));\n diagnostics.inactive();\n if (config.failFast) throw toError(error);\n return new InactiveObserveHandle(config, diagnostics);\n }\n}\n\nexport function getObserveRuntime(): ObserveRuntime | undefined {\n return activeRuntime;\n}\n","import { redactText } from './security/redaction';\nimport type {\n ObserveErrorEvent,\n ObserveErrorStage,\n ObserveSignal,\n ObserveStatus,\n} from './types';\n\ntype ExportResultLike = { code: number; error?: Error };\ntype ExportCallback = (result: ExportResultLike) => void;\ntype ExporterLike = { export(items: unknown, callback: ExportCallback): void };\n\nexport function toError(value: unknown): Error {\n if (value instanceof Error) return value;\n if (typeof value === 'string') return new Error(value);\n try {\n return new Error(JSON.stringify(value));\n } catch {\n return new Error(String(value));\n }\n}\n\nfunction sanitizeError(error: Error): Error {\n const sanitized = new Error(redactText(error.message));\n sanitized.name = error.name;\n if (error.stack) sanitized.stack = redactText(error.stack);\n return sanitized;\n}\n\n/** Tracks pipeline health and reports each distinct failure once until recovery. */\nexport class ObserveDiagnostics {\n private currentStatus: ObserveStatus = 'starting';\n private currentError: ObserveErrorEvent | undefined;\n private readonly failedSignals = new Set<ObserveSignal>();\n private readonly reported = new Set<string>();\n\n constructor(\n private readonly logging: boolean,\n private readonly onError?: (event: ObserveErrorEvent) => void,\n ) {}\n\n get status(): ObserveStatus { return this.currentStatus; }\n get lastError(): ObserveErrorEvent | undefined { return this.currentError; }\n\n activate(): void {\n if (this.currentStatus === 'starting') this.currentStatus = 'active';\n }\n\n inactive(): void {\n this.currentStatus = 'inactive';\n }\n\n stop(): void {\n this.currentStatus = 'stopped';\n }\n\n success(signal: ObserveSignal): void {\n this.failedSignals.delete(signal);\n for (const fingerprint of this.reported) {\n if (fingerprint.startsWith(`${signal}\\0`)) this.reported.delete(fingerprint);\n }\n if (this.currentStatus === 'degraded' && this.failedSignals.size === 0) {\n this.currentStatus = 'active';\n }\n }\n\n failure(signal: ObserveSignal, stage: ObserveErrorStage, value: unknown): void {\n const error = sanitizeError(toError(value));\n const event: ObserveErrorEvent = { signal, stage, error, timestamp: Date.now() };\n this.currentError = event;\n this.failedSignals.add(signal);\n if (this.currentStatus !== 'inactive' && this.currentStatus !== 'stopped') {\n this.currentStatus = 'degraded';\n }\n\n const fingerprint = `${signal}\\0${stage}\\0${error.name}\\0${error.message}`;\n if (this.reported.has(fingerprint)) return;\n this.reported.add(fingerprint);\n\n try { this.onError?.(event); } catch { /* diagnostics must never affect business code */ }\n if (!this.logging) return;\n try {\n process.stderr.write(\n `[nest-observe] ${signal} ${stage} failed: ${redactText(error.message)}\\n`,\n );\n } catch {\n // Diagnostics are best-effort and must never affect business code.\n }\n }\n}\n\n/** Observes asynchronous OTLP callback failures without changing exporter behavior. */\nexport function withExporterDiagnostics<T extends object>(\n exporter: T,\n signal: Exclude<ObserveSignal, 'sdk'>,\n diagnostics: ObserveDiagnostics,\n): T {\n const delegate = exporter as unknown as ExporterLike;\n return new Proxy(exporter, {\n get(target, property) {\n if (property === 'export') {\n return (items: unknown, callback: ExportCallback): void => {\n try {\n delegate.export.call(target, items, (result) => {\n if (result.code === 0) {\n diagnostics.success(signal);\n } else {\n diagnostics.failure(\n signal,\n 'export',\n result.error ?? new Error(`${signal} export failed`),\n );\n }\n callback(result);\n });\n } catch (error) {\n diagnostics.failure(signal, 'export', error);\n throw error;\n }\n };\n }\n const value = Reflect.get(target, property, target) as unknown;\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n","import { trace, SpanStatusCode } from '@opentelemetry/api';\nimport type { StructuredLogEmitter } from '../logs/types';\nimport { redactText } from '../security/redaction';\n\nfunction asError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nexport class ProcessExceptionCapture {\n private listening = false;\n private readonly onUncaughtException = (value: unknown) => this.capture(value, 'uncaughtException');\n\n constructor(private readonly emitter?: StructuredLogEmitter) {}\n\n start(): void {\n if (this.listening) return;\n this.listening = true;\n process.on('uncaughtExceptionMonitor', this.onUncaughtException);\n }\n\n stop(): void {\n if (!this.listening) return;\n process.off('uncaughtExceptionMonitor', this.onUncaughtException);\n this.listening = false;\n }\n\n capture(value: unknown, source = 'nestjs'): void {\n try {\n const error = asError(value);\n const span = trace.getActiveSpan();\n span?.recordException(error);\n span?.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n const spanContext = span?.spanContext();\n this.emitter?.emit({\n body: redactText(error.stack ?? error.message),\n severityText: 'ERROR',\n attributes: {\n 'exception.type': error.name,\n 'exception.message': redactText(error.message),\n 'exception.stacktrace': redactText(error.stack ?? ''),\n 'exception.source': source,\n ...(spanContext ? { trace_id: spanContext.traceId, span_id: spanContext.spanId } : {}),\n },\n timestamp: Date.now(),\n });\n } catch {\n // Exception reporting must not replace or swallow the original exception.\n }\n }\n}\n","import {\n defaultResource,\n resourceFromAttributes,\n type Resource,\n} from \"@opentelemetry/resources\";\nimport { hostname } from \"node:os\";\nimport pkg from \"../package.json\";\nimport type { ResolvedObserveConfig } from \"./types\";\nexport const SDK_NAME = pkg.name;\nexport const SDK_VERSION = pkg.version;\n\nexport function createObserveResource(config: ResolvedObserveConfig): Resource {\n return defaultResource().merge(\n resourceFromAttributes({\n ...config.resourceAttributes,\n \"service.name\": config.serviceName,\n \"service.version\": config.serviceVersion,\n \"deployment.environment.name\": config.environment,\n \"service.instance.id\": config.instanceId,\n \"telemetry.sdk.name\": SDK_NAME,\n \"telemetry.sdk.version\": SDK_VERSION,\n \"host.name\": config.resourceAttributes[\"host.name\"] ?? hostname(),\n }),\n );\n}\n","{\n \"name\": \"@ryanzeng/nest-observe\",\n \"version\": \"0.1.2\",\n \"description\": \"Zero-config, vendor-neutral OpenTelemetry observability for NestJS\",\n \"keywords\": [\n \"nestjs\",\n \"opentelemetry\",\n \"observability\",\n \"otlp\",\n \"tracing\",\n \"metrics\",\n \"logging\"\n ],\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/ryanzen9/nest-observe#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/ryanzen9/nest-observe/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ryanzen9/nest-observe.git\"\n },\n \"packageManager\": \"pnpm@10.13.1\",\n \"sideEffects\": [\n \"./dist/register.js\",\n \"./dist/register.mjs\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"./register\": {\n \"import\": {\n \"types\": \"./dist/register.d.mts\",\n \"default\": \"./dist/register.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/register.d.ts\",\n \"default\": \"./dist/register.js\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"check\": \"pnpm typecheck && pnpm test && pnpm build\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"peerDependencies\": {\n \"@nestjs/common\": \">=10 <13\",\n \"@nestjs/core\": \">=10 <13\",\n \"reflect-metadata\": \">=0.1.12 <1\",\n \"rxjs\": \"^7.1.0\"\n },\n \"dependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.221.0\",\n \"@opentelemetry/exporter-logs-otlp-proto\": \"^0.221.0\",\n \"@opentelemetry/exporter-metrics-otlp-proto\": \"^0.221.0\",\n \"@opentelemetry/exporter-trace-otlp-proto\": \"^0.221.0\",\n \"@opentelemetry/instrumentation\": \"^0.221.0\",\n \"@opentelemetry/instrumentation-http\": \"^0.221.0\",\n \"@opentelemetry/instrumentation-nestjs-core\": \"^0.67.0\",\n \"@opentelemetry/resources\": \"^2.10.0\",\n \"@opentelemetry/sdk-logs\": \"^0.221.0\",\n \"@opentelemetry/sdk-metrics\": \"^2.10.0\",\n \"@opentelemetry/sdk-trace-base\": \"^2.10.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.10.0\",\n \"@prisma/instrumentation\": \"^7.10.0\"\n },\n \"devDependencies\": {\n \"@nestjs/common\": \"^12.0.1\",\n \"@nestjs/core\": \"^12.0.1\",\n \"@nestjs/testing\": \"^12.0.1\",\n \"@opentelemetry/sdk-trace-base\": \"^2.10.0\",\n \"@types/node\": \"^24.0.0\",\n \"reflect-metadata\": \"^0.2.2\",\n \"rxjs\": \"^7.8.2\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import type { Attributes, AttributeValue, Context, Span } from '@opentelemetry/api';\nimport type { ReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { isSensitiveKey, redactText, REDACTED } from './redaction';\n\nconst DROP_VALUE = /(?:request\\.body|db\\.(?:query\\.)?parameters?|db\\.statement\\.parameters?|redis\\.(?:args|value))/i;\n\nfunction cleanValue(value: AttributeValue): AttributeValue {\n if (typeof value === 'string') return redactText(value);\n if (Array.isArray(value)) {\n return value.map((item) => typeof item === 'string' ? redactText(item) : item) as AttributeValue;\n }\n return value;\n}\n\nfunction cleanAttributes(attributes: Attributes | undefined): void {\n if (!attributes) return;\n const mutable = attributes as Record<string, AttributeValue | undefined>;\n for (const [key, value] of Object.entries(mutable)) {\n if (value === undefined) continue;\n if (DROP_VALUE.test(key) || isSensitiveKey(key)) mutable[key] = REDACTED;\n else mutable[key] = cleanValue(value);\n }\n}\n\n/** Last-line protection for spans emitted by third-party instrumentation. */\nexport class SpanRedactionProcessor implements SpanProcessor {\n onStart(_span: Span, _parentContext: Context): void {}\n\n onEnd(span: ReadableSpan): void {\n const mutable = span as ReadableSpan & {\n name: string;\n status: { code: number; message?: string };\n events: Array<{ attributes?: Attributes }>;\n };\n try {\n mutable.name = redactText(mutable.name);\n cleanAttributes(mutable.attributes);\n if (mutable.status.message) mutable.status.message = redactText(mutable.status.message);\n for (const event of mutable.events) cleanAttributes(event.attributes);\n } catch {\n // A non-standard immutable span is left untouched rather than breaking export.\n }\n }\n\n forceFlush(): Promise<void> { return Promise.resolve(); }\n shutdown(): Promise<void> { return Promise.resolve(); }\n}\n"],"mappings":"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","names":["import_api","import_api","import_api","import_common","import_api","import_rxjs","import_api_logs","import_api","import_instrumentation","import_api","import_node_os","context"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/decorators/metadata.ts","../src/decorators/ignore-trace.decorator.ts","../src/decorators/trace.decorator.ts","../src/decorators/invoke.ts","../src/logs/nest-logger-instrumentation.ts","../src/security/redaction.ts","../src/logs/otel-log-emitter.ts","../src/instrumentation/nest-compatible-instrumentation.ts","../src/nest/method-instrumenter.ts","../src/metrics/http-request-metrics.ts","../src/metrics/runtime-metrics.ts","../src/nest/observe.module.ts","../src/sdk.ts","../src/diagnostics.ts","../src/exceptions/process-exception-capture.ts","../src/resource.ts","../package.json","../src/security/span-redaction-processor.ts"],"sourcesContent":["export * from './config';\nexport * from './decorators';\nexport * from './logs';\nexport * from './instrumentation';\nexport * from './metrics';\nexport * from './nest';\nexport * from './resource';\nexport * from './security';\nexport * from './sdk';\nexport * from './types';\n","import { randomUUID } from 'node:crypto';\nimport type { ObserveOptions, ResolvedObserveConfig } from './types';\n\ntype Environment = Record<string, string | undefined>;\n\nconst DEFAULT_ALLOWED_HEADERS = ['accept', 'content-type', 'user-agent', 'x-request-id', 'traceparent'];\n\nfunction booleanValue(value: boolean | string | undefined, fallback: boolean): boolean {\n if (typeof value === 'boolean') return value;\n if (value?.toLowerCase() === 'true') return true;\n if (value?.toLowerCase() === 'false') return false;\n return fallback;\n}\n\nfunction positiveInteger(value: number | string | undefined, fallback: number): number {\n const number = Number(value);\n return Number.isFinite(number) && number > 0 ? Math.floor(number) : fallback;\n}\n\nfunction samplingValue(value: number | string | undefined): number {\n const number = Number(value);\n if (!Number.isFinite(number)) return 1;\n return Math.min(1, Math.max(0, number));\n}\n\nfunction environmentSampling(env: Environment): number {\n const sampler = env.OTEL_TRACES_SAMPLER?.toLowerCase();\n if (sampler === 'always_off' || sampler === 'parentbased_always_off') return 0;\n if (sampler === 'always_on' || sampler === 'parentbased_always_on') return 1;\n return samplingValue(env.OTEL_TRACES_SAMPLER_ARG);\n}\n\nfunction decode(value: string): string {\n try {\n return decodeURIComponent(value.trim());\n } catch {\n return value.trim();\n }\n}\n\nexport function parseKeyValueList(value?: string): Record<string, string> {\n if (!value) return {};\n return Object.fromEntries(value.split(',').flatMap((entry) => {\n const separator = entry.indexOf('=');\n if (separator <= 0) return [];\n const key = decode(entry.slice(0, separator));\n const itemValue = decode(entry.slice(separator + 1));\n return key ? [[key, itemValue]] : [];\n }));\n}\n\nfunction appendSignalPath(endpoint: string | undefined, signal: 'traces' | 'metrics' | 'logs'): string | undefined {\n if (!endpoint) return undefined;\n return `${endpoint.replace(/\\/+$/, '')}/v1/${signal}`;\n}\n\nfunction optionalString(value: string | undefined): string | undefined {\n const result = value?.trim();\n return result ? result : undefined;\n}\n\nexport function resolveObserveConfig(\n options: ObserveOptions = {},\n env: Environment = process.env,\n): ResolvedObserveConfig {\n const otelResources = parseKeyValueList(env.OTEL_RESOURCE_ATTRIBUTES);\n const resourceAttributes = { ...otelResources, ...options.resourceAttributes };\n const genericEndpoint = optionalString(options.endpoint ?? env.OTEL_EXPORTER_OTLP_ENDPOINT);\n const sampling = options.sampling === undefined\n ? environmentSampling(env)\n : samplingValue(options.sampling);\n const allowedHeaders = Array.from(new Set([\n ...DEFAULT_ALLOWED_HEADERS,\n ...(options.allowedHeaders ?? []),\n ].map((header) => header.toLowerCase().trim()).filter(Boolean)));\n\n const result: ResolvedObserveConfig = {\n enabled: booleanValue(options.enabled ?? env.OBSERVE_ENABLED, true),\n serviceName: options.serviceName ?? env.OTEL_SERVICE_NAME ?? otelResources['service.name'] ?? 'nest-application',\n serviceVersion: options.serviceVersion ?? env.OTEL_SERVICE_VERSION ?? otelResources['service.version'] ?? 'unknown',\n environment: options.environment\n ?? env.OBSERVE_ENVIRONMENT\n ?? otelResources['deployment.environment.name']\n ?? env.NODE_ENV\n ?? 'development',\n instanceId: options.instanceId\n ?? otelResources['service.instance.id']\n ?? env.OTEL_SERVICE_INSTANCE_ID\n ?? env.HOSTNAME\n ?? randomUUID(),\n endpoints: {\n traces: optionalString(env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'traces'),\n metrics: optionalString(env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'metrics'),\n logs: optionalString(env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) ?? appendSignalPath(genericEndpoint, 'logs'),\n },\n headers: { ...parseKeyValueList(env.OTEL_EXPORTER_OTLP_HEADERS), ...options.headers },\n traces: booleanValue(options.traces, true),\n logs: booleanValue(options.logs, true),\n metrics: booleanValue(options.metrics, true),\n providerTracing: booleanValue(options.providerTracing, true),\n controllerTracing: booleanValue(options.controllerTracing, true),\n sampling,\n allowedHeaders,\n exportTimeoutMillis: positiveInteger(options.exportTimeoutMillis ?? env.OTEL_EXPORTER_OTLP_TIMEOUT, 10_000),\n metricExportIntervalMillis: positiveInteger(options.metricExportIntervalMillis ?? env.OTEL_METRIC_EXPORT_INTERVAL, 60_000),\n resourceAttributes,\n diagnosticLogging: booleanValue(options.diagnosticLogging, true),\n failFast: booleanValue(options.failFast, false),\n };\n if (options.exporters) result.exporters = options.exporters;\n return result;\n}\n","const ignoredTargets = new WeakSet<object>();\nconst tracedTargets = new WeakSet<object>();\n\nexport function markTraceIgnored(target: object): void {\n ignoredTargets.add(target);\n}\n\nexport function markTraceDecorated(target: object): void {\n tracedTargets.add(target);\n}\n\nexport function isTraceIgnored(method?: object, type?: object): boolean {\n return Boolean((method && ignoredTargets.has(method)) || (type && ignoredTargets.has(type)));\n}\n\nexport function isTraceDecorated(method?: object): boolean {\n return Boolean(method && tracedTargets.has(method));\n}\n","import { markTraceIgnored } from './metadata';\n\ntype IgnoreDecorator = MethodDecorator & ClassDecorator;\n\nexport function IgnoreTrace(): IgnoreDecorator {\n return ((target: object | Function, propertyKey?: string | symbol, descriptor?: PropertyDescriptor) => {\n if (propertyKey !== undefined && descriptor?.value && typeof descriptor.value === 'function') {\n markTraceIgnored(descriptor.value);\n return descriptor;\n }\n markTraceIgnored(target);\n return target;\n }) as IgnoreDecorator;\n}\n","import { trace } from \"@opentelemetry/api\";\nimport { invokeWithSpan } from \"./invoke\";\nimport { isTraceIgnored, markTraceDecorated } from \"./metadata\";\n\nexport interface TraceOptions {\n name?: string;\n attributes?: Record<string, string>;\n}\n\ntype TraceDecorator = MethodDecorator & ClassDecorator;\n\nfunction copyOwnMetadata(source: Function, target: Function): void {\n for (const metadataKey of Reflect.getOwnMetadataKeys(source)) {\n Reflect.defineMetadata(metadataKey, Reflect.getOwnMetadata(metadataKey, source), target);\n }\n}\n\nfunction decorateMethod(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n options: TraceOptions,\n): void {\n const original = descriptor.value as (...args: unknown[]) => unknown;\n if (\n typeof original !== \"function\" ||\n isTraceIgnored(original, target.constructor)\n )\n return;\n const className = target.constructor?.name || \"Anonymous\";\n const methodName = String(propertyKey);\n const wrapped = function (this: unknown, ...args: unknown[]) {\n const tracer = trace.getTracer(\"@ryanzeng/nest-observe\");\n return invokeWithSpan(\n tracer,\n options.name ?? `${className}.${methodName}`,\n {\n \"code.function.name\": methodName,\n \"nestjs.class\": className,\n \"nestjs.method\": methodName,\n ...options.attributes,\n },\n () => original.apply(this, args),\n );\n };\n Object.defineProperty(wrapped, \"name\", {\n value: original.name,\n configurable: true,\n });\n copyOwnMetadata(original, wrapped);\n markTraceDecorated(wrapped);\n descriptor.value = wrapped;\n}\n\nexport function Trace(\n nameOrOptions: string | TraceOptions = {},\n): TraceDecorator {\n const options =\n typeof nameOrOptions === \"string\" ? { name: nameOrOptions } : nameOrOptions;\n return ((\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor,\n ) => {\n if (propertyKey !== undefined && descriptor) {\n decorateMethod(target as object, propertyKey, descriptor, options);\n return descriptor;\n }\n const prototype = (target as { prototype?: object }).prototype;\n if (!prototype) return target;\n for (const key of Object.getOwnPropertyNames(prototype)) {\n if (key === \"constructor\") continue;\n const item = Object.getOwnPropertyDescriptor(prototype, key);\n if (!item || typeof item.value !== \"function\") continue;\n decorateMethod(prototype, key, item, options);\n Object.defineProperty(prototype, key, item);\n }\n return target;\n }) as TraceDecorator;\n}\n","import { context, SpanStatusCode, type Span, type Tracer } from '@opentelemetry/api';\nimport { isObservable, Observable } from 'rxjs';\nimport { finalize, tap } from 'rxjs/operators';\n\nfunction fail(span: Span, error: unknown): void {\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) });\n}\n\nexport function invokeWithSpan<T>(\n tracer: Tracer,\n spanName: string,\n attributes: Record<string, string>,\n invoke: () => T,\n onFinish?: (durationSeconds: number, error?: unknown) => void,\n): T {\n return tracer.startActiveSpan(spanName, { attributes }, (span) => {\n const started = process.hrtime.bigint();\n const finish = (error?: unknown) => {\n if (error !== undefined) fail(span, error);\n else span.setStatus({ code: SpanStatusCode.OK });\n onFinish?.(Number(process.hrtime.bigint() - started) / 1e9, error);\n span.end();\n };\n try {\n const result = invoke();\n if (result instanceof Promise) {\n return result.then(\n (value) => { finish(); return value; },\n (error: unknown) => { finish(error); throw error; },\n ) as T;\n }\n if (isObservable(result)) {\n const spanContext = context.active();\n const source = result as Observable<unknown>;\n return new Observable((subscriber) => context.with(spanContext, () => {\n let streamError: unknown;\n return source.pipe(\n tap({ error: (error: unknown) => { streamError = error; } }),\n finalize(() => finish(streamError)),\n ).subscribe(subscriber);\n })) as T;\n }\n finish();\n return result;\n } catch (error) {\n finish(error);\n throw error;\n }\n });\n}\n","import { ConsoleLogger } from \"@nestjs/common\";\nimport { trace } from \"@opentelemetry/api\";\nimport { redact, redactText } from \"../security/redaction\";\nimport type { StructuredLogEmitter, StructuredLogRecord } from \"./types\";\n\ntype LogMethod = \"verbose\" | \"debug\" | \"log\" | \"warn\" | \"error\" | \"fatal\";\ntype ConsoleLoggerWithContext = ConsoleLogger & { context?: string };\n\nconst SEVERITY: Record<LogMethod, StructuredLogRecord[\"severityText\"]> = {\n verbose: \"TRACE\",\n debug: \"DEBUG\",\n log: \"INFO\",\n warn: \"WARN\",\n error: \"ERROR\",\n fatal: \"FATAL\",\n};\n\nfunction bodyValue(message: unknown): unknown {\n if (message instanceof Error)\n return redactText(message.stack ?? `${message.name}: ${message.message}`);\n return redact(message);\n}\n\nexport class NestLoggerInstrumentation {\n private originals = new Map<LogMethod, (...args: unknown[]) => void>();\n private enabled = false;\n\n constructor(\n private readonly emitter: StructuredLogEmitter,\n private readonly resourceAttributes: Record<string, string> = {},\n ) {}\n\n enable(): void {\n if (this.enabled) return;\n this.enabled = true;\n const prototype = ConsoleLogger.prototype as unknown as Record<\n LogMethod,\n (...args: unknown[]) => void\n >;\n for (const method of Object.keys(SEVERITY) as LogMethod[]) {\n const original = prototype[method];\n if (typeof original !== \"function\") continue;\n this.originals.set(method, original);\n const emitter = this.emitter;\n const resourceAttributes = this.resourceAttributes;\n prototype[method] = function (\n this: ConsoleLoggerWithContext,\n message: unknown,\n ...args: unknown[]\n ) {\n try {\n 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":["import_api","import_api","import_api","import_common","import_api","import_rxjs","import_api_logs","import_api","import_instrumentation","import_api","import_node_os","context"]}
|