Sign In

@ariestools/telemetry

Package Overview
Dependencies
Maintainers
3
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ariestools/telemetry - npm Package Compare versions

Comparing version
8.1.1
to
8.1.2
+1
-1
dist/neutral/index.mjs

@@ -27,3 +27,3 @@ // src/span.ts

} else {
logger?.log(`Function [${name}] execution exceeded 10x budget: ${duration}ms > ${budget}ms`);
logger?.log(`Function [${name}] execution exceeded budget: ${duration}ms > ${budget}ms`);
}

@@ -30,0 +30,0 @@ }

{
"version": 3,
"sources": ["../../src/span.ts", "../../src/timeBudget.ts", "../../src/XyConsoleSpanExporter.ts"],
"sourcesContent": ["import type {\n Context,\n Tracer,\n TracerProvider,\n} from '@opentelemetry/api'\nimport {\n context, propagation, ROOT_CONTEXT, SpanStatusCode, trace as TRACE_API,\n} from '@opentelemetry/api'\n\nimport type { TelemetryLogger } from './logger.ts'\nimport { timeBudget } from './timeBudget.ts'\n\ndeclare const console: TelemetryLogger\n\nfunction isDefined<T>(value: T | undefined): value is T {\n return value !== undefined\n}\n\n/** Configuration options for span creation and execution. */\nexport interface SpanConfig {\n /** Optional logger for time budget warnings. Falls back to console if not provided. */\n logger?: TelemetryLogger | null\n /** Maximum allowed execution time in milliseconds before logging a warning. */\n timeBudgetLimit?: number\n /** OpenTelemetry tracer to use. Defaults to a tracer named after the span. */\n tracer?: Tracer\n}\n\n/**\n * Creates a new OpenTelemetry context that preserves baggage and custom keys but has no active span.\n * @param activeCtx - The context to clone from.\n * @param configKeys - Additional context keys to copy.\n * @returns A new context with baggage but no parent span.\n */\nexport function cloneContextWithoutSpan(activeCtx: Context, configKeys: symbol[] = []): Context {\n // Start from root to ensure no span is propagated\n let newCtx = ROOT_CONTEXT\n\n // Copy baggage\n const baggage = propagation.getBaggage(activeCtx)\n if (baggage) {\n newCtx = propagation.setBaggage(newCtx, baggage)\n }\n\n // Copy custom config keys\n for (const key of configKeys) {\n const value = activeCtx.getValue(key)\n if (value !== undefined) {\n newCtx = newCtx.setValue(key, value)\n }\n }\n\n return newCtx\n}\n\n/**\n * Executes a synchronous function within an OpenTelemetry span, recording status and exceptions.\n * @param name - The span name.\n * @param fn - The function to execute.\n * @param tracer - Optional tracer to use.\n * @returns The return value of `fn`.\n */\nexport function span<T>(name: string, fn: () => T, traceProvider: TracerProvider = TRACE_API): T {\n const activeTracer = traceProvider.getTracer(name)\n if (isDefined(activeTracer)) {\n const span = activeTracer.startSpan(name)\n return context.with(TRACE_API.setSpan(context.active(), span), () => {\n try {\n const result = fn()\n span.setStatus({ code: SpanStatusCode.OK })\n return result\n } catch (ex) {\n const error = ex as Error\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n throw ex\n } finally {\n span.end()\n }\n })\n }\n return fn()\n}\n\n/**\n * Executes a synchronous function within a new root span that has no parent, even if a span is already active.\n * @param name - The span name.\n * @param fn - The function to execute.\n * @param tracer - Optional tracer to use.\n * @returns The return value of `fn`.\n */\nexport function spanRoot<T>(name: string, fn: () => T, tracer?: Tracer): T {\n const activeTracer = tracer ?? TRACE_API.getTracer(name)\n if (isDefined(activeTracer)) {\n // Get current active context for configuration\n const activeContext = context.active()\n\n // Create a new context with no active span\n const noSpanContext = cloneContextWithoutSpan(activeContext)\n\n // Create a new span in the context without an active span\n const span = activeTracer.startSpan(name, {}, noSpanContext)\n\n // Use the active context but replace its span with our new root span\n return context.with(TRACE_API.setSpan(noSpanContext, span), () => {\n try {\n const result = fn()\n span.setStatus({ code: SpanStatusCode.OK })\n return result\n } catch (ex) {\n const error = ex as Error\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n throw ex\n } finally {\n span.end()\n }\n })\n }\n return fn()\n}\n\n/**\n * Executes an async function within an OpenTelemetry span, with optional time budget monitoring.\n * @param name - The span name.\n * @param fn - The async function to execute.\n * @param config - Optional span configuration (tracer, logger, time budget).\n * @returns The resolved value of `fn`.\n */\nexport async function spanAsync<T>(\n name: string,\n fn: () => Promise<T>,\n {\n timeBudgetLimit, logger, tracer,\n }: SpanConfig = {},\n): Promise<T> {\n const activeTracer = tracer ?? TRACE_API.getTracer(name)\n const funcToRun = isDefined(timeBudgetLimit) ? () => timeBudget(name, logger ?? console, fn, timeBudgetLimit) : fn\n if (isDefined(activeTracer)) {\n const span = activeTracer.startSpan(name)\n return await context.with(TRACE_API.setSpan(context.active(), span), async () => {\n try {\n const result = await funcToRun()\n span.setStatus({ code: SpanStatusCode.OK })\n return result\n } catch (ex) {\n const error = ex as Error\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n throw ex\n } finally {\n span.end()\n }\n })\n }\n return await funcToRun()\n}\n\n/**\n * Executes an async function within a new root span (no parent), with optional time budget monitoring.\n * @param name - The span name.\n * @param fn - The async function to execute.\n * @param config - Optional span configuration (tracer, logger, time budget).\n * @returns The resolved value of `fn`.\n */\nexport async function spanRootAsync<T>(\n name: string,\n fn: () => Promise<T>,\n {\n timeBudgetLimit, logger, tracer,\n }: SpanConfig = {},\n): Promise<T> {\n const funcToRun = isDefined(timeBudgetLimit) ? () => timeBudget(name, logger ?? console, fn, timeBudgetLimit) : fn\n const activeTracer = tracer ?? TRACE_API.getTracer(name)\n if (isDefined(activeTracer)) {\n const activeContext = context.active()\n\n const noSpanContext = cloneContextWithoutSpan(activeContext)\n\n // Create a new span in the context without an active span\n const span = activeTracer.startSpan(name, {}, noSpanContext)\n\n // Use the active context but replace its span with our new root span\n return await context.with(TRACE_API.setSpan(noSpanContext, span), async () => {\n try {\n const result = await funcToRun()\n span.setStatus({ code: SpanStatusCode.OK })\n return result\n } catch (ex) {\n const error = ex as Error\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n throw ex\n } finally {\n span.end()\n }\n })\n }\n return await funcToRun()\n}\n", "import type { TelemetryLogger } from './logger.ts'\n\ndeclare function setInterval(handler: () => void, timeout?: number): unknown\ndeclare function clearInterval(intervalId: ReturnType<typeof setInterval>): void\n\n/**\n * Executes an async function and logs a warning if it exceeds the given time budget.\n * @param name - A label for the function, used in warning messages.\n * @param logger - The logger to use for budget-exceeded warnings.\n * @param func - The async function to execute.\n * @param budget - The time budget in milliseconds.\n * @param status - If true, logs periodic warnings while the function is still running.\n * @returns The result of the executed function.\n */\nexport async function timeBudget<TResult>(\n name: string,\n logger: TelemetryLogger | undefined,\n func: () => Promise<TResult>,\n budget: number,\n status = false,\n): Promise<TResult> {\n const start = Date.now()\n const timer = status\n ? setInterval(() => {\n const duration = Date.now() - start\n if ((budget > 0) && (duration > budget)) {\n logger?.warn(`Function [${name}] execution is exceeding budget: ${duration}ms > ${budget}ms`)\n }\n }, Math.max(100, budget))\n : undefined\n\n const result = await func()\n const duration = Date.now() - start\n\n if (timer === undefined && (budget > 0) && (duration > budget)) {\n if (duration > (100 * budget)) {\n logger?.warn(`Function [${name}] execution exceeded 100x budget: ${duration}ms > ${budget}ms`)\n } else if (duration > (10 * budget)) {\n logger?.info(`Function [${name}] execution exceeded 10x budget: ${duration}ms > ${budget}ms`)\n } else {\n logger?.log(`Function [${name}] execution exceeded 10x budget: ${duration}ms > ${budget}ms`)\n }\n }\n if (timer !== undefined) {\n clearInterval(timer)\n }\n return result\n}\n", "import type { TelemetryLogger } from './logger.ts'\n\ndeclare const console: TelemetryLogger\n\ntype LogColor = (value: string) => string\n\ninterface ReadableSpanLike {\n duration: [number, number]\n name: string\n spanContext(): { traceId: string }\n}\n\ntype ExportResultCallback = (result: { code: 0 }) => void\n\n/**\n * The exporter surface this module produces. Structurally compatible with\n * `SpanExporter` from `@opentelemetry/sdk-trace-base`, so instances can be\n * passed anywhere OpenTelemetry expects a span exporter \u2014 without making\n * that package a runtime dependency of this one.\n */\nexport interface XySpanExporter {\n export(spans: ReadableSpanLike[], resultCallback?: ExportResultCallback): void\n forceFlush(): Promise<void>\n shutdown(): Promise<void>\n}\n\nconst color = (open: number, close = 39): LogColor => {\n return (value: string) => `\\u{1B}[${open}m${value}\\u{1B}[${close}m`\n}\n\nconst logColors = {\n green: color(32),\n grey: color(90),\n magenta: color(35),\n red: color(31),\n white: color(37),\n yellow: color(33),\n}\n\n/**\n * Calculates the duration of a span in milliseconds from its high-resolution time tuple.\n * @param span - The span to measure.\n * @returns The span duration in milliseconds.\n */\nexport function spanDurationInMillis(span: ReadableSpanLike) {\n return span.duration[0] * 1000 + span.duration[1] / 1e6\n}\n\n/**\n * A console span exporter that formats spans with color-coded durations using chalk.\n * Spans are filtered by a configurable log level based on their duration.\n */\nclass XyConsoleSpanExporterImplementation {\n /** Duration thresholds (in ms) that map to increasing log levels. */\n static readonly durationToLogLevel = [\n 0,\n 1,\n 10,\n 100,\n 1000,\n ]\n\n /** Chalk color functions corresponding to each log level. */\n static readonly logLevelToChalkColor = [\n logColors.grey,\n logColors.white,\n logColors.green,\n logColors.yellow,\n logColors.red,\n ]\n\n logger: TelemetryLogger\n private _logLevel: number\n\n constructor(logLevel = 0, logger: TelemetryLogger = console) {\n this._logLevel = logLevel\n this.logger = logger\n }\n\n /** The minimum log level required for a span to be exported. */\n get logLevel() {\n return this._logLevel\n }\n\n export(spans: ReadableSpanLike[], resultCallback?: ExportResultCallback): void {\n for (const span of spans) {\n const spanLevel = this.spanLevel(span)\n if (spanLevel < this.logLevel) {\n continue\n }\n const duration = spanDurationInMillis(span)\n this.logger.log(logColors.grey([\n `Span [${span.name}]`,\n this.logColor(spanLevel)(`${duration}ms`),\n `TraceId: ${span.spanContext().traceId}`,\n ].join(', ')))\n }\n resultCallback?.({ code: 0 })\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve()\n }\n\n /**\n * Returns the chalk color function for the given log level.\n * @param level - The log level index.\n * @returns A chalk color function.\n */\n logColor(level: number) {\n return XyConsoleSpanExporterImplementation.logLevelToChalkColor[level] ?? logColors.magenta\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve()\n }\n\n /**\n * Determines the log level of a span based on its duration.\n * @param span - The span to evaluate.\n * @returns The numeric log level (index into durationToLogLevel).\n */\n spanLevel(span: ReadableSpanLike) {\n let logLevel = 0\n const duration = spanDurationInMillis(span)\n for (let x = XyConsoleSpanExporterImplementation.durationToLogLevel.length - 1; x >= 0; x--) {\n if (duration > XyConsoleSpanExporterImplementation.durationToLogLevel[x]) {\n logLevel = x\n break\n }\n }\n return logLevel\n }\n}\n\n/**\n * Creates a console span exporter that formats spans with color-coded durations.\n * @param logLevel - The minimum duration-derived log level to export.\n * @param logger - The logger that receives formatted spans.\n * @returns An OpenTelemetry-compatible span exporter.\n */\nexport function createXyConsoleSpanExporter(logLevel = 0, logger: TelemetryLogger = console): XySpanExporter {\n return new XyConsoleSpanExporterImplementation(logLevel, logger)\n}\n\n/**\n * Compatibility constructor for the former class-based API.\n * @deprecated Use {@link createXyConsoleSpanExporter}. This class will be removed in a future major release.\n */\nexport class XyConsoleSpanExporter extends XyConsoleSpanExporterImplementation {}\n"],
"mappings": "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",
"sourcesContent": ["import type {\n Context,\n Tracer,\n TracerProvider,\n} from '@opentelemetry/api'\nimport {\n context, propagation, ROOT_CONTEXT, SpanStatusCode, trace as TRACE_API,\n} from '@opentelemetry/api'\n\nimport type { TelemetryLogger } from './logger.ts'\nimport { timeBudget } from './timeBudget.ts'\n\ndeclare const console: TelemetryLogger\n\nfunction isDefined<T>(value: T | undefined): value is T {\n return value !== undefined\n}\n\n/** Configuration options for span creation and execution. */\nexport interface SpanConfig {\n /** Optional logger for time budget warnings. Falls back to console if not provided. */\n logger?: TelemetryLogger | null\n /** Maximum allowed execution time in milliseconds before logging a warning. */\n timeBudgetLimit?: number\n /** OpenTelemetry tracer to use. Defaults to a tracer named after the span. */\n tracer?: Tracer\n}\n\n/**\n * Creates a new OpenTelemetry context that preserves baggage and custom keys but has no active span.\n * @param activeCtx - The context to clone from.\n * @param configKeys - Additional context keys to copy.\n * @returns A new context with baggage but no parent span.\n */\nexport function cloneContextWithoutSpan(activeCtx: Context, configKeys: symbol[] = []): Context {\n // Start from root to ensure no span is propagated\n let newCtx = ROOT_CONTEXT\n\n // Copy baggage\n const baggage = propagation.getBaggage(activeCtx)\n if (baggage) {\n newCtx = propagation.setBaggage(newCtx, baggage)\n }\n\n // Copy custom config keys\n for (const key of configKeys) {\n const value = activeCtx.getValue(key)\n if (value !== undefined) {\n newCtx = newCtx.setValue(key, value)\n }\n }\n\n return newCtx\n}\n\n/**\n * Executes a synchronous function within an OpenTelemetry span, recording status and exceptions.\n * @param name - The span name.\n * @param fn - The function to execute.\n * @param traceProvider - Provider used to obtain the tracer.\n * @returns The return value of `fn`.\n */\nexport function span<T>(name: string, fn: () => T, traceProvider: TracerProvider = TRACE_API): T {\n const activeTracer = traceProvider.getTracer(name)\n if (isDefined(activeTracer)) {\n const span = activeTracer.startSpan(name)\n return context.with(TRACE_API.setSpan(context.active(), span), () => {\n try {\n const result = fn()\n span.setStatus({ code: SpanStatusCode.OK })\n return result\n } catch (ex) {\n const error = ex as Error\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n throw ex\n } finally {\n span.end()\n }\n })\n }\n return fn()\n}\n\n/**\n * Executes a synchronous function within a new root span that has no parent, even if a span is already active.\n * @param name - The span name.\n * @param fn - The function to execute.\n * @param tracer - Optional tracer to use.\n * @returns The return value of `fn`.\n */\nexport function spanRoot<T>(name: string, fn: () => T, tracer?: Tracer): T {\n const activeTracer = tracer ?? TRACE_API.getTracer(name)\n if (isDefined(activeTracer)) {\n // Get current active context for configuration\n const activeContext = context.active()\n\n // Create a new context with no active span\n const noSpanContext = cloneContextWithoutSpan(activeContext)\n\n // Create a new span in the context without an active span\n const span = activeTracer.startSpan(name, {}, noSpanContext)\n\n // Use the active context but replace its span with our new root span\n return context.with(TRACE_API.setSpan(noSpanContext, span), () => {\n try {\n const result = fn()\n span.setStatus({ code: SpanStatusCode.OK })\n return result\n } catch (ex) {\n const error = ex as Error\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n throw ex\n } finally {\n span.end()\n }\n })\n }\n return fn()\n}\n\n/**\n * Executes an async function within an OpenTelemetry span, with optional time budget monitoring.\n * @param name - The span name.\n * @param fn - The async function to execute.\n * @param config - Optional span configuration (tracer, logger, time budget).\n * @returns The resolved value of `fn`.\n */\nexport async function spanAsync<T>(\n name: string,\n fn: () => Promise<T>,\n {\n timeBudgetLimit, logger, tracer,\n }: SpanConfig = {},\n): Promise<T> {\n const activeTracer = tracer ?? TRACE_API.getTracer(name)\n const funcToRun = isDefined(timeBudgetLimit) ? () => timeBudget(name, logger ?? console, fn, timeBudgetLimit) : fn\n if (isDefined(activeTracer)) {\n const span = activeTracer.startSpan(name)\n return await context.with(TRACE_API.setSpan(context.active(), span), async () => {\n try {\n const result = await funcToRun()\n span.setStatus({ code: SpanStatusCode.OK })\n return result\n } catch (ex) {\n const error = ex as Error\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n throw ex\n } finally {\n span.end()\n }\n })\n }\n return await funcToRun()\n}\n\n/**\n * Executes an async function within a new root span (no parent), with optional time budget monitoring.\n * @param name - The span name.\n * @param fn - The async function to execute.\n * @param config - Optional span configuration (tracer, logger, time budget).\n * @returns The resolved value of `fn`.\n */\nexport async function spanRootAsync<T>(\n name: string,\n fn: () => Promise<T>,\n {\n timeBudgetLimit, logger, tracer,\n }: SpanConfig = {},\n): Promise<T> {\n const funcToRun = isDefined(timeBudgetLimit) ? () => timeBudget(name, logger ?? console, fn, timeBudgetLimit) : fn\n const activeTracer = tracer ?? TRACE_API.getTracer(name)\n if (isDefined(activeTracer)) {\n const activeContext = context.active()\n\n const noSpanContext = cloneContextWithoutSpan(activeContext)\n\n // Create a new span in the context without an active span\n const span = activeTracer.startSpan(name, {}, noSpanContext)\n\n // Use the active context but replace its span with our new root span\n return await context.with(TRACE_API.setSpan(noSpanContext, span), async () => {\n try {\n const result = await funcToRun()\n span.setStatus({ code: SpanStatusCode.OK })\n return result\n } catch (ex) {\n const error = ex as Error\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n throw ex\n } finally {\n span.end()\n }\n })\n }\n return await funcToRun()\n}\n", "import type { TelemetryLogger } from './logger.ts'\n\ndeclare function setInterval(handler: () => void, timeout?: number): unknown\ndeclare function clearInterval(intervalId: ReturnType<typeof setInterval>): void\n\n/**\n * Executes an async function and reports exceeded time budgets at increasing log severities.\n * @param name - A label for the function, used in budget-exceeded messages.\n * @param logger - The logger used to report budget overruns.\n * @param func - The async function to execute.\n * @param budget - The time budget in milliseconds.\n * @param status - If true, logs periodic warnings while the function is still running.\n * @returns The result of the executed function.\n */\nexport async function timeBudget<TResult>(\n name: string,\n logger: TelemetryLogger | undefined,\n func: () => Promise<TResult>,\n budget: number,\n status = false,\n): Promise<TResult> {\n const start = Date.now()\n const timer = status\n ? setInterval(() => {\n const duration = Date.now() - start\n if ((budget > 0) && (duration > budget)) {\n logger?.warn(`Function [${name}] execution is exceeding budget: ${duration}ms > ${budget}ms`)\n }\n }, Math.max(100, budget))\n : undefined\n\n const result = await func()\n const duration = Date.now() - start\n\n if (timer === undefined && (budget > 0) && (duration > budget)) {\n if (duration > (100 * budget)) {\n logger?.warn(`Function [${name}] execution exceeded 100x budget: ${duration}ms > ${budget}ms`)\n } else if (duration > (10 * budget)) {\n logger?.info(`Function [${name}] execution exceeded 10x budget: ${duration}ms > ${budget}ms`)\n } else {\n logger?.log(`Function [${name}] execution exceeded budget: ${duration}ms > ${budget}ms`)\n }\n }\n if (timer !== undefined) {\n clearInterval(timer)\n }\n return result\n}\n", "import type { TelemetryLogger } from './logger.ts'\n\ndeclare const console: TelemetryLogger\n\ntype LogColor = (value: string) => string\n\ninterface ReadableSpanLike {\n duration: [number, number]\n name: string\n spanContext(): { traceId: string }\n}\n\ntype ExportResultCallback = (result: { code: 0 }) => void\n\n/**\n * The exporter surface this module produces. Structurally compatible with\n * `SpanExporter` from `@opentelemetry/sdk-trace-base`, so instances can be\n * passed anywhere OpenTelemetry expects a span exporter \u2014 without making\n * that package a runtime dependency of this one.\n */\nexport interface XySpanExporter {\n /** Exports completed spans and reports successful synchronous acceptance. */\n export(spans: ReadableSpanLike[], resultCallback?: ExportResultCallback): void\n /** Resolves after buffered export work is flushed; this exporter has no buffer. */\n forceFlush(): Promise<void>\n /** Resolves after shutdown; this exporter owns no external resources. */\n shutdown(): Promise<void>\n}\n\nconst color = (open: number, close = 39): LogColor => {\n return (value: string) => `\\u{1B}[${open}m${value}\\u{1B}[${close}m`\n}\n\nconst logColors = {\n green: color(32),\n grey: color(90),\n magenta: color(35),\n red: color(31),\n white: color(37),\n yellow: color(33),\n}\n\n/**\n * Calculates the duration of a span in milliseconds from its high-resolution time tuple.\n * @param span - The span to measure.\n * @returns The span duration in milliseconds.\n */\nexport function spanDurationInMillis(span: ReadableSpanLike) {\n return span.duration[0] * 1000 + span.duration[1] / 1e6\n}\n\n/**\n * A console span exporter that formats spans with color-coded durations using chalk.\n * Spans are filtered by a configurable log level based on their duration.\n */\nclass XyConsoleSpanExporterImplementation {\n /** Duration thresholds (in ms) that map to increasing log levels. */\n static readonly durationToLogLevel = [\n 0,\n 1,\n 10,\n 100,\n 1000,\n ]\n\n /** Chalk color functions corresponding to each log level. */\n static readonly logLevelToChalkColor = [\n logColors.grey,\n logColors.white,\n logColors.green,\n logColors.yellow,\n logColors.red,\n ]\n\n logger: TelemetryLogger\n private _logLevel: number\n\n constructor(logLevel = 0, logger: TelemetryLogger = console) {\n this._logLevel = logLevel\n this.logger = logger\n }\n\n /** The minimum log level required for a span to be exported. */\n get logLevel() {\n return this._logLevel\n }\n\n export(spans: ReadableSpanLike[], resultCallback?: ExportResultCallback): void {\n for (const span of spans) {\n const spanLevel = this.spanLevel(span)\n if (spanLevel < this.logLevel) {\n continue\n }\n const duration = spanDurationInMillis(span)\n this.logger.log(logColors.grey([\n `Span [${span.name}]`,\n this.logColor(spanLevel)(`${duration}ms`),\n `TraceId: ${span.spanContext().traceId}`,\n ].join(', ')))\n }\n resultCallback?.({ code: 0 })\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve()\n }\n\n /**\n * Returns the chalk color function for the given log level.\n * @param level - The log level index.\n * @returns A chalk color function.\n */\n logColor(level: number) {\n return XyConsoleSpanExporterImplementation.logLevelToChalkColor[level] ?? logColors.magenta\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve()\n }\n\n /**\n * Determines the log level of a span based on its duration.\n * @param span - The span to evaluate.\n * @returns The numeric log level (index into durationToLogLevel).\n */\n spanLevel(span: ReadableSpanLike) {\n let logLevel = 0\n const duration = spanDurationInMillis(span)\n for (let x = XyConsoleSpanExporterImplementation.durationToLogLevel.length - 1; x >= 0; x--) {\n if (duration > XyConsoleSpanExporterImplementation.durationToLogLevel[x]) {\n logLevel = x\n break\n }\n }\n return logLevel\n }\n}\n\n/**\n * Creates a console span exporter that formats spans with color-coded durations.\n * @param logLevel - The minimum duration-derived log level to export.\n * @param logger - The logger that receives formatted spans.\n * @returns An OpenTelemetry-compatible span exporter.\n */\nexport function createXyConsoleSpanExporter(logLevel = 0, logger: TelemetryLogger = console): XySpanExporter {\n return new XyConsoleSpanExporterImplementation(logLevel, logger)\n}\n\n/**\n * Compatibility constructor for the former class-based API.\n * @deprecated Use {@link createXyConsoleSpanExporter}. This class will be removed in a future major release.\n */\nexport class XyConsoleSpanExporter extends XyConsoleSpanExporterImplementation {}\n"],
"mappings": "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",
"names": ["duration", "span", "span"]
}
/** Minimal logger surface used by span helpers and the console exporter. */
export interface TelemetryLogger {
/** Emits informational telemetry messages. */
info: (...data: unknown[]) => void;
/** Emits formatted span output. */
log: (...data: unknown[]) => void;
/** Emits telemetry warnings. */
warn: (...data: unknown[]) => void;
}
//# sourceMappingURL=logger.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IAClC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IACjC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CACnC"}
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IAClC,mCAAmC;IACnC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IACjC,gCAAgC;IAChC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CACnC"}

