@xylabs/telemetry 5.0.87 → 5.0.88

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.
@@ -43,8 +43,8 @@ function cloneContextWithoutSpan(activeCtx, configKeys = []) {
43
43
  }
44
44
  return newCtx;
45
45
  }
46
- function span(name, fn, tracer) {
47
- const activeTracer = tracer ?? TRACE_API.getTracer(name);
46
+ function span(name, fn, traceProvider = TRACE_API) {
47
+ const activeTracer = traceProvider.getTracer(name);
48
48
  if (isDefined(activeTracer)) {
49
49
  const span2 = activeTracer.startSpan(name);
50
50
  return context.with(TRACE_API.setSpan(context.active(), span2), () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/span.ts","../../src/timeBudget.ts"],"sourcesContent":["import type {\n Context,\n Tracer,\n} from '@opentelemetry/api'\nimport {\n context, propagation, ROOT_CONTEXT, SpanStatusCode, trace as TRACE_API,\n} from '@opentelemetry/api'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined } from '@xylabs/typeof'\n\nimport { timeBudget } from './timeBudget.ts'\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?: Logger | 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, tracer?: Tracer): T {\n const activeTracer = tracer ?? TRACE_API.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 } else {\n return fn()\n }\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 } else {\n return fn()\n }\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 } else {\n return await funcToRun()\n }\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 } else {\n return await funcToRun()\n }\n}\n","import type { Logger } from '@xylabs/logger'\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: Logger | 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 && (budget > 0) && (duration > budget)) {\n logger?.warn(`Function [${name}] execution exceeded budget: ${duration}ms > ${budget}ms`)\n }\n if (timer) {\n clearInterval(timer)\n }\n return result\n}\n"],"mappings":"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","names":["duration","span"]}
