react-native-otel 0.1.4 → 0.1.6

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.
Files changed (90) hide show
  1. package/README.md +1133 -13
  2. package/lib/module/core/meter.js +28 -2
  3. package/lib/module/core/meter.js.map +1 -1
  4. package/lib/module/core/processor.js +28 -0
  5. package/lib/module/core/processor.js.map +1 -0
  6. package/lib/module/core/resource.js +1 -0
  7. package/lib/module/core/resource.js.map +1 -1
  8. package/lib/module/core/sampler.js +55 -0
  9. package/lib/module/core/sampler.js.map +1 -0
  10. package/lib/module/core/span.js +15 -1
  11. package/lib/module/core/span.js.map +1 -1
  12. package/lib/module/core/tracer.js +24 -4
  13. package/lib/module/core/tracer.js.map +1 -1
  14. package/lib/module/exporters/multi-exporter.js +57 -0
  15. package/lib/module/exporters/multi-exporter.js.map +1 -0
  16. package/lib/module/exporters/otlp-http-exporter.js +69 -9
  17. package/lib/module/exporters/otlp-http-exporter.js.map +1 -1
  18. package/lib/module/exporters/wal.js +59 -3
  19. package/lib/module/exporters/wal.js.map +1 -1
  20. package/lib/module/index.js +16 -0
  21. package/lib/module/index.js.map +1 -1
  22. package/lib/module/instrumentation/expo-router.js +76 -0
  23. package/lib/module/instrumentation/expo-router.js.map +1 -0
  24. package/lib/module/instrumentation/fetch.js +99 -0
  25. package/lib/module/instrumentation/fetch.js.map +1 -0
  26. package/lib/module/instrumentation/lifecycle.js +6 -1
  27. package/lib/module/instrumentation/lifecycle.js.map +1 -1
  28. package/lib/module/instrumentation/linking.js +65 -0
  29. package/lib/module/instrumentation/linking.js.map +1 -0
  30. package/lib/module/instrumentation/network.js +28 -4
  31. package/lib/module/instrumentation/network.js.map +1 -1
  32. package/lib/module/instrumentation/startup.js +46 -0
  33. package/lib/module/instrumentation/startup.js.map +1 -0
  34. package/lib/module/sdk.js +65 -5
  35. package/lib/module/sdk.js.map +1 -1
  36. package/lib/module/version.js +7 -0
  37. package/lib/module/version.js.map +1 -0
  38. package/lib/typescript/src/core/meter.d.ts +2 -0
  39. package/lib/typescript/src/core/meter.d.ts.map +1 -1
  40. package/lib/typescript/src/core/processor.d.ts +29 -0
  41. package/lib/typescript/src/core/processor.d.ts.map +1 -0
  42. package/lib/typescript/src/core/resource.d.ts +3 -0
  43. package/lib/typescript/src/core/resource.d.ts.map +1 -1
  44. package/lib/typescript/src/core/sampler.d.ts +31 -0
  45. package/lib/typescript/src/core/sampler.d.ts.map +1 -0
  46. package/lib/typescript/src/core/span.d.ts +16 -0
  47. package/lib/typescript/src/core/span.d.ts.map +1 -1
  48. package/lib/typescript/src/core/tracer.d.ts +8 -3
  49. package/lib/typescript/src/core/tracer.d.ts.map +1 -1
  50. package/lib/typescript/src/exporters/multi-exporter.d.ts +28 -0
  51. package/lib/typescript/src/exporters/multi-exporter.d.ts.map +1 -0
  52. package/lib/typescript/src/exporters/otlp-http-exporter.d.ts +9 -0
  53. package/lib/typescript/src/exporters/otlp-http-exporter.d.ts.map +1 -1
  54. package/lib/typescript/src/exporters/wal.d.ts +2 -0
  55. package/lib/typescript/src/exporters/wal.d.ts.map +1 -1
  56. package/lib/typescript/src/index.d.ts +13 -2
  57. package/lib/typescript/src/index.d.ts.map +1 -1
  58. package/lib/typescript/src/instrumentation/expo-router.d.ts +31 -0
  59. package/lib/typescript/src/instrumentation/expo-router.d.ts.map +1 -0
  60. package/lib/typescript/src/instrumentation/fetch.d.ts +18 -0
  61. package/lib/typescript/src/instrumentation/fetch.d.ts.map +1 -0
  62. package/lib/typescript/src/instrumentation/lifecycle.d.ts.map +1 -1
  63. package/lib/typescript/src/instrumentation/linking.d.ts +23 -0
  64. package/lib/typescript/src/instrumentation/linking.d.ts.map +1 -0
  65. package/lib/typescript/src/instrumentation/network.d.ts.map +1 -1
  66. package/lib/typescript/src/instrumentation/startup.d.ts +16 -0
  67. package/lib/typescript/src/instrumentation/startup.d.ts.map +1 -0
  68. package/lib/typescript/src/sdk.d.ts +34 -0
  69. package/lib/typescript/src/sdk.d.ts.map +1 -1
  70. package/lib/typescript/src/version.d.ts +2 -0
  71. package/lib/typescript/src/version.d.ts.map +1 -0
  72. package/package.json +6 -1
  73. package/src/core/meter.ts +33 -2
  74. package/src/core/processor.ts +33 -0
  75. package/src/core/resource.ts +6 -0
  76. package/src/core/sampler.ts +65 -0
  77. package/src/core/span.ts +28 -1
  78. package/src/core/tracer.ts +42 -7
  79. package/src/exporters/multi-exporter.ts +59 -0
  80. package/src/exporters/otlp-http-exporter.ts +79 -10
  81. package/src/exporters/wal.ts +62 -3
  82. package/src/index.ts +34 -1
  83. package/src/instrumentation/expo-router.ts +94 -0
  84. package/src/instrumentation/fetch.ts +134 -0
  85. package/src/instrumentation/lifecycle.ts +7 -1
  86. package/src/instrumentation/linking.ts +83 -0
  87. package/src/instrumentation/network.ts +33 -4
  88. package/src/instrumentation/startup.ts +49 -0
  89. package/src/sdk.ts +86 -4
  90. package/src/version.ts +6 -0
