@xylabs/telemetry 4.9.14 → 4.9.15

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.
@@ -1,5 +1,24 @@
1
1
  // src/span.ts
2
- import { context, trace } from "@opentelemetry/api";
2
+ import {
3
+ context,
4
+ propagation,
5
+ ROOT_CONTEXT,
6
+ trace
7
+ } from "@opentelemetry/api";
8
+ function cloneContextWithoutSpan(activeCtx, configKeys = []) {
9
+ let newCtx = ROOT_CONTEXT;
10
+ const baggage = propagation.getBaggage(activeCtx);
11
+ if (baggage) {
12
+ newCtx = propagation.setBaggage(newCtx, baggage);
13
+ }
14
+ for (const key of configKeys) {
15
+ const value = activeCtx.getValue(key);
16
+ if (value !== void 0) {
17
+ newCtx = newCtx.setValue(key, value);
18
+ }
19
+ }
20
+ return newCtx;
21
+ }
3
22
  function span(name, fn, tracer) {
4
23
  if (tracer) {
5
24
  const span2 = tracer.startSpan(name);
@@ -14,15 +33,12 @@ function span(name, fn, tracer) {
14
33
  return fn();
15
34
  }
16
35
  }
17
- function clearContext(context2) {
18
- return trace.getSpan(context2) ? clearContext(trace.deleteSpan(context2)) : context2;
19
- }
20
36
  function spanRoot(name, fn, tracer) {
21
37
  if (tracer) {
22
38
  const activeContext = context.active();
23
- const noSpanContext = clearContext(activeContext);
39
+ const noSpanContext = cloneContextWithoutSpan(activeContext);
24
40
  const span2 = tracer.startSpan(name, {}, noSpanContext);
25
- return context.with(trace.setSpan(activeContext, span2), () => {
41
+ return context.with(trace.setSpan(noSpanContext, span2), () => {
26
42
  try {
27
43
  return fn();
28
44
  } finally {
@@ -50,9 +66,9 @@ async function spanAsync(name, fn, tracer) {
50
66
  async function spanRootAsync(name, fn, tracer) {
51
67
  if (tracer) {
52
68
  const activeContext = context.active();
53
- const noSpanContext = clearContext(activeContext);
69
+ const noSpanContext = cloneContextWithoutSpan(activeContext);
54
70
  const span2 = tracer.startSpan(name, {}, noSpanContext);
55
- return await context.with(trace.setSpan(activeContext, span2), async () => {
71
+ return await context.with(trace.setSpan(noSpanContext, span2), async () => {
56
72
  try {
57
73
  return await fn();
58
74
  } finally {
@@ -64,6 +80,7 @@ async function spanRootAsync(name, fn, tracer) {
64
80
  }
65
81
  }
66
82
  export {
83
+ cloneContextWithoutSpan,
67
84
  span,
68
85
  spanAsync,
69
86
  spanRoot,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/span.ts"],"sourcesContent":["import type {\n Context,\n Tracer,\n} from '@opentelemetry/api'\nimport { context, trace } from '@opentelemetry/api'\n\nexport function span<T>(name: string, fn: () => T, tracer?: Tracer): T {\n if (tracer) {\n const span = tracer.startSpan(name)\n return context.with(trace.setSpan(context.active(), span), () => {\n try {\n return fn()\n } finally {\n span.end()\n }\n })\n } else {\n return fn()\n }\n}\n\nfunction clearContext(context: Context): Context {\n return trace.getSpan(context) ? clearContext(trace.deleteSpan(context)) : context\n}\n\nexport function spanRoot<T>(name: string, fn: () => T, tracer?: Tracer): T {\n if (tracer) {\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 = clearContext(activeContext)\n\n // Create a new span in the context without an active span\n const span = tracer.startSpan(name, {}, noSpanContext)\n\n // Use the active context but replace its span with our new root span\n return context.with(trace.setSpan(activeContext, span), () => {\n try {\n return fn()\n } finally {\n span.end()\n }\n })\n } else {\n return fn()\n }\n}\n\nexport async function spanAsync<T>(\n name: string,\n fn: () => Promise<T>,\n tracer?: Tracer,\n): Promise<T> {\n if (tracer) {\n const span = tracer.startSpan(name)\n return await context.with(trace.setSpan(context.active(), span), async () => {\n try {\n return await fn()\n } finally {\n span.end()\n }\n })\n } else {\n return await fn()\n }\n}\n\nexport async function spanRootAsync<T>(\n name: string,\n fn: () => Promise<T>,\n tracer?: Tracer,\n): Promise<T> {\n if (tracer) {\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 = clearContext(activeContext)\n\n // Create a new span in the context without an active span\n const span = tracer.startSpan(name, {}, noSpanContext)\n\n // Use the active context but replace its span with our new root span\n return await context.with(trace.setSpan(activeContext, span), async () => {\n try {\n return await fn()\n } finally {\n span.end()\n }\n })\n } else {\n return await fn()\n }\n}\n"],"mappings":";AAIA,SAAS,SAAS,aAAa;AAExB,SAAS,KAAQ,MAAc,IAAa,QAAoB;AACrE,MAAI,QAAQ;AACV,UAAMA,QAAO,OAAO,UAAU,IAAI;AAClC,WAAO,QAAQ,KAAK,MAAM,QAAQ,QAAQ,OAAO,GAAGA,KAAI,GAAG,MAAM;AAC/D,UAAI;AACF,eAAO,GAAG;AAAA,MACZ,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,GAAG;AAAA,EACZ;AACF;AAEA,SAAS,aAAaC,UAA2B;AAC/C,SAAO,MAAM,QAAQA,QAAO,IAAI,aAAa,MAAM,WAAWA,QAAO,CAAC,IAAIA;AAC5E;AAEO,SAAS,SAAY,MAAc,IAAa,QAAoB;AACzE,MAAI,QAAQ;AAEV,UAAM,gBAAgB,QAAQ,OAAO;AAGrC,UAAM,gBAAgB,aAAa,aAAa;AAGhD,UAAMD,QAAO,OAAO,UAAU,MAAM,CAAC,GAAG,aAAa;AAGrD,WAAO,QAAQ,KAAK,MAAM,QAAQ,eAAeA,KAAI,GAAG,MAAM;AAC5D,UAAI;AACF,eAAO,GAAG;AAAA,MACZ,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,GAAG;AAAA,EACZ;AACF;AAEA,eAAsB,UACpB,MACA,IACA,QACY;AACZ,MAAI,QAAQ;AACV,UAAMA,QAAO,OAAO,UAAU,IAAI;AAClC,WAAO,MAAM,QAAQ,KAAK,MAAM,QAAQ,QAAQ,OAAO,GAAGA,KAAI,GAAG,YAAY;AAC3E,UAAI;AACF,eAAO,MAAM,GAAG;AAAA,MAClB,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,MAAM,GAAG;AAAA,EAClB;AACF;AAEA,eAAsB,cACpB,MACA,IACA,QACY;AACZ,MAAI,QAAQ;AAEV,UAAM,gBAAgB,QAAQ,OAAO;AAGrC,UAAM,gBAAgB,aAAa,aAAa;AAGhD,UAAMA,QAAO,OAAO,UAAU,MAAM,CAAC,GAAG,aAAa;AAGrD,WAAO,MAAM,QAAQ,KAAK,MAAM,QAAQ,eAAeA,KAAI,GAAG,YAAY;AACxE,UAAI;AACF,eAAO,MAAM,GAAG;AAAA,MAClB,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,MAAM,GAAG;AAAA,EAClB;AACF;","names":["span","context"]}
1
+ {"version":3,"sources":["../../src/span.ts"],"sourcesContent":["import type {\n Context,\n Tracer,\n} from '@opentelemetry/api'\nimport {\n context, propagation, ROOT_CONTEXT, trace,\n} from '@opentelemetry/api'\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\nexport function span<T>(name: string, fn: () => T, tracer?: Tracer): T {\n if (tracer) {\n const span = tracer.startSpan(name)\n return context.with(trace.setSpan(context.active(), span), () => {\n try {\n return fn()\n } finally {\n span.end()\n }\n })\n } else {\n return fn()\n }\n}\n\nexport function spanRoot<T>(name: string, fn: () => T, tracer?: Tracer): T {\n if (tracer) {\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 = tracer.startSpan(name, {}, noSpanContext)\n\n // Use the active context but replace its span with our new root span\n return context.with(trace.setSpan(noSpanContext, span), () => {\n try {\n return fn()\n } finally {\n span.end()\n }\n })\n } else {\n return fn()\n }\n}\n\nexport async function spanAsync<T>(\n name: string,\n fn: () => Promise<T>,\n tracer?: Tracer,\n): Promise<T> {\n if (tracer) {\n const span = tracer.startSpan(name)\n return await context.with(trace.setSpan(context.active(), span), async () => {\n try {\n return await fn()\n } finally {\n span.end()\n }\n })\n } else {\n return await fn()\n }\n}\n\nexport async function spanRootAsync<T>(\n name: string,\n fn: () => Promise<T>,\n tracer?: Tracer,\n): Promise<T> {\n if (tracer) {\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 = tracer.startSpan(name, {}, noSpanContext)\n\n // Use the active context but replace its span with our new root span\n return await context.with(trace.setSpan(noSpanContext, span), async () => {\n try {\n return await fn()\n } finally {\n span.end()\n }\n })\n } else {\n return await fn()\n }\n}\n"],"mappings":";AAIA;AAAA,EACE;AAAA,EAAS;AAAA,EAAa;AAAA,EAAc;AAAA,OAC/B;AAEA,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;AAEO,SAAS,KAAQ,MAAc,IAAa,QAAoB;AACrE,MAAI,QAAQ;AACV,UAAMA,QAAO,OAAO,UAAU,IAAI;AAClC,WAAO,QAAQ,KAAK,MAAM,QAAQ,QAAQ,OAAO,GAAGA,KAAI,GAAG,MAAM;AAC/D,UAAI;AACF,eAAO,GAAG;AAAA,MACZ,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,GAAG;AAAA,EACZ;AACF;AAEO,SAAS,SAAY,MAAc,IAAa,QAAoB;AACzE,MAAI,QAAQ;AAEV,UAAM,gBAAgB,QAAQ,OAAO;AAGrC,UAAM,gBAAgB,wBAAwB,aAAa;AAG3D,UAAMA,QAAO,OAAO,UAAU,MAAM,CAAC,GAAG,aAAa;AAGrD,WAAO,QAAQ,KAAK,MAAM,QAAQ,eAAeA,KAAI,GAAG,MAAM;AAC5D,UAAI;AACF,eAAO,GAAG;AAAA,MACZ,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,GAAG;AAAA,EACZ;AACF;AAEA,eAAsB,UACpB,MACA,IACA,QACY;AACZ,MAAI,QAAQ;AACV,UAAMA,QAAO,OAAO,UAAU,IAAI;AAClC,WAAO,MAAM,QAAQ,KAAK,MAAM,QAAQ,QAAQ,OAAO,GAAGA,KAAI,GAAG,YAAY;AAC3E,UAAI;AACF,eAAO,MAAM,GAAG;AAAA,MAClB,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,MAAM,GAAG;AAAA,EAClB;AACF;AAEA,eAAsB,cACpB,MACA,IACA,QACY;AACZ,MAAI,QAAQ;AACV,UAAM,gBAAgB,QAAQ,OAAO;AAErC,UAAM,gBAAgB,wBAAwB,aAAa;AAG3D,UAAMA,QAAO,OAAO,UAAU,MAAM,CAAC,GAAG,aAAa;AAGrD,WAAO,MAAM,QAAQ,KAAK,MAAM,QAAQ,eAAeA,KAAI,GAAG,YAAY;AACxE,UAAI;AACF,eAAO,MAAM,GAAG;AAAA,MAClB,UAAE;AACA,QAAAA,MAAK,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,MAAM,GAAG;AAAA,EAClB;AACF;","names":["span"]}
@@ -1,4 +1,5 @@
1
- import type { Tracer } from '@opentelemetry/api';
1
+ import type { Context, Tracer } from '@opentelemetry/api';
2
+ export declare function cloneContextWithoutSpan(activeCtx: Context, configKeys?: symbol[]): Context;
2
3
  export declare function span<T>(name: string, fn: () => T, tracer?: Tracer): T;
3
4
  export declare function spanRoot<T>(name: string, fn: () => T, tracer?: Tracer): T;
4
5
  export declare function spanAsync<T>(name: string, fn: () => Promise<T>, tracer?: Tracer): Promise<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"span.d.ts","sourceRoot":"","sources":["../../src/span.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,MAAM,EACP,MAAM,oBAAoB,CAAA;AAG3B,wBAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAarE;AAMD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAsBzE;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAaZ;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAsBZ"}
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;AAK3B,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,OAAO,CAmB9F;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAarE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAsBzE;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAaZ;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/telemetry",
3
- "version": "4.9.14",
3
+ "version": "4.9.15",
4
4
  "description": "Base functionality used throughout XY Labs TypeScript/JavaScript libraries",
5
5
  "keywords": [
6
6
  "hex",
package/src/span.ts CHANGED
@@ -2,7 +2,30 @@ import type {
2
2
  Context,
3
3
  Tracer,
4
4
  } from '@opentelemetry/api'
5
- import { context, trace } from '@opentelemetry/api'
5
+ import {
6
+ context, propagation, ROOT_CONTEXT, trace,
7
+ } from '@opentelemetry/api'
8
+
9
+ export function cloneContextWithoutSpan(activeCtx: Context, configKeys: symbol[] = []): Context {
10
+ // Start from root to ensure no span is propagated
11
+ let newCtx = ROOT_CONTEXT
12
+
13
+ // Copy baggage
14
+ const baggage = propagation.getBaggage(activeCtx)
15
+ if (baggage) {
16
+ newCtx = propagation.setBaggage(newCtx, baggage)
17
+ }
18
+
19
+ // Copy custom config keys
20
+ for (const key of configKeys) {
21
+ const value = activeCtx.getValue(key)
22
+ if (value !== undefined) {
23
+ newCtx = newCtx.setValue(key, value)
24
+ }
25
+ }
26
+
27
+ return newCtx
28
+ }
6
29
 
7
30
  export function span<T>(name: string, fn: () => T, tracer?: Tracer): T {
8
31
  if (tracer) {
@@ -19,23 +42,19 @@ export function span<T>(name: string, fn: () => T, tracer?: Tracer): T {
19
42
  }
20
43
  }
21
44
 
22
- function clearContext(context: Context): Context {
23
- return trace.getSpan(context) ? clearContext(trace.deleteSpan(context)) : context
24
- }
25
-
26
45
  export function spanRoot<T>(name: string, fn: () => T, tracer?: Tracer): T {
27
46
  if (tracer) {
28
47
  // Get current active context for configuration
29
48
  const activeContext = context.active()
30
49
 
31
50
  // Create a new context with no active span
32
- const noSpanContext = clearContext(activeContext)
51
+ const noSpanContext = cloneContextWithoutSpan(activeContext)
33
52
 
34
53
  // Create a new span in the context without an active span
35
54
  const span = tracer.startSpan(name, {}, noSpanContext)
36
55
 
37
56
  // Use the active context but replace its span with our new root span
38
- return context.with(trace.setSpan(activeContext, span), () => {
57
+ return context.with(trace.setSpan(noSpanContext, span), () => {
39
58
  try {
40
59
  return fn()
41
60
  } finally {
@@ -72,17 +91,15 @@ export async function spanRootAsync<T>(
72
91
  tracer?: Tracer,
73
92
  ): Promise<T> {
74
93
  if (tracer) {
75
- // Get current active context for configuration
76
94
  const activeContext = context.active()
77
95
 
78
- // Create a new context with no active span
79
- const noSpanContext = clearContext(activeContext)
96
+ const noSpanContext = cloneContextWithoutSpan(activeContext)
80
97
 
81
98
  // Create a new span in the context without an active span
82
99
  const span = tracer.startSpan(name, {}, noSpanContext)
83
100
 
84
101
  // Use the active context but replace its span with our new root span
85
- return await context.with(trace.setSpan(activeContext, span), async () => {
102
+ return await context.with(trace.setSpan(noSpanContext, span), async () => {
86
103
  try {
87
104
  return await fn()
88
105
  } finally {