autotel 2.22.0 → 2.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -6
- package/bin/intent.js +6 -0
- package/dist/auto.cjs +3 -3
- package/dist/auto.js +2 -2
- package/dist/{chunk-EWH2542B.js → chunk-3AMR5XLZ.js} +3 -3
- package/dist/{chunk-EWH2542B.js.map → chunk-3AMR5XLZ.js.map} +1 -1
- package/dist/chunk-3QXBFGKP.js +344 -0
- package/dist/chunk-3QXBFGKP.js.map +1 -0
- package/dist/{chunk-VQFF2WMP.cjs → chunk-3ZFDJJWZ.cjs} +37 -29
- package/dist/chunk-3ZFDJJWZ.cjs.map +1 -0
- package/dist/{chunk-CQC6RVLR.cjs → chunk-4RZ4JUBY.cjs} +5 -5
- package/dist/{chunk-CQC6RVLR.cjs.map → chunk-4RZ4JUBY.cjs.map} +1 -1
- package/dist/{chunk-PAVYKPCQ.js → chunk-5XUEHX7J.js} +3 -3
- package/dist/{chunk-PAVYKPCQ.js.map → chunk-5XUEHX7J.js.map} +1 -1
- package/dist/chunk-6S5RUKU3.cjs +347 -0
- package/dist/chunk-6S5RUKU3.cjs.map +1 -0
- package/dist/{chunk-BS757SL2.js → chunk-724XLWR3.js} +9 -4
- package/dist/chunk-724XLWR3.js.map +1 -0
- package/dist/chunk-7EQ4G4SI.cjs +146 -0
- package/dist/chunk-7EQ4G4SI.cjs.map +1 -0
- package/dist/{chunk-CQP5SQT4.cjs → chunk-AXFWWJF3.cjs} +7 -7
- package/dist/{chunk-CQP5SQT4.cjs.map → chunk-AXFWWJF3.cjs.map} +1 -1
- package/dist/{chunk-7NH625MS.cjs → chunk-BSZP4URK.cjs} +5 -5
- package/dist/{chunk-7NH625MS.cjs.map → chunk-BSZP4URK.cjs.map} +1 -1
- package/dist/{chunk-GZFH6P5U.js → chunk-GY4CRZSV.js} +14 -6
- package/dist/chunk-GY4CRZSV.js.map +1 -0
- package/dist/{chunk-QKUGUDXJ.cjs → chunk-HSEIUH7F.cjs} +10 -5
- package/dist/chunk-HSEIUH7F.cjs.map +1 -0
- package/dist/{chunk-DTW3WB7Z.js → chunk-IPKXURBW.js} +3 -3
- package/dist/{chunk-DTW3WB7Z.js.map → chunk-IPKXURBW.js.map} +1 -1
- package/dist/chunk-J7VGRIAJ.js +64 -0
- package/dist/chunk-J7VGRIAJ.js.map +1 -0
- package/dist/chunk-KFOHQK7X.js +144 -0
- package/dist/chunk-KFOHQK7X.js.map +1 -0
- package/dist/{chunk-4UYR46UP.cjs → chunk-MSUHW2I4.cjs} +13 -13
- package/dist/{chunk-4UYR46UP.cjs.map → chunk-MSUHW2I4.cjs.map} +1 -1
- package/dist/chunk-T4B5LB6E.cjs +66 -0
- package/dist/chunk-T4B5LB6E.cjs.map +1 -0
- package/dist/{chunk-QHT4MUED.js → chunk-WCIIFRGL.js} +3 -3
- package/dist/{chunk-QHT4MUED.js.map → chunk-WCIIFRGL.js.map} +1 -1
- package/dist/decorators.cjs +3 -3
- package/dist/decorators.js +3 -3
- package/dist/drain-pipeline.cjs +13 -0
- package/dist/drain-pipeline.cjs.map +1 -0
- package/dist/drain-pipeline.d.cts +37 -0
- package/dist/drain-pipeline.d.ts +37 -0
- package/dist/drain-pipeline.js +4 -0
- package/dist/drain-pipeline.js.map +1 -0
- package/dist/enrichers.cjs +90 -0
- package/dist/enrichers.cjs.map +1 -0
- package/dist/enrichers.d.cts +23 -0
- package/dist/enrichers.d.ts +23 -0
- package/dist/enrichers.js +86 -0
- package/dist/enrichers.js.map +1 -0
- package/dist/event.cjs +6 -6
- package/dist/event.js +3 -3
- package/dist/functional.cjs +10 -10
- package/dist/functional.js +3 -3
- package/dist/index.cjs +274 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +73 -3
- package/dist/index.d.ts +73 -3
- package/dist/index.js +227 -11
- package/dist/index.js.map +1 -1
- package/dist/{init-BMiXSJNM.d.cts → init-BC5aN8bh.d.cts} +18 -0
- package/dist/{init-ByRbNTRo.d.ts → init-_FG4IbhF.d.ts} +18 -0
- package/dist/instrumentation.cjs +9 -9
- package/dist/instrumentation.js +2 -2
- package/dist/messaging.cjs +7 -7
- package/dist/messaging.js +4 -4
- package/dist/parse-error.cjs +13 -0
- package/dist/parse-error.cjs.map +1 -0
- package/dist/parse-error.d.cts +13 -0
- package/dist/parse-error.d.ts +13 -0
- package/dist/parse-error.js +4 -0
- package/dist/parse-error.js.map +1 -0
- package/dist/processors.cjs +2 -2
- package/dist/processors.d.cts +40 -4
- package/dist/processors.d.ts +40 -4
- package/dist/processors.js +1 -1
- package/dist/semantic-helpers.cjs +8 -8
- package/dist/semantic-helpers.js +4 -4
- package/dist/webhook.cjs +4 -4
- package/dist/webhook.js +3 -3
- package/dist/workflow-distributed.cjs +5 -5
- package/dist/workflow-distributed.js +3 -3
- package/dist/workflow.cjs +8 -8
- package/dist/workflow.js +4 -4
- package/dist/yaml-config.d.cts +2 -1
- package/dist/yaml-config.d.ts +2 -1
- package/package.json +55 -33
- package/skills/autotel-core/SKILL.md +162 -0
- package/skills/autotel-events/SKILL.md +88 -0
- package/skills/autotel-frameworks/SKILL.md +97 -0
- package/skills/autotel-instrumentation/SKILL.md +125 -0
- package/skills/autotel-request-logging/SKILL.md +100 -0
- package/skills/autotel-structured-errors/SKILL.md +130 -0
- package/src/drain-pipeline.test.ts +68 -0
- package/src/drain-pipeline.ts +199 -0
- package/src/enrichers.test.ts +150 -0
- package/src/enrichers.ts +145 -0
- package/src/flatten-attributes.test.ts +76 -0
- package/src/flatten-attributes.ts +80 -0
- package/src/functional.test.ts +63 -0
- package/src/functional.ts +11 -3
- package/src/index.ts +34 -0
- package/src/init.ts +22 -0
- package/src/package-manifest.test.ts +24 -0
- package/src/parse-error.test.ts +73 -0
- package/src/parse-error.ts +112 -0
- package/src/pretty-log-formatter.test.ts +123 -0
- package/src/pretty-log-formatter.ts +210 -0
- package/src/processors/canonical-log-line-processor.test.ts +81 -25
- package/src/processors/canonical-log-line-processor.ts +130 -42
- package/src/request-logger.test.ts +137 -0
- package/src/request-logger.ts +150 -0
- package/src/structured-error.test.ts +106 -0
- package/src/structured-error.ts +97 -0
- package/dist/chunk-2RQDNGV3.js +0 -126
- package/dist/chunk-2RQDNGV3.js.map +0 -1
- package/dist/chunk-BS757SL2.js.map +0 -1
- package/dist/chunk-GZFH6P5U.js.map +0 -1
- package/dist/chunk-ONK2Y22L.cjs +0 -128
- package/dist/chunk-ONK2Y22L.cjs.map +0 -1
- package/dist/chunk-QKUGUDXJ.cjs.map +0 -1
- package/dist/chunk-VQFF2WMP.cjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shutdown.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Graceful shutdown with flush and cleanup\n */\n\nimport { getSdk, getLogger } from './init';\nimport { getEventQueue, resetEventQueue } from './track';\nimport { resetEvents } from './event';\nimport { resetMetrics } from './metric';\n\n/**\n * Flush all pending telemetry\n *\n * Flushes both events events and OpenTelemetry spans to their destinations.\n * Includes timeout protection to prevent hanging in serverless environments.\n *\n * Safe to call multiple times.\n *\n * @param options - Optional configuration\n * @param options.timeout - Timeout in milliseconds (default: 2000ms)\n * @param options.forShutdown - If true, permanently disables the events queue after flush (used internally by shutdown())\n *\n * @example Manual flush in serverless\n * ```typescript\n * import { flush } from 'autotel';\n *\n * export const handler = async (event) => {\n * // ... process event\n * await flush(); // Flush before function returns\n * return result;\n * };\n * ```\n *\n * @example With custom timeout\n * ```typescript\n * await flush({ timeout: 5000 }); // 5 second timeout\n * ```\n */\nexport async function flush(options?: {\n timeout?: number;\n forShutdown?: boolean;\n}): Promise<void> {\n const timeout = options?.timeout ?? 2000;\n const forShutdown = options?.forShutdown ?? false;\n\n const doFlush = async () => {\n // Flush events queue (or shutdown queue when tearing down)\n const eventsQueue = getEventQueue();\n if (eventsQueue) {\n if (forShutdown) {\n await eventsQueue.shutdown();\n } else {\n await eventsQueue.flush();\n }\n }\n\n // Flush OpenTelemetry spans\n // This ensures spans are exported immediately, critical for serverless\n const sdk = getSdk();\n if (sdk) {\n try {\n // Type assertion needed as getTracerProvider is not in the public NodeSDK interface\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sdkAny = sdk as any;\n if (typeof sdkAny.getTracerProvider === 'function') {\n const tracerProvider = sdkAny.getTracerProvider();\n if (\n tracerProvider &&\n typeof tracerProvider.forceFlush === 'function'\n ) {\n await tracerProvider.forceFlush();\n }\n }\n } catch {\n // Ignore errors when accessing tracer provider (may not be available in test mocks)\n }\n }\n };\n\n // Add timeout protection to prevent hanging\n let timeoutHandle: NodeJS.Timeout | undefined;\n try {\n await Promise.race([\n doFlush().finally(() => {\n // Clear timeout as soon as flush completes\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n }),\n new Promise<void>((_, reject) => {\n timeoutHandle = setTimeout(\n () => reject(new Error('Flush timeout')),\n timeout,\n );\n // Use unref() to allow Node to exit if flush completes first\n // This prevents the 2s delay in serverless when flush succeeds immediately\n timeoutHandle.unref();\n }),\n ]);\n } catch (error) {\n // Clear timeout on error too\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n const logger = getLogger();\n logger.error(\n {\n err: error instanceof Error ? error : new Error(String(error)),\n },\n '[autotel] Flush error',\n );\n throw error;\n }\n}\n\n/**\n * Shutdown telemetry and cleanup resources\n *\n * - Flushes all pending data\n * - Shuts down OpenTelemetry SDK\n * - Cleans up resources\n *\n * Call this before process exit.\n *\n * Always performs cleanup even if flush fails, preventing resource leaks\n * in serverless handlers or tests.\n *\n * @example Express server\n * ```typescript\n * const server = app.listen(3000)\n *\n * process.on('SIGTERM', async () => {\n * await server.close()\n * await shutdown()\n * process.exit(0)\n * })\n * ```\n */\nexport async function shutdown(): Promise<void> {\n const logger = getLogger();\n let shutdownError: Error | null = null;\n\n // Attempt to flush (with queue shutdown so new events are rejected), but continue with cleanup even if it fails\n try {\n await flush({ forShutdown: true });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n shutdownError = err;\n logger.error(\n {\n err,\n },\n '[autotel] Flush failed during shutdown, continuing cleanup',\n );\n }\n\n // Always shutdown SDK and clean up resources\n try {\n // Shutdown OpenTelemetry SDK\n const sdk = getSdk();\n if (sdk) {\n await sdk.shutdown();\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Ignore ECONNREFUSED errors - this happens when no OTLP endpoint was configured\n // The SDK tries to flush exporters that don't exist, which is harmless\n const isConnectionRefused =\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'ECONNREFUSED';\n\n if (!isConnectionRefused) {\n // Only store/log non-connection errors\n if (!shutdownError) {\n shutdownError = err;\n }\n logger.error({ err }, '[autotel] SDK shutdown failed');\n }\n } finally {\n // Clean up singleton Maps and queues to prevent memory leaks\n // This runs even if SDK shutdown fails\n const eventsQueue = getEventQueue();\n if (eventsQueue && typeof eventsQueue.cleanup === 'function') {\n eventsQueue.cleanup();\n }\n resetEvents();\n resetMetrics();\n resetEventQueue();\n }\n\n // Rethrow first error after cleanup completes\n // This allows tests and CI to detect failures while still ensuring cleanup\n if (shutdownError) {\n throw shutdownError;\n }\n}\n\n/**\n * Register automatic shutdown hooks for common signals\n *\n * Handles:\n * - SIGTERM (Docker/K8s graceful shutdown)\n * - SIGINT (Ctrl+C)\n *\n * @internal Called automatically on module load\n */\nfunction registerShutdownHooks(): void {\n if (typeof process === 'undefined') return; // Not in Node.js\n\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT'];\n let shuttingDown = false;\n\n for (const signal of signals) {\n process.on(signal, async () => {\n if (shuttingDown) return; // Prevent double shutdown\n shuttingDown = true;\n\n if (process.env.NODE_ENV !== 'test') {\n getLogger().info(\n {},\n `[autotel] Received ${signal}, flushing telemetry...`,\n );\n }\n\n try {\n await shutdown();\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n '[autotel] Error during shutdown',\n );\n } finally {\n process.exit(0);\n }\n });\n }\n}\n\n// Auto-register shutdown hooks\nregisterShutdownHooks();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shutdown.ts","../src/flatten-attributes.ts","../src/structured-error.ts","../src/request-logger.ts"],"names":["ctx","span","otelTrace","attrs"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Graceful shutdown with flush and cleanup\n */\n\nimport { getSdk, getLogger } from './init';\nimport { getEventQueue, resetEventQueue } from './track';\nimport { resetEvents } from './event';\nimport { resetMetrics } from './metric';\n\n/**\n * Flush all pending telemetry\n *\n * Flushes both events events and OpenTelemetry spans to their destinations.\n * Includes timeout protection to prevent hanging in serverless environments.\n *\n * Safe to call multiple times.\n *\n * @param options - Optional configuration\n * @param options.timeout - Timeout in milliseconds (default: 2000ms)\n * @param options.forShutdown - If true, permanently disables the events queue after flush (used internally by shutdown())\n *\n * @example Manual flush in serverless\n * ```typescript\n * import { flush } from 'autotel';\n *\n * export const handler = async (event) => {\n * // ... process event\n * await flush(); // Flush before function returns\n * return result;\n * };\n * ```\n *\n * @example With custom timeout\n * ```typescript\n * await flush({ timeout: 5000 }); // 5 second timeout\n * ```\n */\nexport async function flush(options?: {\n timeout?: number;\n forShutdown?: boolean;\n}): Promise<void> {\n const timeout = options?.timeout ?? 2000;\n const forShutdown = options?.forShutdown ?? false;\n\n const doFlush = async () => {\n // Flush events queue (or shutdown queue when tearing down)\n const eventsQueue = getEventQueue();\n if (eventsQueue) {\n if (forShutdown) {\n await eventsQueue.shutdown();\n } else {\n await eventsQueue.flush();\n }\n }\n\n // Flush OpenTelemetry spans\n // This ensures spans are exported immediately, critical for serverless\n const sdk = getSdk();\n if (sdk) {\n try {\n // Type assertion needed as getTracerProvider is not in the public NodeSDK interface\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sdkAny = sdk as any;\n if (typeof sdkAny.getTracerProvider === 'function') {\n const tracerProvider = sdkAny.getTracerProvider();\n if (\n tracerProvider &&\n typeof tracerProvider.forceFlush === 'function'\n ) {\n await tracerProvider.forceFlush();\n }\n }\n } catch {\n // Ignore errors when accessing tracer provider (may not be available in test mocks)\n }\n }\n };\n\n // Add timeout protection to prevent hanging\n let timeoutHandle: NodeJS.Timeout | undefined;\n try {\n await Promise.race([\n doFlush().finally(() => {\n // Clear timeout as soon as flush completes\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n }),\n new Promise<void>((_, reject) => {\n timeoutHandle = setTimeout(\n () => reject(new Error('Flush timeout')),\n timeout,\n );\n // Use unref() to allow Node to exit if flush completes first\n // This prevents the 2s delay in serverless when flush succeeds immediately\n timeoutHandle.unref();\n }),\n ]);\n } catch (error) {\n // Clear timeout on error too\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n const logger = getLogger();\n logger.error(\n {\n err: error instanceof Error ? error : new Error(String(error)),\n },\n '[autotel] Flush error',\n );\n throw error;\n }\n}\n\n/**\n * Shutdown telemetry and cleanup resources\n *\n * - Flushes all pending data\n * - Shuts down OpenTelemetry SDK\n * - Cleans up resources\n *\n * Call this before process exit.\n *\n * Always performs cleanup even if flush fails, preventing resource leaks\n * in serverless handlers or tests.\n *\n * @example Express server\n * ```typescript\n * const server = app.listen(3000)\n *\n * process.on('SIGTERM', async () => {\n * await server.close()\n * await shutdown()\n * process.exit(0)\n * })\n * ```\n */\nexport async function shutdown(): Promise<void> {\n const logger = getLogger();\n let shutdownError: Error | null = null;\n\n // Attempt to flush (with queue shutdown so new events are rejected), but continue with cleanup even if it fails\n try {\n await flush({ forShutdown: true });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n shutdownError = err;\n logger.error(\n {\n err,\n },\n '[autotel] Flush failed during shutdown, continuing cleanup',\n );\n }\n\n // Always shutdown SDK and clean up resources\n try {\n // Shutdown OpenTelemetry SDK\n const sdk = getSdk();\n if (sdk) {\n await sdk.shutdown();\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Ignore ECONNREFUSED errors - this happens when no OTLP endpoint was configured\n // The SDK tries to flush exporters that don't exist, which is harmless\n const isConnectionRefused =\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'ECONNREFUSED';\n\n if (!isConnectionRefused) {\n // Only store/log non-connection errors\n if (!shutdownError) {\n shutdownError = err;\n }\n logger.error({ err }, '[autotel] SDK shutdown failed');\n }\n } finally {\n // Clean up singleton Maps and queues to prevent memory leaks\n // This runs even if SDK shutdown fails\n const eventsQueue = getEventQueue();\n if (eventsQueue && typeof eventsQueue.cleanup === 'function') {\n eventsQueue.cleanup();\n }\n resetEvents();\n resetMetrics();\n resetEventQueue();\n }\n\n // Rethrow first error after cleanup completes\n // This allows tests and CI to detect failures while still ensuring cleanup\n if (shutdownError) {\n throw shutdownError;\n }\n}\n\n/**\n * Register automatic shutdown hooks for common signals\n *\n * Handles:\n * - SIGTERM (Docker/K8s graceful shutdown)\n * - SIGINT (Ctrl+C)\n *\n * @internal Called automatically on module load\n */\nfunction registerShutdownHooks(): void {\n if (typeof process === 'undefined') return; // Not in Node.js\n\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT'];\n let shuttingDown = false;\n\n for (const signal of signals) {\n process.on(signal, async () => {\n if (shuttingDown) return; // Prevent double shutdown\n shuttingDown = true;\n\n if (process.env.NODE_ENV !== 'test') {\n getLogger().info(\n {},\n `[autotel] Received ${signal}, flushing telemetry...`,\n );\n }\n\n try {\n await shutdown();\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n '[autotel] Error during shutdown',\n );\n } finally {\n process.exit(0);\n }\n });\n }\n}\n\n// Auto-register shutdown hooks\nregisterShutdownHooks();\n","import type { AttributeValue } from './trace-context';\n\n/**\n * Convert an unknown value to an OTel-compatible AttributeValue.\n * Returns undefined when the value cannot be represented.\n */\nexport function toAttributeValue(value: unknown): AttributeValue | undefined {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n if (\n value.every((v) => typeof v === 'string') ||\n value.every((v) => typeof v === 'number') ||\n value.every((v) => typeof v === 'boolean')\n ) {\n return value as AttributeValue;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return '<serialization-failed>';\n }\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (value instanceof Error) {\n return value.message;\n }\n return undefined;\n}\n\n/**\n * Recursively flatten a nested object into dot-notation OTel attributes.\n * Includes circular reference protection via WeakSet.\n */\nexport function flattenToAttributes(\n fields: Record<string, unknown>,\n prefix = '',\n): Record<string, AttributeValue> {\n const out: Record<string, AttributeValue> = {};\n const seen = new WeakSet<object>();\n\n function flatten(obj: Record<string, unknown>, currentPrefix: string): void {\n for (const [key, value] of Object.entries(obj)) {\n if (value == null) continue;\n const nextKey = currentPrefix ? `${currentPrefix}.${key}` : key;\n\n const attr = toAttributeValue(value);\n if (attr !== undefined) {\n out[nextKey] = attr;\n continue;\n }\n\n if (typeof value === 'object' && value.constructor === Object) {\n if (seen.has(value)) {\n out[nextKey] = '<circular-reference>';\n continue;\n }\n seen.add(value);\n flatten(value as Record<string, unknown>, nextKey);\n continue;\n }\n\n try {\n out[nextKey] = JSON.stringify(value);\n } catch {\n out[nextKey] = '<serialization-failed>';\n }\n }\n }\n\n flatten(fields, prefix);\n return out;\n}\n","import { SpanStatusCode } from '@opentelemetry/api';\nimport type { AttributeValue, TraceContext } from './trace-context';\nimport { flattenToAttributes } from './flatten-attributes';\n\nexport interface StructuredErrorInput {\n message: string;\n why?: string;\n fix?: string;\n link?: string;\n code?: string | number;\n status?: number;\n cause?: unknown;\n details?: Record<string, unknown>;\n name?: string;\n}\n\nexport interface StructuredError extends Error {\n why?: string;\n fix?: string;\n link?: string;\n code?: string | number;\n status?: number;\n details?: Record<string, unknown>;\n}\n\nexport function createStructuredError(\n input: StructuredErrorInput,\n): StructuredError {\n const error = new Error(input.message, {\n cause: input.cause,\n }) as StructuredError;\n\n error.name = input.name ?? 'StructuredError';\n if (input.why !== undefined) error.why = input.why;\n if (input.fix !== undefined) error.fix = input.fix;\n if (input.link !== undefined) error.link = input.link;\n if (input.code !== undefined) error.code = input.code;\n if (input.status !== undefined) error.status = input.status;\n if (input.details !== undefined) error.details = input.details;\n\n error.toString = () => {\n const lines = [`${error.name}: ${error.message}`];\n if (error.why) lines.push(` Why: ${error.why}`);\n if (error.fix) lines.push(` Fix: ${error.fix}`);\n if (error.link) lines.push(` Link: ${error.link}`);\n if (error.code !== undefined) lines.push(` Code: ${error.code}`);\n if (error.status !== undefined) lines.push(` Status: ${error.status}`);\n if (error.cause) lines.push(` Caused by: ${error.cause}`);\n return lines.join('\\n');\n };\n\n return error;\n}\n\nexport function getStructuredErrorAttributes(\n error: Error,\n): Record<string, AttributeValue> {\n const structured = error as StructuredError;\n const attributes: Record<string, AttributeValue> = {\n 'error.type': error.name || 'Error',\n 'error.message': error.message,\n };\n\n if (error.stack) attributes['error.stack'] = error.stack;\n if (structured.why) attributes['error.why'] = structured.why;\n if (structured.fix) attributes['error.fix'] = structured.fix;\n if (structured.link) attributes['error.link'] = structured.link;\n if (structured.code !== undefined) {\n attributes['error.code'] =\n typeof structured.code === 'string'\n ? structured.code\n : String(structured.code);\n }\n if (structured.status !== undefined) {\n attributes['error.status'] = structured.status;\n }\n if (structured.details) {\n Object.assign(\n attributes,\n flattenToAttributes(structured.details, 'error.details'),\n );\n }\n\n return attributes;\n}\n\nexport function recordStructuredError(\n ctx: Pick<TraceContext, 'recordException' | 'setAttributes' | 'setStatus'>,\n error: Error,\n): void {\n ctx.recordException(error);\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n ctx.setAttributes(getStructuredErrorAttributes(error));\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { trace as otelTrace } from '@opentelemetry/api';\nimport type { TraceContext } from './trace-context';\nimport { createTraceContext } from './trace-context';\nimport { recordStructuredError } from './structured-error';\nimport { flattenToAttributes } from './flatten-attributes';\n\nconst requestContextStore = new AsyncLocalStorage<TraceContext>();\n\nexport function runWithRequestContext<T>(ctx: TraceContext, fn: () => T): T {\n return requestContextStore.run(ctx, fn);\n}\n\nexport interface RequestLogger {\n set(fields: Record<string, unknown>): void;\n info(message: string, fields?: Record<string, unknown>): void;\n warn(message: string, fields?: Record<string, unknown>): void;\n error(error: Error | string, fields?: Record<string, unknown>): void;\n getContext(): Record<string, unknown>;\n emitNow(overrides?: Record<string, unknown>): RequestLogSnapshot;\n}\n\nexport interface RequestLogSnapshot {\n timestamp: string;\n traceId: string;\n spanId: string;\n correlationId: string;\n context: Record<string, unknown>;\n}\n\nexport interface RequestLoggerOptions {\n /** Callback invoked by emitNow() for manual fan-out. */\n onEmit?: (snapshot: RequestLogSnapshot) => void | Promise<void>;\n}\n\nfunction resolveContext(ctx?: TraceContext): TraceContext {\n if (ctx) return ctx;\n\n const stored = requestContextStore.getStore();\n if (stored) return stored;\n\n const span = otelTrace.getActiveSpan();\n if (!span) {\n throw new Error(\n '[autotel] getRequestLogger() requires an active span or runWithRequestContext(). Wrap your handler with trace() or use runWithRequestContext().',\n );\n }\n return createTraceContext(span);\n}\n\nexport function getRequestLogger(\n ctx?: TraceContext,\n options?: RequestLoggerOptions,\n): RequestLogger {\n const activeContext = resolveContext(ctx);\n let contextState: Record<string, unknown> = {};\n\n const addLogEvent = (\n level: 'info' | 'warn' | 'error',\n message: string,\n fields?: Record<string, unknown>,\n ) => {\n const attrs = fields ? flattenToAttributes(fields) : undefined;\n activeContext.addEvent(`log.${level}`, {\n message,\n ...attrs,\n });\n };\n\n return {\n set(fields: Record<string, unknown>) {\n contextState = {\n ...contextState,\n ...fields,\n };\n activeContext.setAttributes(flattenToAttributes(fields));\n },\n\n info(message: string, fields?: Record<string, unknown>) {\n addLogEvent('info', message, fields);\n if (fields) {\n contextState = {\n ...contextState,\n ...fields,\n };\n activeContext.setAttributes(flattenToAttributes(fields));\n }\n },\n\n warn(message: string, fields?: Record<string, unknown>) {\n addLogEvent('warn', message, fields);\n activeContext.setAttribute('autotel.log.level', 'warn');\n if (fields) {\n contextState = {\n ...contextState,\n ...fields,\n };\n activeContext.setAttributes(flattenToAttributes(fields));\n }\n },\n\n error(error: Error | string, fields?: Record<string, unknown>) {\n const err = typeof error === 'string' ? new Error(error) : error;\n recordStructuredError(activeContext, err);\n addLogEvent('error', err.message, fields);\n\n if (fields) {\n contextState = {\n ...contextState,\n ...fields,\n };\n activeContext.setAttributes(flattenToAttributes(fields));\n }\n activeContext.setAttribute('autotel.log.level', 'error');\n },\n\n getContext() {\n return { ...contextState };\n },\n\n emitNow(overrides?: Record<string, unknown>): RequestLogSnapshot {\n const mergedContext = {\n ...contextState,\n ...(overrides ?? {}),\n };\n const flattened = flattenToAttributes(mergedContext);\n activeContext.setAttributes(flattened);\n\n const snapshot: RequestLogSnapshot = {\n timestamp: new Date().toISOString(),\n traceId: activeContext.traceId,\n spanId: activeContext.spanId,\n correlationId: activeContext.correlationId,\n context: mergedContext,\n };\n\n activeContext.addEvent('log.emit.manual', {\n ...flattened,\n });\n\n if (options?.onEmit) {\n Promise.resolve(options.onEmit(snapshot)).catch((error) => {\n console.warn('[autotel] request logger onEmit failed:', error);\n });\n }\n\n return snapshot;\n },\n };\n}\n"]}
|
|
@@ -11,6 +11,7 @@ import { LogRecordProcessor } from '@opentelemetry/sdk-logs';
|
|
|
11
11
|
import { SpanFilterPredicate } from './filtering-span-processor.cjs';
|
|
12
12
|
import { SpanNameNormalizerConfig } from './span-name-normalizer.cjs';
|
|
13
13
|
import { AttributeRedactorConfig, AttributeRedactorPreset } from './attribute-redacting-processor.cjs';
|
|
14
|
+
import { CanonicalLogLineOptions } from './processors.cjs';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Input validation for events events and attributes
|
|
@@ -941,6 +942,23 @@ interface AutotelConfig {
|
|
|
941
942
|
messageFormat?: (span: _opentelemetry_sdk_trace_base.ReadableSpan) => string;
|
|
942
943
|
/** Whether to include resource attributes (default: true) */
|
|
943
944
|
includeResourceAttributes?: boolean;
|
|
945
|
+
/** Predicate to decide whether to emit (runs after event is built). */
|
|
946
|
+
shouldEmit?: CanonicalLogLineOptions['shouldEmit'];
|
|
947
|
+
/**
|
|
948
|
+
* Declarative tail sampling conditions (OR logic).
|
|
949
|
+
* Ignored when `shouldEmit` is provided.
|
|
950
|
+
* @example keep: [{ status: 500 }, { durationMs: 1000 }]
|
|
951
|
+
*/
|
|
952
|
+
keep?: CanonicalLogLineOptions['keep'];
|
|
953
|
+
/** Callback invoked after emit for custom fan-out. */
|
|
954
|
+
drain?: CanonicalLogLineOptions['drain'];
|
|
955
|
+
/** Handler for drain failures. */
|
|
956
|
+
onDrainError?: CanonicalLogLineOptions['onDrainError'];
|
|
957
|
+
/**
|
|
958
|
+
* Pretty-print canonical log lines to console.
|
|
959
|
+
* Defaults to true when NODE_ENV is 'development'.
|
|
960
|
+
*/
|
|
961
|
+
pretty?: boolean;
|
|
944
962
|
};
|
|
945
963
|
}
|
|
946
964
|
/**
|
|
@@ -11,6 +11,7 @@ import { LogRecordProcessor } from '@opentelemetry/sdk-logs';
|
|
|
11
11
|
import { SpanFilterPredicate } from './filtering-span-processor.js';
|
|
12
12
|
import { SpanNameNormalizerConfig } from './span-name-normalizer.js';
|
|
13
13
|
import { AttributeRedactorConfig, AttributeRedactorPreset } from './attribute-redacting-processor.js';
|
|
14
|
+
import { CanonicalLogLineOptions } from './processors.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Input validation for events events and attributes
|
|
@@ -941,6 +942,23 @@ interface AutotelConfig {
|
|
|
941
942
|
messageFormat?: (span: _opentelemetry_sdk_trace_base.ReadableSpan) => string;
|
|
942
943
|
/** Whether to include resource attributes (default: true) */
|
|
943
944
|
includeResourceAttributes?: boolean;
|
|
945
|
+
/** Predicate to decide whether to emit (runs after event is built). */
|
|
946
|
+
shouldEmit?: CanonicalLogLineOptions['shouldEmit'];
|
|
947
|
+
/**
|
|
948
|
+
* Declarative tail sampling conditions (OR logic).
|
|
949
|
+
* Ignored when `shouldEmit` is provided.
|
|
950
|
+
* @example keep: [{ status: 500 }, { durationMs: 1000 }]
|
|
951
|
+
*/
|
|
952
|
+
keep?: CanonicalLogLineOptions['keep'];
|
|
953
|
+
/** Callback invoked after emit for custom fan-out. */
|
|
954
|
+
drain?: CanonicalLogLineOptions['drain'];
|
|
955
|
+
/** Handler for drain failures. */
|
|
956
|
+
onDrainError?: CanonicalLogLineOptions['onDrainError'];
|
|
957
|
+
/**
|
|
958
|
+
* Pretty-print canonical log lines to console.
|
|
959
|
+
* Defaults to true when NODE_ENV is 'development'.
|
|
960
|
+
*/
|
|
961
|
+
pretty?: boolean;
|
|
944
962
|
};
|
|
945
963
|
}
|
|
946
964
|
/**
|
package/dist/instrumentation.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkHSEIUH7F_cjs = require('./chunk-HSEIUH7F.cjs');
|
|
4
4
|
require('./chunk-6YIDHH2S.cjs');
|
|
5
5
|
var chunkGVLK7YUU_cjs = require('./chunk-GVLK7YUU.cjs');
|
|
6
6
|
require('./chunk-ZNMBW67B.cjs');
|
|
7
7
|
require('./chunk-IOYFAFHJ.cjs');
|
|
8
8
|
require('./chunk-ELW34S4C.cjs');
|
|
9
9
|
require('./chunk-CU6IDACR.cjs');
|
|
10
|
-
require('./chunk-
|
|
10
|
+
require('./chunk-6S5RUKU3.cjs');
|
|
11
11
|
var chunkYS6C2YJE_cjs = require('./chunk-YS6C2YJE.cjs');
|
|
12
12
|
require('./chunk-BGVKKL2N.cjs');
|
|
13
13
|
require('./chunk-AZ24DJAG.cjs');
|
|
@@ -53,17 +53,17 @@ var shutdownHandlerRegistered = false;
|
|
|
53
53
|
async function shutdownInstrumentation(sdk) {
|
|
54
54
|
const sdkToShutdown = sdk || currentSDK;
|
|
55
55
|
if (!sdkToShutdown) {
|
|
56
|
-
|
|
56
|
+
chunkHSEIUH7F_cjs.getLogger().warn({}, "No SDK to shutdown");
|
|
57
57
|
return;
|
|
58
58
|
}
|
|
59
59
|
try {
|
|
60
60
|
await sdkToShutdown.shutdown();
|
|
61
|
-
|
|
61
|
+
chunkHSEIUH7F_cjs.getLogger().info({}, "OpenTelemetry terminated successfully");
|
|
62
62
|
if (sdkToShutdown === currentSDK) {
|
|
63
63
|
currentSDK = null;
|
|
64
64
|
}
|
|
65
65
|
} catch (error) {
|
|
66
|
-
|
|
66
|
+
chunkHSEIUH7F_cjs.getLogger().error(
|
|
67
67
|
{
|
|
68
68
|
err: error instanceof Error ? error : void 0
|
|
69
69
|
},
|
|
@@ -74,7 +74,7 @@ async function shutdownInstrumentation(sdk) {
|
|
|
74
74
|
}
|
|
75
75
|
async function initInstrumentation(config) {
|
|
76
76
|
if (currentSDK) {
|
|
77
|
-
|
|
77
|
+
chunkHSEIUH7F_cjs.getLogger().info(
|
|
78
78
|
{},
|
|
79
79
|
"Shutting down existing OpenTelemetry SDK before reinitializing..."
|
|
80
80
|
);
|
|
@@ -161,9 +161,9 @@ async function initInstrumentation(config) {
|
|
|
161
161
|
});
|
|
162
162
|
try {
|
|
163
163
|
await sdk.start();
|
|
164
|
-
|
|
164
|
+
chunkHSEIUH7F_cjs.getLogger().info({}, "OpenTelemetry instrumentation started successfully");
|
|
165
165
|
} catch (error) {
|
|
166
|
-
|
|
166
|
+
chunkHSEIUH7F_cjs.getLogger().error(
|
|
167
167
|
{
|
|
168
168
|
err: error instanceof Error ? error : void 0
|
|
169
169
|
},
|
|
@@ -178,7 +178,7 @@ async function initInstrumentation(config) {
|
|
|
178
178
|
shutdownInstrumentation().then(() => {
|
|
179
179
|
process.exit(0);
|
|
180
180
|
}).catch((error) => {
|
|
181
|
-
|
|
181
|
+
chunkHSEIUH7F_cjs.getLogger().error(
|
|
182
182
|
{
|
|
183
183
|
err: error instanceof Error ? error : void 0
|
|
184
184
|
},
|
package/dist/instrumentation.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { getLogger } from './chunk-
|
|
1
|
+
import { getLogger } from './chunk-724XLWR3.js';
|
|
2
2
|
import './chunk-YTGF4L2C.js';
|
|
3
3
|
import { TailSamplingSpanProcessor } from './chunk-X4RMFFMR.js';
|
|
4
4
|
import './chunk-WGWSHJ2N.js';
|
|
5
5
|
import './chunk-GYR5K654.js';
|
|
6
6
|
import './chunk-SNINLBEE.js';
|
|
7
7
|
import './chunk-6UQRVUN3.js';
|
|
8
|
-
import './chunk-
|
|
8
|
+
import './chunk-3QXBFGKP.js';
|
|
9
9
|
import { requireModule } from './chunk-33WTKH7X.js';
|
|
10
10
|
import './chunk-XND7WBVX.js';
|
|
11
11
|
import './chunk-B33XPEKY.js';
|
package/dist/messaging.cjs
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
3
|
+
var chunk4RZ4JUBY_cjs = require('./chunk-4RZ4JUBY.cjs');
|
|
4
|
+
require('./chunk-3ZFDJJWZ.cjs');
|
|
5
5
|
require('./chunk-W4EUTSB2.cjs');
|
|
6
6
|
require('./chunk-GML3FBOT.cjs');
|
|
7
7
|
require('./chunk-D5LMF53P.cjs');
|
|
8
8
|
require('./chunk-XRKAL7WJ.cjs');
|
|
9
|
-
require('./chunk-
|
|
9
|
+
require('./chunk-HSEIUH7F.cjs');
|
|
10
10
|
require('./chunk-6YIDHH2S.cjs');
|
|
11
11
|
require('./chunk-GVLK7YUU.cjs');
|
|
12
12
|
require('./chunk-ZNMBW67B.cjs');
|
|
13
13
|
require('./chunk-IOYFAFHJ.cjs');
|
|
14
14
|
require('./chunk-ELW34S4C.cjs');
|
|
15
15
|
require('./chunk-CU6IDACR.cjs');
|
|
16
|
-
require('./chunk-
|
|
16
|
+
require('./chunk-6S5RUKU3.cjs');
|
|
17
17
|
require('./chunk-YS6C2YJE.cjs');
|
|
18
18
|
require('./chunk-BGVKKL2N.cjs');
|
|
19
19
|
require('./chunk-AZ24DJAG.cjs');
|
|
@@ -25,15 +25,15 @@ require('./chunk-JEQ2X3Z6.cjs');
|
|
|
25
25
|
|
|
26
26
|
Object.defineProperty(exports, "clearOrderingState", {
|
|
27
27
|
enumerable: true,
|
|
28
|
-
get: function () { return
|
|
28
|
+
get: function () { return chunk4RZ4JUBY_cjs.clearOrderingState; }
|
|
29
29
|
});
|
|
30
30
|
Object.defineProperty(exports, "traceConsumer", {
|
|
31
31
|
enumerable: true,
|
|
32
|
-
get: function () { return
|
|
32
|
+
get: function () { return chunk4RZ4JUBY_cjs.traceConsumer; }
|
|
33
33
|
});
|
|
34
34
|
Object.defineProperty(exports, "traceProducer", {
|
|
35
35
|
enumerable: true,
|
|
36
|
-
get: function () { return
|
|
36
|
+
get: function () { return chunk4RZ4JUBY_cjs.traceProducer; }
|
|
37
37
|
});
|
|
38
38
|
//# sourceMappingURL=messaging.cjs.map
|
|
39
39
|
//# sourceMappingURL=messaging.cjs.map
|
package/dist/messaging.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
export { clearOrderingState, traceConsumer, traceProducer } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { clearOrderingState, traceConsumer, traceProducer } from './chunk-3AMR5XLZ.js';
|
|
2
|
+
import './chunk-GY4CRZSV.js';
|
|
3
3
|
import './chunk-SR35DG5A.js';
|
|
4
4
|
import './chunk-B3ZHLLMP.js';
|
|
5
5
|
import './chunk-WD4RP6IV.js';
|
|
6
6
|
import './chunk-USSL3D6L.js';
|
|
7
|
-
import './chunk-
|
|
7
|
+
import './chunk-724XLWR3.js';
|
|
8
8
|
import './chunk-YTGF4L2C.js';
|
|
9
9
|
import './chunk-X4RMFFMR.js';
|
|
10
10
|
import './chunk-WGWSHJ2N.js';
|
|
11
11
|
import './chunk-GYR5K654.js';
|
|
12
12
|
import './chunk-SNINLBEE.js';
|
|
13
13
|
import './chunk-6UQRVUN3.js';
|
|
14
|
-
import './chunk-
|
|
14
|
+
import './chunk-3QXBFGKP.js';
|
|
15
15
|
import './chunk-33WTKH7X.js';
|
|
16
16
|
import './chunk-XND7WBVX.js';
|
|
17
17
|
import './chunk-B33XPEKY.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkT4B5LB6E_cjs = require('./chunk-T4B5LB6E.cjs');
|
|
4
|
+
require('./chunk-JEQ2X3Z6.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "parseError", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunkT4B5LB6E_cjs.parseError; }
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=parse-error.cjs.map
|
|
13
|
+
//# sourceMappingURL=parse-error.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"parse-error.cjs"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface ParsedError {
|
|
2
|
+
message: string;
|
|
3
|
+
status: number;
|
|
4
|
+
why?: string;
|
|
5
|
+
fix?: string;
|
|
6
|
+
link?: string;
|
|
7
|
+
code?: string | number;
|
|
8
|
+
details?: Record<string, unknown>;
|
|
9
|
+
raw: unknown;
|
|
10
|
+
}
|
|
11
|
+
declare function parseError(error: unknown): ParsedError;
|
|
12
|
+
|
|
13
|
+
export { type ParsedError, parseError };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface ParsedError {
|
|
2
|
+
message: string;
|
|
3
|
+
status: number;
|
|
4
|
+
why?: string;
|
|
5
|
+
fix?: string;
|
|
6
|
+
link?: string;
|
|
7
|
+
code?: string | number;
|
|
8
|
+
details?: Record<string, unknown>;
|
|
9
|
+
raw: unknown;
|
|
10
|
+
}
|
|
11
|
+
declare function parseError(error: unknown): ParsedError;
|
|
12
|
+
|
|
13
|
+
export { type ParsedError, parseError };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"parse-error.js"}
|
package/dist/processors.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk6S5RUKU3_cjs = require('./chunk-6S5RUKU3.cjs');
|
|
4
4
|
require('./chunk-JEQ2X3Z6.cjs');
|
|
5
5
|
var sdkTraceBase = require('@opentelemetry/sdk-trace-base');
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ var sdkTraceBase = require('@opentelemetry/sdk-trace-base');
|
|
|
8
8
|
|
|
9
9
|
Object.defineProperty(exports, "CanonicalLogLineProcessor", {
|
|
10
10
|
enumerable: true,
|
|
11
|
-
get: function () { return
|
|
11
|
+
get: function () { return chunk6S5RUKU3_cjs.CanonicalLogLineProcessor; }
|
|
12
12
|
});
|
|
13
13
|
Object.defineProperty(exports, "BatchSpanProcessor", {
|
|
14
14
|
enumerable: true,
|
package/dist/processors.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
2
2
|
export { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
3
3
|
import { AttributeValue } from '@opentelemetry/api';
|
|
4
4
|
import { Logger } from './logger.cjs';
|
|
@@ -32,6 +32,20 @@ import 'pino';
|
|
|
32
32
|
* Function to redact sensitive attribute values
|
|
33
33
|
*/
|
|
34
34
|
type AttributeRedactorFn = (key: string, value: AttributeValue) => AttributeValue;
|
|
35
|
+
interface CanonicalLogLineEvent {
|
|
36
|
+
span: ReadableSpan;
|
|
37
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
38
|
+
message: string;
|
|
39
|
+
event: Record<string, unknown>;
|
|
40
|
+
}
|
|
41
|
+
interface KeepCondition {
|
|
42
|
+
/** Keep events where HTTP status >= this value. */
|
|
43
|
+
status?: number;
|
|
44
|
+
/** Keep events where duration_ms >= this value. */
|
|
45
|
+
durationMs?: number;
|
|
46
|
+
/** Keep events matching this path pattern (simple prefix match). */
|
|
47
|
+
path?: string;
|
|
48
|
+
}
|
|
35
49
|
interface CanonicalLogLineOptions {
|
|
36
50
|
/** Logger to use for emitting canonical log lines (defaults to OTel Logs API) */
|
|
37
51
|
logger?: Logger;
|
|
@@ -49,6 +63,25 @@ interface CanonicalLogLineOptions {
|
|
|
49
63
|
* matching the behavior of attributeRedactor in init().
|
|
50
64
|
*/
|
|
51
65
|
attributeRedactor?: AttributeRedactorFn;
|
|
66
|
+
/** Predicate to decide whether to emit (runs after event is built). */
|
|
67
|
+
shouldEmit?: (ctx: CanonicalLogLineEvent) => boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Declarative tail sampling conditions (OR logic). If any condition matches,
|
|
70
|
+
* the event is kept. Ignored when `shouldEmit` is provided.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* keep: [{ status: 500 }, { durationMs: 1000 }]
|
|
74
|
+
*/
|
|
75
|
+
keep?: KeepCondition[];
|
|
76
|
+
/** Callback invoked after emit for custom fan-out. */
|
|
77
|
+
drain?: (ctx: CanonicalLogLineEvent) => void | Promise<void>;
|
|
78
|
+
/** Handler for drain failures. */
|
|
79
|
+
onDrainError?: (error: unknown, ctx: CanonicalLogLineEvent) => void;
|
|
80
|
+
/**
|
|
81
|
+
* Pretty-print canonical log lines to console in a tree format.
|
|
82
|
+
* Defaults to true when NODE_ENV is 'development'.
|
|
83
|
+
*/
|
|
84
|
+
pretty?: boolean;
|
|
52
85
|
}
|
|
53
86
|
/**
|
|
54
87
|
* Span processor that automatically emits spans as canonical log lines
|
|
@@ -114,20 +147,23 @@ declare class CanonicalLogLineProcessor implements SpanProcessor {
|
|
|
114
147
|
private messageFormat;
|
|
115
148
|
private includeResourceAttributes;
|
|
116
149
|
private attributeRedactor?;
|
|
150
|
+
private shouldEmit?;
|
|
151
|
+
private drain?;
|
|
152
|
+
private onDrainError?;
|
|
153
|
+
private pretty;
|
|
117
154
|
private getOTelLogger;
|
|
118
155
|
constructor(options?: CanonicalLogLineOptions);
|
|
156
|
+
private buildKeepPredicate;
|
|
119
157
|
onStart(): void;
|
|
120
158
|
onEnd(span: ReadableSpan): void;
|
|
121
159
|
private buildCanonicalLogLine;
|
|
122
|
-
/**
|
|
123
|
-
* Apply attribute redaction if a redactor is configured
|
|
124
|
-
*/
|
|
125
160
|
private redactAttributes;
|
|
126
161
|
private emitViaLogger;
|
|
127
162
|
private emitViaOTel;
|
|
128
163
|
private getLogLevel;
|
|
129
164
|
private shouldLog;
|
|
130
165
|
private getSeverityNumber;
|
|
166
|
+
private reportInternalWarning;
|
|
131
167
|
forceFlush(): Promise<void>;
|
|
132
168
|
shutdown(): Promise<void>;
|
|
133
169
|
}
|
package/dist/processors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
2
2
|
export { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
3
3
|
import { AttributeValue } from '@opentelemetry/api';
|
|
4
4
|
import { Logger } from './logger.js';
|
|
@@ -32,6 +32,20 @@ import 'pino';
|
|
|
32
32
|
* Function to redact sensitive attribute values
|
|
33
33
|
*/
|
|
34
34
|
type AttributeRedactorFn = (key: string, value: AttributeValue) => AttributeValue;
|
|
35
|
+
interface CanonicalLogLineEvent {
|
|
36
|
+
span: ReadableSpan;
|
|
37
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
38
|
+
message: string;
|
|
39
|
+
event: Record<string, unknown>;
|
|
40
|
+
}
|
|
41
|
+
interface KeepCondition {
|
|
42
|
+
/** Keep events where HTTP status >= this value. */
|
|
43
|
+
status?: number;
|
|
44
|
+
/** Keep events where duration_ms >= this value. */
|
|
45
|
+
durationMs?: number;
|
|
46
|
+
/** Keep events matching this path pattern (simple prefix match). */
|
|
47
|
+
path?: string;
|
|
48
|
+
}
|
|
35
49
|
interface CanonicalLogLineOptions {
|
|
36
50
|
/** Logger to use for emitting canonical log lines (defaults to OTel Logs API) */
|
|
37
51
|
logger?: Logger;
|
|
@@ -49,6 +63,25 @@ interface CanonicalLogLineOptions {
|
|
|
49
63
|
* matching the behavior of attributeRedactor in init().
|
|
50
64
|
*/
|
|
51
65
|
attributeRedactor?: AttributeRedactorFn;
|
|
66
|
+
/** Predicate to decide whether to emit (runs after event is built). */
|
|
67
|
+
shouldEmit?: (ctx: CanonicalLogLineEvent) => boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Declarative tail sampling conditions (OR logic). If any condition matches,
|
|
70
|
+
* the event is kept. Ignored when `shouldEmit` is provided.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* keep: [{ status: 500 }, { durationMs: 1000 }]
|
|
74
|
+
*/
|
|
75
|
+
keep?: KeepCondition[];
|
|
76
|
+
/** Callback invoked after emit for custom fan-out. */
|
|
77
|
+
drain?: (ctx: CanonicalLogLineEvent) => void | Promise<void>;
|
|
78
|
+
/** Handler for drain failures. */
|
|
79
|
+
onDrainError?: (error: unknown, ctx: CanonicalLogLineEvent) => void;
|
|
80
|
+
/**
|
|
81
|
+
* Pretty-print canonical log lines to console in a tree format.
|
|
82
|
+
* Defaults to true when NODE_ENV is 'development'.
|
|
83
|
+
*/
|
|
84
|
+
pretty?: boolean;
|
|
52
85
|
}
|
|
53
86
|
/**
|
|
54
87
|
* Span processor that automatically emits spans as canonical log lines
|
|
@@ -114,20 +147,23 @@ declare class CanonicalLogLineProcessor implements SpanProcessor {
|
|
|
114
147
|
private messageFormat;
|
|
115
148
|
private includeResourceAttributes;
|
|
116
149
|
private attributeRedactor?;
|
|
150
|
+
private shouldEmit?;
|
|
151
|
+
private drain?;
|
|
152
|
+
private onDrainError?;
|
|
153
|
+
private pretty;
|
|
117
154
|
private getOTelLogger;
|
|
118
155
|
constructor(options?: CanonicalLogLineOptions);
|
|
156
|
+
private buildKeepPredicate;
|
|
119
157
|
onStart(): void;
|
|
120
158
|
onEnd(span: ReadableSpan): void;
|
|
121
159
|
private buildCanonicalLogLine;
|
|
122
|
-
/**
|
|
123
|
-
* Apply attribute redaction if a redactor is configured
|
|
124
|
-
*/
|
|
125
160
|
private redactAttributes;
|
|
126
161
|
private emitViaLogger;
|
|
127
162
|
private emitViaOTel;
|
|
128
163
|
private getLogLevel;
|
|
129
164
|
private shouldLog;
|
|
130
165
|
private getSeverityNumber;
|
|
166
|
+
private reportInternalWarning;
|
|
131
167
|
forceFlush(): Promise<void>;
|
|
132
168
|
shutdown(): Promise<void>;
|
|
133
169
|
}
|
package/dist/processors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { CanonicalLogLineProcessor } from './chunk-
|
|
1
|
+
export { CanonicalLogLineProcessor } from './chunk-3QXBFGKP.js';
|
|
2
2
|
import './chunk-DGUM43GV.js';
|
|
3
3
|
export { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
4
4
|
//# sourceMappingURL=processors.js.map
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
3
|
+
var chunkAXFWWJF3_cjs = require('./chunk-AXFWWJF3.cjs');
|
|
4
|
+
require('./chunk-3ZFDJJWZ.cjs');
|
|
5
5
|
require('./chunk-W4EUTSB2.cjs');
|
|
6
6
|
require('./chunk-GML3FBOT.cjs');
|
|
7
7
|
require('./chunk-D5LMF53P.cjs');
|
|
8
8
|
require('./chunk-XRKAL7WJ.cjs');
|
|
9
|
-
require('./chunk-
|
|
9
|
+
require('./chunk-HSEIUH7F.cjs');
|
|
10
10
|
require('./chunk-6YIDHH2S.cjs');
|
|
11
11
|
require('./chunk-GVLK7YUU.cjs');
|
|
12
12
|
require('./chunk-ZNMBW67B.cjs');
|
|
13
13
|
require('./chunk-IOYFAFHJ.cjs');
|
|
14
14
|
require('./chunk-ELW34S4C.cjs');
|
|
15
15
|
require('./chunk-CU6IDACR.cjs');
|
|
16
|
-
require('./chunk-
|
|
16
|
+
require('./chunk-6S5RUKU3.cjs');
|
|
17
17
|
require('./chunk-YS6C2YJE.cjs');
|
|
18
18
|
require('./chunk-BGVKKL2N.cjs');
|
|
19
19
|
require('./chunk-AZ24DJAG.cjs');
|
|
@@ -25,19 +25,19 @@ require('./chunk-JEQ2X3Z6.cjs');
|
|
|
25
25
|
|
|
26
26
|
Object.defineProperty(exports, "traceDB", {
|
|
27
27
|
enumerable: true,
|
|
28
|
-
get: function () { return
|
|
28
|
+
get: function () { return chunkAXFWWJF3_cjs.traceDB; }
|
|
29
29
|
});
|
|
30
30
|
Object.defineProperty(exports, "traceHTTP", {
|
|
31
31
|
enumerable: true,
|
|
32
|
-
get: function () { return
|
|
32
|
+
get: function () { return chunkAXFWWJF3_cjs.traceHTTP; }
|
|
33
33
|
});
|
|
34
34
|
Object.defineProperty(exports, "traceLLM", {
|
|
35
35
|
enumerable: true,
|
|
36
|
-
get: function () { return
|
|
36
|
+
get: function () { return chunkAXFWWJF3_cjs.traceLLM; }
|
|
37
37
|
});
|
|
38
38
|
Object.defineProperty(exports, "traceMessaging", {
|
|
39
39
|
enumerable: true,
|
|
40
|
-
get: function () { return
|
|
40
|
+
get: function () { return chunkAXFWWJF3_cjs.traceMessaging; }
|
|
41
41
|
});
|
|
42
42
|
//# sourceMappingURL=semantic-helpers.cjs.map
|
|
43
43
|
//# sourceMappingURL=semantic-helpers.cjs.map
|
package/dist/semantic-helpers.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
export { traceDB, traceHTTP, traceLLM, traceMessaging } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { traceDB, traceHTTP, traceLLM, traceMessaging } from './chunk-IPKXURBW.js';
|
|
2
|
+
import './chunk-GY4CRZSV.js';
|
|
3
3
|
import './chunk-SR35DG5A.js';
|
|
4
4
|
import './chunk-B3ZHLLMP.js';
|
|
5
5
|
import './chunk-WD4RP6IV.js';
|
|
6
6
|
import './chunk-USSL3D6L.js';
|
|
7
|
-
import './chunk-
|
|
7
|
+
import './chunk-724XLWR3.js';
|
|
8
8
|
import './chunk-YTGF4L2C.js';
|
|
9
9
|
import './chunk-X4RMFFMR.js';
|
|
10
10
|
import './chunk-WGWSHJ2N.js';
|
|
11
11
|
import './chunk-GYR5K654.js';
|
|
12
12
|
import './chunk-SNINLBEE.js';
|
|
13
13
|
import './chunk-6UQRVUN3.js';
|
|
14
|
-
import './chunk-
|
|
14
|
+
import './chunk-3QXBFGKP.js';
|
|
15
15
|
import './chunk-33WTKH7X.js';
|
|
16
16
|
import './chunk-XND7WBVX.js';
|
|
17
17
|
import './chunk-B33XPEKY.js';
|
package/dist/webhook.cjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk3ZFDJJWZ_cjs = require('./chunk-3ZFDJJWZ.cjs');
|
|
4
4
|
require('./chunk-W4EUTSB2.cjs');
|
|
5
5
|
require('./chunk-GML3FBOT.cjs');
|
|
6
6
|
require('./chunk-D5LMF53P.cjs');
|
|
7
7
|
require('./chunk-XRKAL7WJ.cjs');
|
|
8
|
-
require('./chunk-
|
|
8
|
+
require('./chunk-HSEIUH7F.cjs');
|
|
9
9
|
require('./chunk-6YIDHH2S.cjs');
|
|
10
10
|
require('./chunk-GVLK7YUU.cjs');
|
|
11
11
|
require('./chunk-ZNMBW67B.cjs');
|
|
12
12
|
require('./chunk-IOYFAFHJ.cjs');
|
|
13
13
|
require('./chunk-ELW34S4C.cjs');
|
|
14
14
|
require('./chunk-CU6IDACR.cjs');
|
|
15
|
-
require('./chunk-
|
|
15
|
+
require('./chunk-6S5RUKU3.cjs');
|
|
16
16
|
require('./chunk-YS6C2YJE.cjs');
|
|
17
17
|
require('./chunk-BGVKKL2N.cjs');
|
|
18
18
|
require('./chunk-AZ24DJAG.cjs');
|
|
@@ -148,7 +148,7 @@ function createParkingLot(config) {
|
|
|
148
148
|
},
|
|
149
149
|
traceCallback(callbackConfig) {
|
|
150
150
|
return (fnFactory) => {
|
|
151
|
-
return
|
|
151
|
+
return chunk3ZFDJJWZ_cjs.trace(
|
|
152
152
|
{
|
|
153
153
|
name: callbackConfig.name,
|
|
154
154
|
spanKind: api.SpanKind.SERVER
|