@@ -5,7 +5,32 @@ import { now } from "./clock.js";
5
5
 
6
6
  // Default bucket boundaries in milliseconds — covers typical mobile latencies.
7
7
  const DEFAULT_HISTOGRAM_BOUNDARIES = [0, 5, 10, 25, 50, 75, 100, 250, 500, 1000];
8
+
9
+ // Cap for the sanitized-attributes memoization cache to prevent memory leaks
10
+ // when attributes have high cardinality.
11
+ const ATTR_CACHE_MAX = 100;
12
+
13
+ /**
14
+ * Memoized attribute sanitization: avoids calling sanitizeAttributes() on
15
+ * every Counter.add() / Gauge.set() call for the same attribute set.
16
+ */
17
+ function cachedSanitize(cache, attrs) {
18
+ if (!attrs) return {};
19
+ const key = JSON.stringify(attrs);
20
+ let sanitized = cache.get(key);
21
+ if (sanitized === undefined) {
22
+ sanitized = sanitizeAttributes(attrs);
23
+ if (cache.size >= ATTR_CACHE_MAX) {
24
+ // Evict the oldest entry to cap memory usage.
25
+ const firstKey = cache.keys().next().value;
26
+ if (firstKey !== undefined) cache.delete(firstKey);
27
+ }
28
+ cache.set(key, sanitized);
29
+ }
30
+ return sanitized;
31
+ }
8
32
  export class Counter {
33
+ attrCache = new Map();
9
34
  constructor(name, pushToBuffer) {
10
35
  this.name = name;
11
36
  this.pushToBuffer = pushToBuffer;
@@ -16,7 +41,7 @@ export class Counter {
16
41
  name: this.name,
17
42
  value,
18
43
  timestampMs: now(),
19
- attributes: attrs ? sanitizeAttributes(attrs) : {}
44
+ attributes: cachedSanitize(this.attrCache, attrs)
20
45
  });
21
46
  }
22
47
  }
@@ -87,6 +112,7 @@ export class Histogram {
87
112
  }
88
113
  }
89
114
  export class Gauge {
115
+ attrCache = new Map();
90
116
  constructor(name, pushToBuffer) {
91
117
  this.name = name;
92
118
  this.pushToBuffer = pushToBuffer;
@@ -97,7 +123,7 @@ export class Gauge {
97
123
  name: this.name,
98
124
  value,
99
125
  timestampMs: now(),
100
- attributes: attrs ? sanitizeAttributes(attrs) : {}
126
+ attributes: cachedSanitize(this.attrCache, attrs)
101
127
  });
102
128
  }
103
129
  }