1
+ {"version":3,"sources":["../../src/span.ts","../../src/timeBudget.ts"],"sourcesContent":["import type {\n Context,\n Tracer,\n} from '@opentelemetry/api'\nimport {\n context, propagation, ROOT_CONTEXT, SpanStatusCode, trace as TRACE_API,\n} from '@opentelemetry/api'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined } from '@xylabs/typeof'\n\nimport { timeBudget } from './timeBudget.ts'\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?: Logger | 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 = 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 } else {\n return fn()\n }\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 } else {\n return fn()\n }\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 } else {\n return await funcToRun()\n }\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 } else {\n return await funcToRun()\n }\n}\n","import type { Logger } from '@xylabs/logger'\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: Logger | 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 && (budget > 0) && (duration > budget)) {\n logger?.warn(`Function [${name}] execution exceeded budget: ${duration}ms > ${budget}ms`)\n }\n if (timer) {\n clearInterval(timer)\n }\n return result\n}\n"],"mappings":";AAIA;AAAA,EACE;AAAA,EAAS;AAAA,EAAa;AAAA,EAAc;AAAA,EAAgB,SAAS;AAAA,OACxD;AAEP,SAAS,iBAAiB;;;ACG1B,eAAsB,WACpB,MACA,QACA,MACA,QACA,SAAS,OACS;AAClB,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,QAAQ,SACV,YAAY,MAAM;AAChB,UAAMA,YAAW,KAAK,IAAI,IAAI;AAC9B,QAAK,SAAS,KAAOA,YAAW,QAAS;AACvC,cAAQ,KAAK,aAAa,IAAI,oCAAoCA,SAAQ,QAAQ,MAAM,IAAI;AAAA,IAC9F;AAAA,EACF,GAAG,KAAK,IAAI,KAAK,MAAM,CAAC,IACxB;AAEJ,QAAM,SAAS,MAAM,KAAK;AAC1B,QAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,MAAI,CAAC,SAAU,SAAS,KAAO,WAAW,QAAS;AACjD,YAAQ,KAAK,aAAa,IAAI,gCAAgC,QAAQ,QAAQ,MAAM,IAAI;AAAA,EAC1F;AACA,MAAI,OAAO;AACT,kBAAc,KAAK;AAAA,EACrB;AACA,SAAO;AACT;;;ADVO,SAAS,wBAAwB,WAAoB,aAAuB,CAAC,GAAY;AAE9F,MAAI,SAAS;AAGb,QAAM,UAAU,YAAY,WAAW,SAAS;AAChD,MAAI,SAAS;AACX,aAAS,YAAY,WAAW,QAAQ,OAAO;AAAA,EACjD;AAGA,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAQ,UAAU,SAAS,GAAG;AACpC,QAAI,UAAU,QAAW;AACvB,eAAS,OAAO,SAAS,KAAK,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,KAAQ,MAAc,IAAa,gBAAgB,WAAc;AAC/E,QAAM,eAAe,cAAc,UAAU,IAAI;AACjD,MAAI,UAAU,YAAY,GAAG;AAC3B,UAAMC,QAAO,aAAa,UAAU,IAAI;AACxC,WAAO,QAAQ,KAAK,UAAU,QAAQ,QAAQ,OAAO,GAAGA,KAAI,GAAG,MAAM;AACnE,UAAI;AACF,cAAM,SAAS,GAAG;AAClB,QAAAA,MAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,eAAO;AAAA,MACT,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,QAAAA,MAAK,gBAAgB,KAAK;AAC1B,QAAAA,MAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,cAAM;AAAA,MACR,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,GAAG;AAAA,EACZ;AACF;AASO,SAAS,SAAY,MAAc,IAAa,QAAoB;AACzE,QAAM,eAAe,UAAU,UAAU,UAAU,IAAI;AACvD,MAAI,UAAU,YAAY,GAAG;AAE3B,UAAM,gBAAgB,QAAQ,OAAO;AAGrC,UAAM,gBAAgB,wBAAwB,aAAa;AAG3D,UAAMA,QAAO,aAAa,UAAU,MAAM,CAAC,GAAG,aAAa;AAG3D,WAAO,QAAQ,KAAK,UAAU,QAAQ,eAAeA,KAAI,GAAG,MAAM;AAChE,UAAI;AACF,cAAM,SAAS,GAAG;AAClB,QAAAA,MAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,eAAO;AAAA,MACT,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,QAAAA,MAAK,gBAAgB,KAAK;AAC1B,QAAAA,MAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,cAAM;AAAA,MACR,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,GAAG;AAAA,EACZ;AACF;AASA,eAAsB,UACpB,MACA,IACA;AAAA,EACE;AAAA,EAAiB;AAAA,EAAQ;AAC3B,IAAgB,CAAC,GACL;AACZ,QAAM,eAAe,UAAU,UAAU,UAAU,IAAI;AACvD,QAAM,YAAY,UAAU,eAAe,IAAI,MAAM,WAAW,MAAM,UAAU,SAAS,IAAI,eAAe,IAAI;AAChH,MAAI,UAAU,YAAY,GAAG;AAC3B,UAAMA,QAAO,aAAa,UAAU,IAAI;AACxC,WAAO,MAAM,QAAQ,KAAK,UAAU,QAAQ,QAAQ,OAAO,GAAGA,KAAI,GAAG,YAAY;AAC/E,UAAI;AACF,cAAM,SAAS,MAAM,UAAU;AAC/B,QAAAA,MAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,eAAO;AAAA,MACT,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,QAAAA,MAAK,gBAAgB,KAAK;AAC1B,QAAAA,MAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,cAAM;AAAA,MACR,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,MAAM,UAAU;AAAA,EACzB;AACF;AASA,eAAsB,cACpB,MACA,IACA;AAAA,EACE;AAAA,EAAiB;AAAA,EAAQ;AAC3B,IAAgB,CAAC,GACL;AACZ,QAAM,YAAY,UAAU,eAAe,IAAI,MAAM,WAAW,MAAM,UAAU,SAAS,IAAI,eAAe,IAAI;AAChH,QAAM,eAAe,UAAU,UAAU,UAAU,IAAI;AACvD,MAAI,UAAU,YAAY,GAAG;AAC3B,UAAM,gBAAgB,QAAQ,OAAO;AAErC,UAAM,gBAAgB,wBAAwB,aAAa;AAG3D,UAAMA,QAAO,aAAa,UAAU,MAAM,CAAC,GAAG,aAAa;AAG3D,WAAO,MAAM,QAAQ,KAAK,UAAU,QAAQ,eAAeA,KAAI,GAAG,YAAY;AAC5E,UAAI;AACF,cAAM,SAAS,MAAM,UAAU;AAC/B,QAAAA,MAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,eAAO;AAAA,MACT,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,QAAAA,MAAK,gBAAgB,KAAK;AAC1B,QAAAA,MAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,cAAM;AAAA,MACR,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,MAAM,UAAU;AAAA,EACzB;AACF;","names":["duration","span"]}
@@ -23,7 +23,7 @@ export declare function cloneContextWithoutSpan(activeCtx: Context, configKeys?:
23
23
  * @param tracer - Optional tracer to use.
24
24
  * @returns The return value of `fn`.
25
25
  */
26
- export declare function span<T>(name: string, fn: () => T, tracer?: Tracer): T;
26
+ export declare function span<T>(name: string, fn: () => T, traceProvider?: import("@opentelemetry/api").TraceAPI): T;
27
27
  /**
28
28
  * Executes a synchronous function within a new root span that has no parent, even if a span is already active.
29
29
  * @param name - The span name.
@@ -1 +1 @@
1
- {"version":3,"file":"span.d.ts","sourceRoot":"","sources":["../../src/span.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACP,MAAM,oBAAoB,CAAA;AAI3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAK5C,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,OAAO,CAmB9F;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAqBrE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CA8BzE;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,EACE,eAAe,EAAE,MAAM,EAAE,MAAM,GAChC,GAAE,UAAe,GACjB,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,EACE,eAAe,EAAE,MAAM,EAAE,MAAM,GAChC,GAAE,UAAe,GACjB,OAAO,CAAC,CAAC,CAAC,CA6BZ"}
1
+ {"version":3,"file":"span.d.ts","sourceRoot":"","sources":["../../src/span.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACP,MAAM,oBAAoB,CAAA;AAI3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAK5C,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,OAAO,CAmB9F;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,aAAa,wCAAY,GAAG,CAAC,CAqB/E;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CA8BzE;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,EACE,eAAe,EAAE,MAAM,EAAE,MAAM,GAChC,GAAE,UAAe,GACjB,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,EACE,eAAe,EAAE,MAAM,EAAE,MAAM,GAChC,GAAE,UAAe,GACjB,OAAO,CAAC,CAAC,CAAC,CA6BZ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/telemetry",
3
- "version": "5.0.87",
3
+ "version": "5.0.88",
4
4
  "description": "Base functionality used throughout XY Labs TypeScript/JavaScript libraries",
5
5
  "keywords": [
6
6
  "hex",
@@ -42,15 +42,15 @@
42
42
  "!**/*.test.*"
43
43
  ],
44
44
  "dependencies": {
45
- "@opentelemetry/api": "^1.9.0",
46
- "@xylabs/logger": "~5.0.87",
47
- "@xylabs/typeof": "~5.0.87"
45
+ "@opentelemetry/api": "^1.9.1",
46
+ "@xylabs/logger": "~5.0.88",
47
+ "@xylabs/typeof": "~5.0.88"
48
48
  },
49
49
  "devDependencies": {
50
- "@xylabs/ts-scripts-yarn3": "~7.4.24",
51
- "@xylabs/tsconfig": "~7.4.24",
50
+ "@xylabs/ts-scripts-yarn3": "~7.4.28",
51
+ "@xylabs/tsconfig": "~7.4.28",
52
52
  "typescript": "~5.9.3",
53
- "vitest": "^4.1.0"
53
+ "vitest": "^4.1.2"
54
54
  },
55
55
  "engines": {
56
56
  "node": ">=18"