@@ -23,3 +23,3 @@ import type { Context, Tracer, TracerProvider } from '@opentelemetry/api';

* @param fn - The function to execute.
* @param tracer - Optional tracer to use.
* @param traceProvider - Provider used to obtain the tracer.
* @returns The return value of `fn`.

@@ -26,0 +26,0 @@ */

import type { TelemetryLogger } from './logger.ts';
/**
* Executes an async function and logs a warning if it exceeds the given time budget.
* @param name - A label for the function, used in warning messages.
* @param logger - The logger to use for budget-exceeded warnings.
* Executes an async function and reports exceeded time budgets at increasing log severities.
* @param name - A label for the function, used in budget-exceeded messages.
* @param logger - The logger used to report budget overruns.
* @param func - The async function to execute.

@@ -7,0 +7,0 @@ * @param budget - The time budget in milliseconds.

@@ -20,4 +20,7 @@ import type { TelemetryLogger } from './logger.ts';

export interface XySpanExporter {
/** Exports completed spans and reports successful synchronous acceptance. */
export(spans: ReadableSpanLike[], resultCallback?: ExportResultCallback): void;
/** Resolves after buffered export work is flushed; this exporter has no buffer. */
forceFlush(): Promise<void>;
/** Resolves after shutdown; this exporter owns no external resources. */
shutdown(): Promise<void>;