@@ -1 +1 @@
1
- {"version":3,"names":["sanitizeAttributes","now","DEFAULT_HISTOGRAM_BOUNDARIES","Counter","constructor","name","pushToBuffer","add","value","attrs","type","timestampMs","attributes","Histogram","buckets","Map","options","boundaries","record","sanitized","key","JSON","stringify","bucket","get","count","sum","bucketCounts","Array","length","fill","startTimeMs","lastTimeMs","set","placed","i","flush","values","bucketBoundaries","clear","hasData","size","Gauge","Meter","buffer","histograms","exporter","createCounter","r","push","createHistogram","histogram","createGauge","toExport","splice","export"],"sourceRoot":"../../../src","sources":["core/meter.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["sanitizeAttributes","now","DEFAULT_HISTOGRAM_BOUNDARIES","ATTR_CACHE_MAX","cachedSanitize","cache","attrs","key","JSON","stringify","sanitized","get","undefined","size","firstKey","keys","next","value","delete","set","Counter","attrCache","Map","constructor","name","pushToBuffer","add","type","timestampMs","attributes","Histogram","buckets","options","boundaries","record","bucket","count","sum","bucketCounts","Array","length","fill","startTimeMs","lastTimeMs","placed","i","flush","values","bucketBoundaries","clear","hasData","Gauge","Meter","buffer","histograms","exporter","createCounter","r","push","createHistogram","histogram","createGauge","toExport","splice","export"],"sourceRoot":"../../../src","sources":["core/meter.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * A SpanProcessor intercepts span lifecycle events.
5
+ * Implement this interface to add custom logic (e.g. enrichment, filtering)
6
+ * before spans are exported.
7
+ */
8
+
9
+ /**
10
+ * Wraps a SpanExporter: calls exporter.export() immediately when a span ends.
11
+ * This is the default processor used inside Tracer when no custom processor
12
+ * is provided.
13
+ */
14
+ export class SimpleSpanProcessor {
15
+ constructor(exporter) {
16
+ this.exporter = exporter;
17
+ }
18
+ onEnd(span) {
19
+ this.exporter.export([span]);
20
+ }
21
+ }
22
+
23
+ /** No-op processor — useful as a placeholder or in tests. */
24
+ export class NoopSpanProcessor {
25
+ onStart(_span) {}
26
+ onEnd(_span) {}
27
+ }
28
+ //# sourceMappingURL=processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SimpleSpanProcessor","constructor","exporter","onEnd","span","export","NoopSpanProcessor","onStart","_span"],"sourceRoot":"../../../src","sources":["core/processor.ts"],"mappings":";;AAGA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,mBAAmB,CAA0B;EACxDC,WAAWA,CAAkBC,QAAsB,EAAE;IAAA,KAAxBA,QAAsB,GAAtBA,QAAsB;EAAG;EAEtDC,KAAKA,CAACC,IAAkB,EAAQ;IAC9B,IAAI,CAACF,QAAQ,CAACG,MAAM,CAAC,CAACD,IAAI,CAAC,CAAC;EAC9B;AACF;;AAEA;AACA,OAAO,MAAME,iBAAiB,CAA0B;EACtDC,OAAOA,CAACC,KAAW,EAAQ,CAAC;EAC5BL,KAAKA,CAACK,KAAmB,EAAQ,CAAC;AACpC","ignoreList":[]}
@@ -6,6 +6,7 @@ import { ATTR_APP_BUILD_ID, ATTR_DEPLOYMENT_ENVIRONMENT_NAME, ATTR_DEVICE_MANUFA
6
6
  // Immutable after creation — user identity is NOT stored here.
7
7
  export function buildResource(params) {
8
8
  return Object.freeze({
9
+ ...params.extra,
9
10
  [ATTR_SERVICE_NAME]: params.serviceName,
10
11
  [ATTR_SERVICE_VERSION]: params.serviceVersion,
11
12
  [ATTR_OS_NAME]: params.osName,
@@ -1 +1 @@
1
- {"version":3,"names":["ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_APP_BUILD_ID","ATTR_DEPLOYMENT_ENVIRONMENT_NAME","ATTR_DEVICE_MANUFACTURER","ATTR_DEVICE_MODEL_NAME","ATTR_OS_NAME","ATTR_OS_VERSION","buildResource","params","Object","freeze","serviceName","serviceVersion","osName","osVersion","deviceBrand","deviceModel","deviceType","appBuild","environment"],"sourceRoot":"../../../src","sources":["core/resource.ts"],"mappings":";;AAAA,SACEA,iBAAiB,EACjBC,oBAAoB,QACf,qCAAqC;AAC5C,SACEC,iBAAiB,EACjBC,gCAAgC,EAChCC,wBAAwB,EACxBC,sBAAsB,EACtBC,YAAY,EACZC,eAAe,QACV,gDAAgD;AAcvD;AACA;AACA,OAAO,SAASC,aAAaA,CAACC,MAU7B,EAAsB;EACrB,OAAOC,MAAM,CAACC,MAAM,CAAC;IACnB,CAACX,iBAAiB,GAAGS,MAAM,CAACG,WAAW;IACvC,CAACX,oBAAoB,GAAGQ,MAAM,CAACI,cAAc;IAC7C,CAACP,YAAY,GAAGG,MAAM,CAACK,MAAM;IAC7B,CAACP,eAAe,GAAGE,MAAM,CAACM,SAAS;IACnC,CAACX,wBAAwB,GAAGK,MAAM,CAACO,WAAW;IAC9C,CAACX,sBAAsB,GAAGI,MAAM,CAACQ,WAAW;IAC5C,aAAa,EAAER,MAAM,CAACS,UAAU;IAChC,CAAChB,iBAAiB,GAAGO,MAAM,CAACU,QAAQ;IACpC,CAAChB,gCAAgC,GAAGM,MAAM,CAACW;EAC7C,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {"version":3,"names":["ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_APP_BUILD_ID","ATTR_DEPLOYMENT_ENVIRONMENT_NAME","ATTR_DEVICE_MANUFACTURER","ATTR_DEVICE_MODEL_NAME","ATTR_OS_NAME","ATTR_OS_VERSION","buildResource","params","Object","freeze","extra","serviceName","serviceVersion","osName","osVersion","deviceBrand","deviceModel","deviceType","appBuild","environment"],"sourceRoot":"../../../src","sources":["core/resource.ts"],"mappings":";;AAAA,SACEA,iBAAiB,EACjBC,oBAAoB,QACf,qCAAqC;AAC5C,SACEC,iBAAiB,EACjBC,gCAAgC,EAChCC,wBAAwB,EACxBC,sBAAsB,EACtBC,YAAY,EACZC,eAAe,QACV,gDAAgD;AAiBvD;AACA;AACA,OAAO,SAASC,aAAaA,CAACC,MAY7B,EAAsB;EACrB,OAAOC,MAAM,CAACC,MAAM,CAAC;IACnB,GAAGF,MAAM,CAACG,KAAK;IACf,CAACZ,iBAAiB,GAAGS,MAAM,CAACI,WAAW;IACvC,CAACZ,oBAAoB,GAAGQ,MAAM,CAACK,cAAc;IAC7C,CAACR,YAAY,GAAGG,MAAM,CAACM,MAAM;IAC7B,CAACR,eAAe,GAAGE,MAAM,CAACO,SAAS;IACnC,CAACZ,wBAAwB,GAAGK,MAAM,CAACQ,WAAW;IAC9C,CAACZ,sBAAsB,GAAGI,MAAM,CAACS,WAAW;IAC5C,aAAa,EAAET,MAAM,CAACU,UAAU;IAChC,CAACjB,iBAAiB,GAAGO,MAAM,CAACW,QAAQ;IACpC,CAACjB,gCAAgC,GAAGM,MAAM,CAACY;EAC7C,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * A Sampler decides whether a span should be recorded or dropped.
5
+ * Return `true` to record the span, `false` to drop it (NoopSpan is used).
6
+ */
7
+
8
+ /** Records every span (default). */
9
+ export class AlwaysOnSampler {
10
+ shouldSample() {
11
+ return true;
12
+ }
13
+ }
14
+
15
+ /** Drops every span. */
16
+ export class AlwaysOffSampler {
17
+ shouldSample() {
18
+ return false;
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Samples a deterministic fraction of traces based on the trace ID.
24
+ * Uses the first 8 bytes of the traceId to produce a 0–1 value and
25
+ * compares it against the configured ratio, matching the W3C spec intent.
26
+ *
27
+ * When there is no parent (new root trace), a random value is used instead
28
+ * so that the ratio still holds for root spans.
29
+ */
30
+ export class TraceIdRatioSampler {
31
+ constructor(ratio) {
32
+ this.ratio = ratio;
33
+ if (ratio < 0 || ratio > 1) {
34
+ throw new RangeError(`TraceIdRatioSampler: ratio must be in [0, 1], got ${ratio}`);
35
+ }
36
+ }
37
+ shouldSample(_name, parent) {
38
+ if (this.ratio <= 0) return false;
39
+ if (this.ratio >= 1) return true;
40
+ const traceId = parent?.traceId;
41
+ if (traceId && traceId.length >= 16) {
42
+ // Parse the lower 32 bits of the first 8 bytes (hex chars 8–15) as an
43
+ // unsigned integer in [0, 2^32) and normalize to [0, 1).
44
+ // parseInt with radix 16 always returns a non-negative number for 8 hex
45
+ // digits, so no bitwise operation is needed.
46
+ const lo = parseInt(traceId.slice(8, 16), 16); // [0, 0xFFFFFFFF]
47
+ const normalized = lo / 0x100000000; // [0, 1)
48
+ return normalized < this.ratio;
49
+ }
50
+
51
+ // No parent trace ID — fall back to random.
52
+ return Math.random() < this.ratio;
53
+ }
54
+ }
55
+ //# sourceMappingURL=sampler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AlwaysOnSampler","shouldSample","AlwaysOffSampler","TraceIdRatioSampler","constructor","ratio","RangeError","_name","parent","traceId","length","lo","parseInt","slice","normalized","Math","random"],"sourceRoot":"../../../src","sources":["core/sampler.ts"],"mappings":";;AAGA;AACA;AACA;AACA;;AASA;AACA,OAAO,MAAMA,eAAe,CAAoB;EAC9CC,YAAYA,CAAA,EAAY;IACtB,OAAO,IAAI;EACb;AACF;;AAEA;AACA,OAAO,MAAMC,gBAAgB,CAAoB;EAC/CD,YAAYA,CAAA,EAAY;IACtB,OAAO,KAAK;EACd;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,mBAAmB,CAAoB;EAClDC,WAAWA,CAAkBC,KAAa,EAAE;IAAA,KAAfA,KAAa,GAAbA,KAAa;IACxC,IAAIA,KAAK,GAAG,CAAC,IAAIA,KAAK,GAAG,CAAC,EAAE;MAC1B,MAAM,IAAIC,UAAU,CAClB,qDAAqDD,KAAK,EAC5D,CAAC;IACH;EACF;EAEAJ,YAAYA,CAACM,KAAa,EAAEC,MAAoB,EAAW;IACzD,IAAI,IAAI,CAACH,KAAK,IAAI,CAAC,EAAE,OAAO,KAAK;IACjC,IAAI,IAAI,CAACA,KAAK,IAAI,CAAC,EAAE,OAAO,IAAI;IAEhC,MAAMI,OAAO,GAAGD,MAAM,EAAEC,OAAO;IAC/B,IAAIA,OAAO,IAAIA,OAAO,CAACC,MAAM,IAAI,EAAE,EAAE;MACnC;MACA;MACA;MACA;MACA,MAAMC,EAAE,GAAGC,QAAQ,CAACH,OAAO,CAACI,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;MAC/C,MAAMC,UAAU,GAAGH,EAAE,GAAG,WAAW,CAAC,CAAC;MACrC,OAAOG,UAAU,GAAG,IAAI,CAACT,KAAK;IAChC;;IAEA;IACA,OAAOU,IAAI,CAACC,MAAM,CAAC,CAAC,GAAG,IAAI,CAACX,KAAK;EACnC;AACF","ignoreList":[]}
@@ -7,6 +7,10 @@ import { generateSpanId, generateTraceId } from "./ids.js";
7
7
 
8
8
  // Defined here to avoid circular dep with exporters/types.ts
9
9
 
10
+ // Forward-declared to avoid circular dep with core/processor.ts
11
+
12
+ /** A causal link to a span in a different (or the same) trace. */
13
+
10
14
  // Carries both IDs needed to link a child span into an existing trace.
11
15
 
12
16
  export class Span {
@@ -15,6 +19,7 @@ export class Span {
15
19
  // Mutable plain object — setAttribute writes directly, no full clone.
16
20
 
17
21
  events = [];
22
+ links = [];
18
23
  droppedEventsCount = 0;
19
24
  status = 'UNSET';
20
25
  statusMessage = undefined;
@@ -26,7 +31,10 @@ export class Span {
26
31
  this.kind = params.kind ?? 'INTERNAL';
27
32
  this.startTimeMs = now();
28
33
  this.attributes = params.attributes ? sanitizeAttributes(params.attributes) : {};
34
+ this.links = params.links ?? [];
29
35
  this.exporter = params.exporter;
36
+ this.processor = params.processor;
37
+ this.processor?.onStart?.(this);
30
38
  }
31
39
  setAttribute(key, value) {
32
40
  if (this.endTimeMs !== undefined) return;
@@ -68,7 +76,12 @@ export class Span {
68
76
  if (this.status === 'UNSET') {
69
77
  this.status = 'OK';
70
78
  }
71
- this.exporter?.export([this]);
79
+ // Processor takes precedence over direct exporter (processor wraps the exporter).
80
+ if (this.processor) {
81
+ this.processor.onEnd(this);
82
+ } else {
83
+ this.exporter?.export([this]);
84
+ }
72
85
  }
73
86
  }
74
87
 
@@ -84,6 +97,7 @@ export class NoopSpan {
84
97
  endTimeMs = undefined;
85
98
  attributes = {};
86
99
  events = [];
100
+ links = [];
87
101
  droppedEventsCount = 0;
88
102
  status = 'UNSET';
89
103
  statusMessage = undefined;
@@ -1 +1 @@
1
- {"version":3,"names":["ATTR_EXCEPTION_MESSAGE","ATTR_EXCEPTION_STACKTRACE","ATTR_EXCEPTION_TYPE","sanitizeAttributes","sanitizeValue","now","generateSpanId","generateTraceId","Span","MAX_EVENTS","endTimeMs","undefined","events","droppedEventsCount","status","statusMessage","constructor","params","traceId","parent","spanId","parentSpanId","name","kind","startTimeMs","attributes","exporter","setAttribute","key","value","sanitized","addEvent","attrs","length","push","timestampMs","setStatus","message","recordException","error","stack","end","export","NoopSpan","_key","_value","_name","_attrs","_status","_message","_error"],"sourceRoot":"../../../src","sources":["core/span.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["ATTR_EXCEPTION_MESSAGE","ATTR_EXCEPTION_STACKTRACE","ATTR_EXCEPTION_TYPE","sanitizeAttributes","sanitizeValue","now","generateSpanId","generateTraceId","Span","MAX_EVENTS","endTimeMs","undefined","events","links","droppedEventsCount","status","statusMessage","constructor","params","traceId","parent","spanId","parentSpanId","name","kind","startTimeMs","attributes","exporter","processor","onStart","setAttribute","key","value","sanitized","addEvent","attrs","length","push","timestampMs","setStatus","message","recordException","error","stack","end","onEnd","export","NoopSpan","_key","_value","_name","_attrs","_status","_message","_error"],"sourceRoot":"../../../src","sources":["core/span.ts"],"mappings":"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","ignoreList":[]}
@@ -7,18 +7,36 @@ export class Tracer {
7
7
  constructor(params) {
8
8
  this.exporter = params.exporter;
9
9
  this.sampleRate = params.sampleRate ?? 1.0;
10
+ this.sampler = params.sampler;
11
+ this.processors = params.processors ?? [];
10
12
  this.getUserAttributes = params.getUserAttributes;
11
13
  }
12
14
 
13
15
  // Create a span without making it the active context.
14
16
  // Use startActiveSpan() when you want sub-operations to auto-parent.
15
17
  startSpan(name, options) {
16
- if (this.sampleRate < 1.0 && Math.random() > this.sampleRate) {
18
+ // Resolve parent: explicit > current active span > none (new root trace)
19
+ const parent = options?.parent !== undefined ? options.parent ?? undefined : spanContext.current() ?? undefined;
20
+
21
+ // Sampler takes precedence over legacy sampleRate when provided.
22
+ if (this.sampler) {
23
+ if (!this.sampler.shouldSample(name, parent, options?.attributes)) {
24
+ return new NoopSpan();
25
+ }
26
+ } else if (this.sampleRate < 1.0 && Math.random() > this.sampleRate) {
17
27
  return new NoopSpan();
18
28
  }
19
29
 
20
- // Resolve parent: explicit > current active span > none (new root trace)
21
- const parent = options?.parent !== undefined ? options.parent ?? undefined : spanContext.current() ?? undefined;
30
+ // Build a composite processor if multiple processors are registered,
31
+ // otherwise use a single processor or fall back to direct exporter.
32
+ const processor = this.processors.length > 1 ? {
33
+ onStart: s => {
34
+ for (const p of this.processors) p.onStart?.(s);
35
+ },
36
+ onEnd: s => {
37
+ for (const p of this.processors) p.onEnd(s);
38
+ }
39
+ } : this.processors[0];
22
40
  const userAttrs = this.getUserAttributes();
23
41
  return new Span({
24
42
  name,
@@ -27,8 +45,10 @@ export class Tracer {
27
45
  ...userAttrs,
28
46
  ...options?.attributes
29
47
  },
48
+ links: options?.links,
30
49
  parent,
31
- exporter: this.exporter
50
+ exporter: processor ? undefined : this.exporter,
51
+ processor
32
52
  });
33
53
  }
34
54
 
@@ -1 +1 @@
1
- {"version":3,"names":["ATTR_EXCEPTION_MESSAGE","ATTR_EXCEPTION_STACKTRACE","ATTR_EXCEPTION_TYPE","Span","NoopSpan","spanContext","spanContextInternal","Tracer","constructor","params","exporter","sampleRate","getUserAttributes","startSpan","name","options","Math","random","parent","undefined","current","userAttrs","kind","attributes","startActiveSpan","optionsOrFn","fn","callback","span","token","push","cleanup","isError","err","Error","setStatus","message","end","pop","result","Promise","then","v","e","withSpan","recordEvent","addEvent","recordException","error","stack"],"sourceRoot":"../../../src","sources":["core/tracer.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["ATTR_EXCEPTION_MESSAGE","ATTR_EXCEPTION_STACKTRACE","ATTR_EXCEPTION_TYPE","Span","NoopSpan","spanContext","spanContextInternal","Tracer","constructor","params","exporter","sampleRate","sampler","processors","getUserAttributes","startSpan","name","options","parent","undefined","current","shouldSample","attributes","Math","random","processor","length","onStart","s","p","onEnd","userAttrs","kind","links","startActiveSpan","optionsOrFn","fn","callback","span","token","push","cleanup","isError","err","Error","setStatus","message","end","pop","result","Promise","then","v","e","withSpan","recordEvent","addEvent","recordException","error","stack"],"sourceRoot":"../../../src","sources":["core/tracer.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Fans out span export calls to multiple exporters.
5
+ * All exporters receive the same batch; errors in one do not affect others.
6
+ */
7
+ export class MultiSpanExporter {
8
+ constructor(exporters) {
9
+ this.exporters = exporters;
10
+ }
11
+ export(spans) {
12
+ for (const exp of this.exporters) {
13
+ try {
14
+ exp.export(spans);
15
+ } catch {
16
+ // Isolate failures — one bad exporter must not drop data from others.
17
+ }
18
+ }
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Fans out metric export calls to multiple exporters.
24
+ */
25
+ export class MultiMetricExporter {
26
+ constructor(exporters) {
27
+ this.exporters = exporters;
28
+ }
29
+ export(metrics) {
30
+ for (const exp of this.exporters) {
31
+ try {
32
+ exp.export(metrics);
33
+ } catch {
34
+ // Isolate failures.
35
+ }
36
+ }
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Fans out log export calls to multiple exporters.
42
+ */
43
+ export class MultiLogExporter {
44
+ constructor(exporters) {
45
+ this.exporters = exporters;
46
+ }
47
+ export(logs) {
48
+ for (const exp of this.exporters) {
49
+ try {
50
+ exp.export(logs);
51
+ } catch {
52
+ // Isolate failures.
53
+ }
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=multi-exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MultiSpanExporter","constructor","exporters","export","spans","exp","MultiMetricExporter","metrics","MultiLogExporter","logs"],"sourceRoot":"../../../src","sources":["exporters/multi-exporter.ts"],"mappings":";;AAQA;AACA;AACA;AACA;AACA,OAAO,MAAMA,iBAAiB,CAAyB;EACrDC,WAAWA,CAAkBC,SAAyB,EAAE;IAAA,KAA3BA,SAAyB,GAAzBA,SAAyB;EAAG;EAEzDC,MAAMA,CAACC,KAAqB,EAAQ;IAClC,KAAK,MAAMC,GAAG,IAAI,IAAI,CAACH,SAAS,EAAE;MAChC,IAAI;QACFG,GAAG,CAACF,MAAM,CAACC,KAAK,CAAC;MACnB,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF;AACF;;AAEA;AACA;AACA;AACA,OAAO,MAAME,mBAAmB,CAA2B;EACzDL,WAAWA,CAAkBC,SAA2B,EAAE;IAAA,KAA7BA,SAA2B,GAA3BA,SAA2B;EAAG;EAE3DC,MAAMA,CAACI,OAAuB,EAAQ;IACpC,KAAK,MAAMF,GAAG,IAAI,IAAI,CAACH,SAAS,EAAE;MAChC,IAAI;QACFG,GAAG,CAACF,MAAM,CAACI,OAAO,CAAC;MACrB,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF;AACF;;AAEA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,CAAwB;EACnDP,WAAWA,CAAkBC,SAAwB,EAAE;IAAA,KAA1BA,SAAwB,GAAxBA,SAAwB;EAAG;EAExDC,MAAMA,CAACM,IAAiB,EAAQ;IAC9B,KAAK,MAAMJ,GAAG,IAAI,IAAI,CAACH,SAAS,EAAE;MAChC,IAAI;QACFG,GAAG,CAACF,MAAM,CAACM,IAAI,CAAC;MAClB,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF;AACF","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { Wal, fetchWithRetry } from "./wal.js";
4
+ import { SDK_VERSION } from "../version.js";
4
5
 
5
6
  // ─── OTLP attribute value serialization ──────────────────────────────────────
6
7
 
@@ -71,6 +72,8 @@ export class OtlpHttpExporter {
71
72
  this.timer_ = setInterval(() => {
72
73
  this.flush();
73
74
  }, interval);
75
+ // Allow Node.js to exit cleanly in test environments without calling destroy().
76
+ if (typeof this.timer_.unref === 'function') this.timer_.unref();
74
77
  }
75
78
 
76
79
  // Called by OtelSDK.init() after buildResource() — not part of SpanExporter.
@@ -139,7 +142,7 @@ export class OtlpHttpExporter {
139
142
  scopeSpans: [{
140
143
  scope: {
141
144
  name: 'react-native-otel',
142
- version: '0.1.0'
145
+ version: SDK_VERSION
143
146
  },
144
147
  spans: spans.map(s => this.toOtlpSpan(s))
145
148
  }]
@@ -164,6 +167,11 @@ export class OtlpHttpExporter {
164
167
  timeUnixNano: msToNano(event.timestampMs),
165
168
  attributes: toOtlpAttributes(event.attributes)
166
169
  })),
170
+ links: span.links.map(link => ({
171
+ traceId: link.traceId,
172
+ spanId: link.spanId,
173
+ attributes: link.attributes ? toOtlpAttributes(link.attributes) : []
174
+ })),
167
175
  droppedEventsCount: span.droppedEventsCount,
168
176
  status: {
169
177
  code: SPAN_STATUS_CODE[span.status] ?? 0,
@@ -182,12 +190,19 @@ export class OtlpHttpExporter {
182
190
  const AGGREGATION_TEMPORALITY_DELTA = 1;
183
191
  const AGGREGATION_TEMPORALITY_CUMULATIVE = 2;
184
192
  export class OtlpHttpMetricExporter {
193
+ buffer_ = [];
185
194
  constructor(options) {
186
195
  this.metricsEndpoint = options.endpoint.replace(/\/$/, '') + '/v1/metrics';
187
196
  this.headers = {
188
197
  'Content-Type': 'application/json',
189
198
  ...options.headers
190
199
  };
200
+ const interval = options.flushIntervalMs ?? 30_000;
201
+ this.timer_ = setInterval(() => {
202
+ this.flush();
203
+ }, interval);
204
+ // Allow Node.js to exit cleanly in test environments without calling destroy().
205
+ if (typeof this.timer_.unref === 'function') this.timer_.unref();
191
206
  }
192
207
  setResource(resource) {
193
208
  this.resource_ = resource;
@@ -204,13 +219,30 @@ export class OtlpHttpMetricExporter {
204
219
  }
205
220
  export(metrics) {
206
221
  if (metrics.length === 0) return;
222
+ this.buffer_.push(...metrics);
223
+ }
224
+
225
+ // Drain buffered metrics and deliver them immediately.
226
+ // Called by the internal timer and also useful for testing / explicit flush.
227
+ flush() {
228
+ if (this.buffer_.length === 0) return;
229
+ const batch = this.buffer_.splice(0);
207
230
  if (this.wal_) {
208
- const id = this.wal_.write(metrics);
209
- this.deliverBatch(metrics, id);
231
+ const id = this.wal_.write(batch);
232
+ this.deliverBatch(batch, id);
210
233
  } else {
211
- this.deliverBatch(metrics, undefined);
234
+ this.deliverBatch(batch, undefined);
212
235
  }
213
236
  }
237
+
238
+ // Clear the flush timer and send any remaining buffered metrics.
239
+ destroy() {
240
+ if (this.timer_ !== undefined) {
241
+ clearInterval(this.timer_);
242
+ this.timer_ = undefined;
243
+ }
244
+ this.flush();
245
+ }
214
246
  deliverBatch(metrics, walId) {
215
247
  const body = this.buildBody(metrics);
216
248
  fetchWithRetry(this.metricsEndpoint, {
@@ -296,7 +328,7 @@ export class OtlpHttpMetricExporter {
296
328
  scopeMetrics: [{
297
329
  scope: {
298
330
  name: 'react-native-otel',
299
- version: '0.1.0'
331
+ version: SDK_VERSION
300
332
  },
301
333
  metrics: otlpMetrics
302
334
  }]
@@ -329,10 +361,24 @@ export class OtlpHttpLogExporter {
329
361
  this.timer_ = setInterval(() => {
330
362
  this.flush();
331
363
  }, interval);
364
+ // Allow Node.js to exit cleanly in test environments without calling destroy().
365
+ if (typeof this.timer_.unref === 'function') this.timer_.unref();
332
366
  }
333
367
  setResource(resource) {
334
368
  this.resource_ = resource;
335
369
  }
370
+
371
+ // Called by OtelSDK.init() when a StorageAdapter is configured.
372
+ setStorage(storage) {
373
+ this.wal_ = new Wal(storage, '@react-native-otel/wal/logs');
374
+ this.replayWal();
375
+ }
376
+ replayWal() {
377
+ if (!this.wal_) return;
378
+ for (const batch of this.wal_.readAll()) {
379
+ this.deliverBatch(batch.data, batch.id);
380
+ }
381
+ }
336
382
  export(logs) {
337
383
  this.buffer.push(...logs);
338
384
  if (this.buffer.length >= this.batchSize) {
@@ -342,7 +388,12 @@ export class OtlpHttpLogExporter {
342
388
  flush() {
343
389
  if (this.buffer.length === 0) return;
344
390
  const batch = this.buffer.splice(0);
345
- this.send(batch);
391
+ if (this.wal_) {
392
+ const id = this.wal_.write(batch);
393
+ this.deliverBatch(batch, id);
394
+ } else {
395
+ this.deliverBatch(batch, undefined);
396
+ }
346
397
  }
347
398
  destroy() {
348
399
  if (this.timer_ !== undefined) {
@@ -351,6 +402,15 @@ export class OtlpHttpLogExporter {
351
402
  }
352
403
  this.flush();
353
404
  }
405
+ deliverBatch(logs, walId) {
406
+ this.send(logs).then(success => {
407
+ if (success && walId !== undefined) {
408
+ this.wal_?.delete(walId);
409
+ }
410
+ }).catch(() => {
411
+ // Leave in WAL for next session
412
+ });
413
+ }
354
414
  send(logs) {
355
415
  const resourceAttrs = this.resource_ ? toOtlpAttributes(this.resource_) : [];
356
416
  const body = JSON.stringify({
@@ -361,7 +421,7 @@ export class OtlpHttpLogExporter {
361
421
  scopeLogs: [{
362
422
  scope: {
363
423
  name: 'react-native-otel',
364
- version: '0.1.0'
424
+ version: SDK_VERSION
365
425
  },
366
426
  logRecords: logs.map(log => ({
367
427
  timeUnixNano: msToNano(log.timestampMs),
@@ -381,11 +441,11 @@ export class OtlpHttpLogExporter {
381
441
  }]
382
442
  }]
383
443
  });
384
- fetchWithRetry(this.logsEndpoint, {
444
+ return fetchWithRetry(this.logsEndpoint, {
385
445
  method: 'POST',
386
446
  headers: this.headers,
387
447
  body
388
- }).catch(() => {});
448
+ });
389
449
  }
390
450
  }
391
451
  //# sourceMappingURL=otlp-http-exporter.js.map