@@ -24,0 +27,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"XyConsoleSpanExporter.d.ts","sourceRoot":"","sources":["../../src/XyConsoleSpanExporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;AAEzC,UAAU,gBAAgB;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CACnC;AAED,KAAK,oBAAoB,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,KAAK,IAAI,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC9E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAeD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,UAE1D;AAED;;;GAGG;AACH,cAAM,mCAAmC;IACvC,qEAAqE;IACrE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,WAMjC;IAED,6DAA6D;IAC7D,MAAM,CAAC,QAAQ,CAAC,oBAAoB,aAMnC;IAED,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,CAAC,SAAS,CAAQ;gBAEb,QAAQ,SAAI,EAAE,MAAM,GAAE,eAAyB;IAK3D,gEAAgE;IAChE,IAAI,QAAQ,WAEX;IAED,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI;IAgB9E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM;IAItB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,gBAAgB;CAWjC;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,SAAI,EAAE,MAAM,GAAE,eAAyB,GAAG,cAAc,CAE3G;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,mCAAmC;CAAG"}
{"version":3,"file":"XyConsoleSpanExporter.d.ts","sourceRoot":"","sources":["../../src/XyConsoleSpanExporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;AAEzC,UAAU,gBAAgB;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CACnC;AAED,KAAK,oBAAoB,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,KAAK,IAAI,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC9E,mFAAmF;IACnF,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,yEAAyE;IACzE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAeD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,UAE1D;AAED;;;GAGG;AACH,cAAM,mCAAmC;IACvC,qEAAqE;IACrE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,WAMjC;IAED,6DAA6D;IAC7D,MAAM,CAAC,QAAQ,CAAC,oBAAoB,aAMnC;IAED,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,CAAC,SAAS,CAAQ;gBAEb,QAAQ,SAAI,EAAE,MAAM,GAAE,eAAyB;IAK3D,gEAAgE;IAChE,IAAI,QAAQ,WAEX;IAED,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI;IAgB9E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM;IAItB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,gBAAgB;CAWjC;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,SAAI,EAAE,MAAM,GAAE,eAAyB,GAAG,cAAc,CAE3G;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,mCAAmC;CAAG"}
{
"name": "@ariestools/telemetry",
"version": "8.1.1",
"version": "8.1.2",
"description": "OpenTelemetry span helpers and console span exporter for XY Labs TypeScript/JavaScript libraries",

@@ -5,0 +5,0 @@ "keywords": [