react-native-otel 0.1.0

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 (105) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +37 -0
  3. package/lib/module/context/span-context.js +14 -0
  4. package/lib/module/context/span-context.js.map +1 -0
  5. package/lib/module/core/attributes.js +43 -0
  6. package/lib/module/core/attributes.js.map +1 -0
  7. package/lib/module/core/clock.js +8 -0
  8. package/lib/module/core/clock.js.map +1 -0
  9. package/lib/module/core/ids.js +16 -0
  10. package/lib/module/core/ids.js.map +1 -0
  11. package/lib/module/core/log-record.js +41 -0
  12. package/lib/module/core/log-record.js.map +1 -0
  13. package/lib/module/core/meter.js +70 -0
  14. package/lib/module/core/meter.js.map +1 -0
  15. package/lib/module/core/resource.js +20 -0
  16. package/lib/module/core/resource.js.map +1 -0
  17. package/lib/module/core/span.js +96 -0
  18. package/lib/module/core/span.js.map +1 -0
  19. package/lib/module/core/tracer.js +48 -0
  20. package/lib/module/core/tracer.js.map +1 -0
  21. package/lib/module/exporters/console-exporter.js +53 -0
  22. package/lib/module/exporters/console-exporter.js.map +1 -0
  23. package/lib/module/exporters/otlp-http-exporter.js +317 -0
  24. package/lib/module/exporters/otlp-http-exporter.js.map +1 -0
  25. package/lib/module/exporters/types.js +4 -0
  26. package/lib/module/exporters/types.js.map +1 -0
  27. package/lib/module/index.js +24 -0
  28. package/lib/module/index.js.map +1 -0
  29. package/lib/module/instrumentation/errors.js +63 -0
  30. package/lib/module/instrumentation/errors.js.map +1 -0
  31. package/lib/module/instrumentation/lifecycle.js +15 -0
  32. package/lib/module/instrumentation/lifecycle.js.map +1 -0
  33. package/lib/module/instrumentation/navigation.js +51 -0
  34. package/lib/module/instrumentation/navigation.js.map +1 -0
  35. package/lib/module/instrumentation/network.js +183 -0
  36. package/lib/module/instrumentation/network.js.map +1 -0
  37. package/lib/module/package.json +1 -0
  38. package/lib/module/react/OtelProvider.js +57 -0
  39. package/lib/module/react/OtelProvider.js.map +1 -0
  40. package/lib/module/react/useOtel.js +12 -0
  41. package/lib/module/react/useOtel.js.map +1 -0
  42. package/lib/module/sdk.js +127 -0
  43. package/lib/module/sdk.js.map +1 -0
  44. package/lib/typescript/package.json +1 -0
  45. package/lib/typescript/src/context/span-context.d.ts +9 -0
  46. package/lib/typescript/src/context/span-context.d.ts.map +1 -0
  47. package/lib/typescript/src/core/attributes.d.ts +6 -0
  48. package/lib/typescript/src/core/attributes.d.ts.map +1 -0
  49. package/lib/typescript/src/core/clock.d.ts +2 -0
  50. package/lib/typescript/src/core/clock.d.ts.map +1 -0
  51. package/lib/typescript/src/core/ids.d.ts +3 -0
  52. package/lib/typescript/src/core/ids.d.ts.map +1 -0
  53. package/lib/typescript/src/core/log-record.d.ts +15 -0
  54. package/lib/typescript/src/core/log-record.d.ts.map +1 -0
  55. package/lib/typescript/src/core/meter.d.ts +30 -0
  56. package/lib/typescript/src/core/meter.d.ts.map +1 -0
  57. package/lib/typescript/src/core/resource.d.ts +25 -0
  58. package/lib/typescript/src/core/resource.d.ts.map +1 -0
  59. package/lib/typescript/src/core/span.d.ts +77 -0
  60. package/lib/typescript/src/core/span.d.ts.map +1 -0
  61. package/lib/typescript/src/core/tracer.d.ts +21 -0
  62. package/lib/typescript/src/core/tracer.d.ts.map +1 -0
  63. package/lib/typescript/src/exporters/console-exporter.d.ts +17 -0
  64. package/lib/typescript/src/exporters/console-exporter.d.ts.map +1 -0
  65. package/lib/typescript/src/exporters/otlp-http-exporter.d.ts +58 -0
  66. package/lib/typescript/src/exporters/otlp-http-exporter.d.ts.map +1 -0
  67. package/lib/typescript/src/exporters/types.d.ts +25 -0
  68. package/lib/typescript/src/exporters/types.d.ts.map +1 -0
  69. package/lib/typescript/src/index.d.ts +25 -0
  70. package/lib/typescript/src/index.d.ts.map +1 -0
  71. package/lib/typescript/src/instrumentation/errors.d.ts +15 -0
  72. package/lib/typescript/src/instrumentation/errors.d.ts.map +1 -0
  73. package/lib/typescript/src/instrumentation/lifecycle.d.ts +3 -0
  74. package/lib/typescript/src/instrumentation/lifecycle.d.ts.map +1 -0
  75. package/lib/typescript/src/instrumentation/navigation.d.ts +7 -0
  76. package/lib/typescript/src/instrumentation/navigation.d.ts.map +1 -0
  77. package/lib/typescript/src/instrumentation/network.d.ts +33 -0
  78. package/lib/typescript/src/instrumentation/network.d.ts.map +1 -0
  79. package/lib/typescript/src/react/OtelProvider.d.ts +21 -0
  80. package/lib/typescript/src/react/OtelProvider.d.ts.map +1 -0
  81. package/lib/typescript/src/react/useOtel.d.ts +3 -0
  82. package/lib/typescript/src/react/useOtel.d.ts.map +1 -0
  83. package/lib/typescript/src/sdk.d.ts +50 -0
  84. package/lib/typescript/src/sdk.d.ts.map +1 -0
  85. package/package.json +125 -0
  86. package/src/context/span-context.ts +17 -0
  87. package/src/core/attributes.ts +61 -0
  88. package/src/core/clock.ts +5 -0
  89. package/src/core/ids.ts +15 -0
  90. package/src/core/log-record.ts +58 -0
  91. package/src/core/meter.ts +82 -0
  92. package/src/core/resource.ts +50 -0
  93. package/src/core/span.ts +161 -0
  94. package/src/core/tracer.ts +75 -0
  95. package/src/exporters/console-exporter.ts +89 -0
  96. package/src/exporters/otlp-http-exporter.ts +377 -0
  97. package/src/exporters/types.ts +29 -0
  98. package/src/index.ts +63 -0
  99. package/src/instrumentation/errors.ts +95 -0
  100. package/src/instrumentation/lifecycle.ts +17 -0
  101. package/src/instrumentation/navigation.ts +61 -0
  102. package/src/instrumentation/network.ts +253 -0
  103. package/src/react/OtelProvider.tsx +98 -0
  104. package/src/react/useOtel.ts +14 -0
  105. package/src/sdk.ts +179 -0
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Wahab Balogun
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # react-native-otel
2
+
3
+ Lightweight OpenTelemetry SDK for React Native
4
+
5
+ ## Installation
6
+
7
+
8
+ ```sh
9
+ npm install react-native-otel
10
+ ```
11
+
12
+
13
+ ## Usage
14
+
15
+
16
+ ```js
17
+ import { multiply } from 'react-native-otel';
18
+
19
+ // ...
20
+
21
+ const result = await multiply(3, 7);
22
+ ```
23
+
24
+
25
+ ## Contributing
26
+
27
+ - [Development workflow](CONTRIBUTING.md#development-workflow)
28
+ - [Sending a pull request](CONTRIBUTING.md#sending-a-pull-request)
29
+ - [Code of conduct](CODE_OF_CONDUCT.md)
30
+
31
+ ## License
32
+
33
+ MIT
34
+
35
+ ---
36
+
37
+ Made with [create-react-native-library](https://github.com/callstack/react-native-builder-bob)
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ // Module-level singleton. Tracks only the current active screen span.
4
+ // Network spans do NOT touch this context (handled via activeNetworkSpans map).
5
+ class SpanContextManager {
6
+ setCurrent(span) {
7
+ this.current_ = span;
8
+ }
9
+ current() {
10
+ return this.current_;
11
+ }
12
+ }
13
+ export const spanContext = new SpanContextManager();
14
+ //# sourceMappingURL=span-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SpanContextManager","setCurrent","span","current_","current","spanContext"],"sourceRoot":"../../../src","sources":["context/span-context.ts"],"mappings":";;AAEA;AACA;AACA,MAAMA,kBAAkB,CAAC;EAGvBC,UAAUA,CAACC,IAAiC,EAAQ;IAClD,IAAI,CAACC,QAAQ,GAAGD,IAAI;EACtB;EAEAE,OAAOA,CAAA,EAAgC;IACrC,OAAO,IAAI,CAACD,QAAQ;EACtB;AACF;AAEA,OAAO,MAAME,WAAW,GAAG,IAAIL,kBAAkB,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ let maxStringLength = 1024;
4
+ export function setMaxStringLength(length) {
5
+ maxStringLength = length;
6
+ }
7
+ // Sanitize a single value. Returns undefined for null/undefined inputs so the
8
+ // caller can skip writing the key entirely — no object allocation needed.
9
+ // Accepts `unknown` so loose props (e.g. from analytics trackEvent) are safe.
10
+ export function sanitizeValue(value) {
11
+ if (value === undefined || value === null) return undefined;
12
+ if (typeof value === 'string') {
13
+ return value.length > maxStringLength ? value.slice(0, maxStringLength) : value;
14
+ }
15
+ if (typeof value === 'number' || typeof value === 'boolean') return value;
16
+ if (Array.isArray(value)) {
17
+ return value.map(v => typeof v === 'string' && v.length > maxStringLength ? v.slice(0, maxStringLength) : v);
18
+ }
19
+ // Plain objects → JSON string so they don't become '[object Object]'
20
+ if (typeof value === 'object') {
21
+ try {
22
+ const json = JSON.stringify(value);
23
+ return json.length > maxStringLength ? json.slice(0, maxStringLength) : json;
24
+ } catch {
25
+ return undefined;
26
+ }
27
+ }
28
+ return undefined;
29
+ }
30
+
31
+ // Bulk sanitize used once in the Span constructor and addEvent.
32
+ // Accepts Record<string, unknown> so callers don't need to pre-cast.
33
+ export function sanitizeAttributes(attrs) {
34
+ const result = {};
35
+ for (const key of Object.keys(attrs)) {
36
+ const sanitized = sanitizeValue(attrs[key]);
37
+ if (sanitized !== undefined) {
38
+ result[key] = sanitized;
39
+ }
40
+ }
41
+ return result;
42
+ }
43
+ //# sourceMappingURL=attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["maxStringLength","setMaxStringLength","length","sanitizeValue","value","undefined","slice","Array","isArray","map","v","json","JSON","stringify","sanitizeAttributes","attrs","result","key","Object","keys","sanitized"],"sourceRoot":"../../../src","sources":["core/attributes.ts"],"mappings":";;AAAA,IAAIA,eAAe,GAAG,IAAI;AAE1B,OAAO,SAASC,kBAAkBA,CAACC,MAAc,EAAQ;EACvDF,eAAe,GAAGE,MAAM;AAC1B;AAWA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAACC,KAAc,EAA8B;EACxE,IAAIA,KAAK,KAAKC,SAAS,IAAID,KAAK,KAAK,IAAI,EAAE,OAAOC,SAAS;EAC3D,IAAI,OAAOD,KAAK,KAAK,QAAQ,EAAE;IAC7B,OAAOA,KAAK,CAACF,MAAM,GAAGF,eAAe,GACjCI,KAAK,CAACE,KAAK,CAAC,CAAC,EAAEN,eAAe,CAAC,GAC/BI,KAAK;EACX;EACA,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,OAAOA,KAAK,KAAK,SAAS,EAAE,OAAOA,KAAK;EACzE,IAAIG,KAAK,CAACC,OAAO,CAACJ,KAAK,CAAC,EAAE;IACxB,OAAQA,KAAK,CAAeK,GAAG,CAAEC,CAAC,IAChC,OAAOA,CAAC,KAAK,QAAQ,IAAIA,CAAC,CAACR,MAAM,GAAGF,eAAe,GAC/CU,CAAC,CAACJ,KAAK,CAAC,CAAC,EAAEN,eAAe,CAAC,GAC3BU,CACN,CAAC;EACH;EACA;EACA,IAAI,OAAON,KAAK,KAAK,QAAQ,EAAE;IAC7B,IAAI;MACF,MAAMO,IAAI,GAAGC,IAAI,CAACC,SAAS,CAACT,KAAK,CAAC;MAClC,OAAOO,IAAI,CAACT,MAAM,GAAGF,eAAe,GAChCW,IAAI,CAACL,KAAK,CAAC,CAAC,EAAEN,eAAe,CAAC,GAC9BW,IAAI;IACV,CAAC,CAAC,MAAM;MACN,OAAON,SAAS;IAClB;EACF;EACA,OAAOA,SAAS;AAClB;;AAEA;AACA;AACA,OAAO,SAASS,kBAAkBA,CAChCC,KAA2C,EAC/B;EACZ,MAAMC,MAAkB,GAAG,CAAC,CAAC;EAC7B,KAAK,MAAMC,GAAG,IAAIC,MAAM,CAACC,IAAI,CAACJ,KAAK,CAAC,EAAE;IACpC,MAAMK,SAAS,GAAGjB,aAAa,CAACY,KAAK,CAACE,GAAG,CAAC,CAAC;IAC3C,IAAIG,SAAS,KAAKf,SAAS,EAAE;MAC3BW,MAAM,CAACC,GAAG,CAAC,GAAGG,SAAS;IACzB;EACF;EACA,OAAOJ,MAAM;AACf","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ // Returns current time in milliseconds.
4
+ // Nanosecond precision is unavailable in RN/Hermes.
5
+ export function now() {
6
+ return Date.now();
7
+ }
8
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["now","Date"],"sourceRoot":"../../../src","sources":["core/clock.ts"],"mappings":";;AAAA;AACA;AACA,OAAO,SAASA,GAAGA,CAAA,EAAW;EAC5B,OAAOC,IAAI,CAACD,GAAG,CAAC,CAAC;AACnB","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ function randomHex(length) {
4
+ let result = '';
5
+ for (let i = 0; i < length; i++) {
6
+ result += Math.floor(Math.random() * 16).toString(16);
7
+ }
8
+ return result;
9
+ }
10
+ export function generateTraceId() {
11
+ return randomHex(32);
12
+ }
13
+ export function generateSpanId() {
14
+ return randomHex(16);
15
+ }
16
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["randomHex","length","result","i","Math","floor","random","toString","generateTraceId","generateSpanId"],"sourceRoot":"../../../src","sources":["core/ids.ts"],"mappings":";;AAAA,SAASA,SAASA,CAACC,MAAc,EAAU;EACzC,IAAIC,MAAM,GAAG,EAAE;EACf,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,MAAM,EAAEE,CAAC,EAAE,EAAE;IAC/BD,MAAM,IAAIE,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC;EACvD;EACA,OAAOL,MAAM;AACf;AAEA,OAAO,SAASM,eAAeA,CAAA,EAAW;EACxC,OAAOR,SAAS,CAAC,EAAE,CAAC;AACtB;AAEA,OAAO,SAASS,cAAcA,CAAA,EAAW;EACvC,OAAOT,SAAS,CAAC,EAAE,CAAC;AACtB","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ import { sanitizeAttributes } from "./attributes.js";
4
+ import { now } from "./clock.js";
5
+ import { spanContext } from "../context/span-context.js";
6
+ export class OtelLogger {
7
+ constructor(exporter) {
8
+ this.exporter = exporter;
9
+ }
10
+ emit(severity, body, attrs) {
11
+ const current = spanContext.current();
12
+ const record = {
13
+ timestampMs: now(),
14
+ severity,
15
+ body,
16
+ traceId: current?.traceId,
17
+ spanId: current?.spanId,
18
+ attributes: attrs ? sanitizeAttributes(attrs) : {}
19
+ };
20
+ this.exporter?.export([record]);
21
+ }
22
+ trace(body, attrs) {
23
+ this.emit('TRACE', body, attrs);
24
+ }
25
+ debug(body, attrs) {
26
+ this.emit('DEBUG', body, attrs);
27
+ }
28
+ info(body, attrs) {
29
+ this.emit('INFO', body, attrs);
30
+ }
31
+ warn(body, attrs) {
32
+ this.emit('WARN', body, attrs);
33
+ }
34
+ error(body, attrs) {
35
+ this.emit('ERROR', body, attrs);
36
+ }
37
+ fatal(body, attrs) {
38
+ this.emit('FATAL', body, attrs);
39
+ }
40
+ }
41
+ //# sourceMappingURL=log-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sanitizeAttributes","now","spanContext","OtelLogger","constructor","exporter","emit","severity","body","attrs","current","record","timestampMs","traceId","spanId","attributes","export","trace","debug","info","warn","error","fatal"],"sourceRoot":"../../../src","sources":["core/log-record.ts"],"mappings":";;AAEA,SAASA,kBAAkB,QAAQ,iBAAc;AACjD,SAASC,GAAG,QAAQ,YAAS;AAC7B,SAASC,WAAW,QAAQ,4BAAyB;AAUrD,OAAO,MAAMC,UAAU,CAAC;EAGtBC,WAAWA,CAACC,QAAsB,EAAE;IAClC,IAAI,CAACA,QAAQ,GAAGA,QAAQ;EAC1B;EAEQC,IAAIA,CAACC,QAAqB,EAAEC,IAAY,EAAEC,KAAkB,EAAQ;IAC1E,MAAMC,OAAO,GAAGR,WAAW,CAACQ,OAAO,CAAC,CAAC;IACrC,MAAMC,MAAiB,GAAG;MACxBC,WAAW,EAAEX,GAAG,CAAC,CAAC;MAClBM,QAAQ;MACRC,IAAI;MACJK,OAAO,EAAEH,OAAO,EAAEG,OAAO;MACzBC,MAAM,EAAEJ,OAAO,EAAEI,MAAM;MACvBC,UAAU,EAAEN,KAAK,GAAGT,kBAAkB,CAACS,KAAK,CAAC,GAAG,CAAC;IACnD,CAAC;IACD,IAAI,CAACJ,QAAQ,EAAEW,MAAM,CAAC,CAACL,MAAM,CAAC,CAAC;EACjC;EAEAM,KAAKA,CAACT,IAAY,EAAEC,KAAkB,EAAQ;IAC5C,IAAI,CAACH,IAAI,CAAC,OAAO,EAAEE,IAAI,EAAEC,KAAK,CAAC;EACjC;EAEAS,KAAKA,CAACV,IAAY,EAAEC,KAAkB,EAAQ;IAC5C,IAAI,CAACH,IAAI,CAAC,OAAO,EAAEE,IAAI,EAAEC,KAAK,CAAC;EACjC;EAEAU,IAAIA,CAACX,IAAY,EAAEC,KAAkB,EAAQ;IAC3C,IAAI,CAACH,IAAI,CAAC,MAAM,EAAEE,IAAI,EAAEC,KAAK,CAAC;EAChC;EAEAW,IAAIA,CAACZ,IAAY,EAAEC,KAAkB,EAAQ;IAC3C,IAAI,CAACH,IAAI,CAAC,MAAM,EAAEE,IAAI,EAAEC,KAAK,CAAC;EAChC;EAEAY,KAAKA,CAACb,IAAY,EAAEC,KAAkB,EAAQ;IAC5C,IAAI,CAACH,IAAI,CAAC,OAAO,EAAEE,IAAI,EAAEC,KAAK,CAAC;EACjC;EAEAa,KAAKA,CAACd,IAAY,EAAEC,KAAkB,EAAQ;IAC5C,IAAI,CAACH,IAAI,CAAC,OAAO,EAAEE,IAAI,EAAEC,KAAK,CAAC;EACjC;AACF","ignoreList":[]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ import { sanitizeAttributes } from "./attributes.js";
4
+ import { now } from "./clock.js";
5
+ export class Counter {
6
+ constructor(name, pushToBuffer) {
7
+ this.name = name;
8
+ this.pushToBuffer = pushToBuffer;
9
+ }
10
+ add(value, attrs) {
11
+ this.pushToBuffer({
12
+ type: 'counter',
13
+ name: this.name,
14
+ value,
15
+ timestampMs: now(),
16
+ attributes: attrs ? sanitizeAttributes(attrs) : {}
17
+ });
18
+ }
19
+ }
20
+ export class Histogram {
21
+ constructor(name, pushToBuffer) {
22
+ this.name = name;
23
+ this.pushToBuffer = pushToBuffer;
24
+ }
25
+ record(value, attrs) {
26
+ this.pushToBuffer({
27
+ type: 'histogram',
28
+ name: this.name,
29
+ value,
30
+ timestampMs: now(),
31
+ attributes: attrs ? sanitizeAttributes(attrs) : {}
32
+ });
33
+ }
34
+ }
35
+ export class Gauge {
36
+ constructor(name, pushToBuffer) {
37
+ this.name = name;
38
+ this.pushToBuffer = pushToBuffer;
39
+ }
40
+ set(value, attrs) {
41
+ this.pushToBuffer({
42
+ type: 'gauge',
43
+ name: this.name,
44
+ value,
45
+ timestampMs: now(),
46
+ attributes: attrs ? sanitizeAttributes(attrs) : {}
47
+ });
48
+ }
49
+ }
50
+ export class Meter {
51
+ buffer = [];
52
+ constructor(exporter) {
53
+ this.exporter = exporter;
54
+ }
55
+ createCounter(name) {
56
+ return new Counter(name, r => this.buffer.push(r));
57
+ }
58
+ createHistogram(name) {
59
+ return new Histogram(name, r => this.buffer.push(r));
60
+ }
61
+ createGauge(name) {
62
+ return new Gauge(name, r => this.buffer.push(r));
63
+ }
64
+ flush() {
65
+ if (this.buffer.length === 0) return;
66
+ const toExport = this.buffer.splice(0, this.buffer.length);
67
+ this.exporter?.export(toExport);
68
+ }
69
+ }
70
+ //# sourceMappingURL=meter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sanitizeAttributes","now","Counter","constructor","name","pushToBuffer","add","value","attrs","type","timestampMs","attributes","Histogram","record","Gauge","set","Meter","buffer","exporter","createCounter","r","push","createHistogram","createGauge","flush","length","toExport","splice","export"],"sourceRoot":"../../../src","sources":["core/meter.ts"],"mappings":";;AAEA,SAASA,kBAAkB,QAAQ,iBAAc;AACjD,SAASC,GAAG,QAAQ,YAAS;AAE7B,OAAO,MAAMC,OAAO,CAAC;EACnBC,WAAWA,CACDC,IAAY,EACZC,YAA4C,EACpD;IAAA,KAFQD,IAAY,GAAZA,IAAY;IAAA,KACZC,YAA4C,GAA5CA,YAA4C;EACnD;EAEHC,GAAGA,CAACC,KAAa,EAAEC,KAAkB,EAAQ;IAC3C,IAAI,CAACH,YAAY,CAAC;MAChBI,IAAI,EAAE,SAAS;MACfL,IAAI,EAAE,IAAI,CAACA,IAAI;MACfG,KAAK;MACLG,WAAW,EAAET,GAAG,CAAC,CAAC;MAClBU,UAAU,EAAEH,KAAK,GAAGR,kBAAkB,CAACQ,KAAK,CAAC,GAAG,CAAC;IACnD,CAAC,CAAC;EACJ;AACF;AAEA,OAAO,MAAMI,SAAS,CAAC;EACrBT,WAAWA,CACDC,IAAY,EACZC,YAA4C,EACpD;IAAA,KAFQD,IAAY,GAAZA,IAAY;IAAA,KACZC,YAA4C,GAA5CA,YAA4C;EACnD;EAEHQ,MAAMA,CAACN,KAAa,EAAEC,KAAkB,EAAQ;IAC9C,IAAI,CAACH,YAAY,CAAC;MAChBI,IAAI,EAAE,WAAW;MACjBL,IAAI,EAAE,IAAI,CAACA,IAAI;MACfG,KAAK;MACLG,WAAW,EAAET,GAAG,CAAC,CAAC;MAClBU,UAAU,EAAEH,KAAK,GAAGR,kBAAkB,CAACQ,KAAK,CAAC,GAAG,CAAC;IACnD,CAAC,CAAC;EACJ;AACF;AAEA,OAAO,MAAMM,KAAK,CAAC;EACjBX,WAAWA,CACDC,IAAY,EACZC,YAA4C,EACpD;IAAA,KAFQD,IAAY,GAAZA,IAAY;IAAA,KACZC,YAA4C,GAA5CA,YAA4C;EACnD;EAEHU,GAAGA,CAACR,KAAa,EAAEC,KAAkB,EAAQ;IAC3C,IAAI,CAACH,YAAY,CAAC;MAChBI,IAAI,EAAE,OAAO;MACbL,IAAI,EAAE,IAAI,CAACA,IAAI;MACfG,KAAK;MACLG,WAAW,EAAET,GAAG,CAAC,CAAC;MAClBU,UAAU,EAAEH,KAAK,GAAGR,kBAAkB,CAACQ,KAAK,CAAC,GAAG,CAAC;IACnD,CAAC,CAAC;EACJ;AACF;AAEA,OAAO,MAAMQ,KAAK,CAAC;EACTC,MAAM,GAAmB,EAAE;EAGnCd,WAAWA,CAACe,QAAyB,EAAE;IACrC,IAAI,CAACA,QAAQ,GAAGA,QAAQ;EAC1B;EAEAC,aAAaA,CAACf,IAAY,EAAW;IACnC,OAAO,IAAIF,OAAO,CAACE,IAAI,EAAGgB,CAAC,IAAK,IAAI,CAACH,MAAM,CAACI,IAAI,CAACD,CAAC,CAAC,CAAC;EACtD;EAEAE,eAAeA,CAAClB,IAAY,EAAa;IACvC,OAAO,IAAIQ,SAAS,CAACR,IAAI,EAAGgB,CAAC,IAAK,IAAI,CAACH,MAAM,CAACI,IAAI,CAACD,CAAC,CAAC,CAAC;EACxD;EAEAG,WAAWA,CAACnB,IAAY,EAAS;IAC/B,OAAO,IAAIU,KAAK,CAACV,IAAI,EAAGgB,CAAC,IAAK,IAAI,CAACH,MAAM,CAACI,IAAI,CAACD,CAAC,CAAC,CAAC;EACpD;EAEAI,KAAKA,CAAA,EAAS;IACZ,IAAI,IAAI,CAACP,MAAM,CAACQ,MAAM,KAAK,CAAC,EAAE;IAC9B,MAAMC,QAAQ,GAAG,IAAI,CAACT,MAAM,CAACU,MAAM,CAAC,CAAC,EAAE,IAAI,CAACV,MAAM,CAACQ,MAAM,CAAC;IAC1D,IAAI,CAACP,QAAQ,EAAEU,MAAM,CAACF,QAAQ,CAAC;EACjC;AACF","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
4
+ import { ATTR_APP_BUILD_ID, ATTR_DEPLOYMENT_ENVIRONMENT_NAME, ATTR_DEVICE_MANUFACTURER, ATTR_DEVICE_MODEL_NAME, ATTR_OS_NAME, ATTR_OS_VERSION } from '@opentelemetry/semantic-conventions/incubating';
5
+ // Populated at init time from device/app info passed in by the caller.
6
+ // Immutable after creation — user identity is NOT stored here.
7
+ export function buildResource(params) {
8
+ return Object.freeze({
9
+ [ATTR_SERVICE_NAME]: params.serviceName,
10
+ [ATTR_SERVICE_VERSION]: params.serviceVersion,
11
+ [ATTR_OS_NAME]: params.osName,
12
+ [ATTR_OS_VERSION]: params.osVersion,
13
+ [ATTR_DEVICE_MANUFACTURER]: params.deviceBrand,
14
+ [ATTR_DEVICE_MODEL_NAME]: params.deviceModel,
15
+ 'device.type': params.deviceType,
16
+ [ATTR_APP_BUILD_ID]: params.appBuild,
17
+ [ATTR_DEPLOYMENT_ENVIRONMENT_NAME]: params.environment
18
+ });
19
+ }
20
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ import { ATTR_EXCEPTION_MESSAGE, ATTR_EXCEPTION_STACKTRACE, ATTR_EXCEPTION_TYPE } from '@opentelemetry/semantic-conventions';
4
+ import { sanitizeAttributes, sanitizeValue } from "./attributes.js";
5
+ import { now } from "./clock.js";
6
+ import { generateSpanId, generateTraceId } from "./ids.js";
7
+
8
+ // Defined here to avoid circular dep with exporters/types.ts
9
+
10
+ // Carries both IDs needed to link a child span into an existing trace.
11
+
12
+ export class Span {
13
+ static MAX_EVENTS = 128;
14
+ endTimeMs = undefined;
15
+ // Mutable plain object — setAttribute writes directly, no full clone.
16
+
17
+ events = [];
18
+ droppedEventsCount = 0;
19
+ status = 'UNSET';
20
+ statusMessage = undefined;
21
+ constructor(params) {
22
+ this.traceId = params.parent?.traceId ?? generateTraceId();
23
+ this.spanId = generateSpanId();
24
+ this.parentSpanId = params.parent?.spanId;
25
+ this.name = params.name;
26
+ this.kind = params.kind ?? 'INTERNAL';
27
+ this.startTimeMs = now();
28
+ this.attributes = params.attributes ? sanitizeAttributes(params.attributes) : {};
29
+ this.exporter = params.exporter;
30
+ }
31
+ setAttribute(key, value) {
32
+ if (this.endTimeMs !== undefined) return;
33
+ // sanitizeValue handles one value — no object clone needed.
34
+ const sanitized = sanitizeValue(value);
35
+ if (sanitized !== undefined) {
36
+ this.attributes[key] = sanitized;
37
+ }
38
+ }
39
+ addEvent(name, attrs) {
40
+ if (this.endTimeMs !== undefined) return;
41
+ if (this.events.length >= Span.MAX_EVENTS) {
42
+ this.droppedEventsCount++;
43
+ return;
44
+ }
45
+ this.events.push({
46
+ name,
47
+ timestampMs: now(),
48
+ attributes: attrs ? sanitizeAttributes(attrs) : {}
49
+ });
50
+ }
51
+ setStatus(status, message) {
52
+ if (this.endTimeMs !== undefined) return;
53
+ this.status = status;
54
+ this.statusMessage = message;
55
+ }
56
+ recordException(error, attrs) {
57
+ this.addEvent('exception', {
58
+ [ATTR_EXCEPTION_TYPE]: error.name,
59
+ [ATTR_EXCEPTION_MESSAGE]: error.message,
60
+ [ATTR_EXCEPTION_STACKTRACE]: error.stack ?? '',
61
+ ...attrs
62
+ });
63
+ this.setStatus('ERROR', error.message);
64
+ }
65
+ end() {
66
+ if (this.endTimeMs !== undefined) return;
67
+ this.endTimeMs = now();
68
+ if (this.status === 'UNSET') {
69
+ this.status = 'OK';
70
+ }
71
+ this.exporter?.export([this]);
72
+ }
73
+ }
74
+
75
+ // No-op span used when sampling drops a span.
76
+ // Implements the same interface so callers never null-check.
77
+ export class NoopSpan {
78
+ traceId = '';
79
+ spanId = '';
80
+ parentSpanId = undefined;
81
+ name = '';
82
+ kind = 'INTERNAL';
83
+ startTimeMs = 0;
84
+ endTimeMs = undefined;
85
+ attributes = {};
86
+ events = [];
87
+ droppedEventsCount = 0;
88
+ status = 'UNSET';
89
+ statusMessage = undefined;
90
+ setAttribute(_key, _value) {}
91
+ addEvent(_name, _attrs) {}
92
+ setStatus(_status, _message) {}
93
+ recordException(_error, _attrs) {}
94
+ end() {}
95
+ }
96
+ //# sourceMappingURL=span.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ import { ATTR_EXCEPTION_MESSAGE, ATTR_EXCEPTION_STACKTRACE, ATTR_EXCEPTION_TYPE } from '@opentelemetry/semantic-conventions';
4
+ import { Span, NoopSpan } from "./span.js";
5
+ import { spanContext } from "../context/span-context.js";
6
+ export class Tracer {
7
+ constructor(params) {
8
+ this.exporter = params.exporter;
9
+ this.sampleRate = params.sampleRate ?? 1.0;
10
+ this.getUserAttributes = params.getUserAttributes;
11
+ }
12
+ startSpan(name, options) {
13
+ if (this.sampleRate < 1.0 && Math.random() > this.sampleRate) {
14
+ return new NoopSpan();
15
+ }
16
+
17
+ // Resolve parent: explicit > current screen span > none (new trace)
18
+ const parent = options?.parent !== undefined ? options.parent ?? undefined : spanContext.current() ?? undefined;
19
+ const userAttrs = this.getUserAttributes();
20
+ return new Span({
21
+ name,
22
+ kind: options?.kind,
23
+ attributes: {
24
+ ...userAttrs,
25
+ ...options?.attributes
26
+ },
27
+ parent,
28
+ exporter: this.exporter
29
+ });
30
+ }
31
+ recordEvent(name, attributes) {
32
+ spanContext.current()?.addEvent(name, attributes);
33
+ }
34
+ recordException(error, attributes) {
35
+ const span = this.startSpan(`exception.${error.name}`, {
36
+ kind: 'INTERNAL',
37
+ attributes: {
38
+ [ATTR_EXCEPTION_TYPE]: error.name,
39
+ [ATTR_EXCEPTION_MESSAGE]: error.message,
40
+ [ATTR_EXCEPTION_STACKTRACE]: error.stack ?? '',
41
+ ...attributes
42
+ }
43
+ });
44
+ span.setStatus('ERROR', error.message);
45
+ span.end();
46
+ }
47
+ }
48
+ //# sourceMappingURL=tracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ATTR_EXCEPTION_MESSAGE","ATTR_EXCEPTION_STACKTRACE","ATTR_EXCEPTION_TYPE","Span","NoopSpan","spanContext","Tracer","constructor","params","exporter","sampleRate","getUserAttributes","startSpan","name","options","Math","random","parent","undefined","current","userAttrs","kind","attributes","recordEvent","addEvent","recordException","error","span","message","stack","setStatus","end"],"sourceRoot":"../../../src","sources":["core/tracer.ts"],"mappings":";;AAAA,SACEA,sBAAsB,EACtBC,yBAAyB,EACzBC,mBAAmB,QACd,qCAAqC;AAI5C,SAASC,IAAI,EAAEC,QAAQ,QAAQ,WAAQ;AACvC,SAASC,WAAW,QAAQ,4BAAyB;AAErD,OAAO,MAAMC,MAAM,CAAC;EAKlBC,WAAWA,CAACC,MAIX,EAAE;IACD,IAAI,CAACC,QAAQ,GAAGD,MAAM,CAACC,QAAQ;IAC/B,IAAI,CAACC,UAAU,GAAGF,MAAM,CAACE,UAAU,IAAI,GAAG;IAC1C,IAAI,CAACC,iBAAiB,GAAGH,MAAM,CAACG,iBAAiB;EACnD;EAEAC,SAASA,CACPC,IAAY,EACZC,OAOC,EACgB;IACjB,IAAI,IAAI,CAACJ,UAAU,GAAG,GAAG,IAAIK,IAAI,CAACC,MAAM,CAAC,CAAC,GAAG,IAAI,CAACN,UAAU,EAAE;MAC5D,OAAO,IAAIN,QAAQ,CAAC,CAAC;IACvB;;IAEA;IACA,MAAMa,MAA+B,GACnCH,OAAO,EAAEG,MAAM,KAAKC,SAAS,GACzBJ,OAAO,CAACG,MAAM,IAAIC,SAAS,GAC3Bb,WAAW,CAACc,OAAO,CAAC,CAAC,IAAID,SAAS;IAExC,MAAME,SAAS,GAAG,IAAI,CAACT,iBAAiB,CAAC,CAAC;IAC1C,OAAO,IAAIR,IAAI,CAAC;MACdU,IAAI;MACJQ,IAAI,EAAEP,OAAO,EAAEO,IAAI;MACnBC,UAAU,EAAE;QAAE,GAAGF,SAAS;QAAE,GAAGN,OAAO,EAAEQ;MAAW,CAAC;MACpDL,MAAM;MACNR,QAAQ,EAAE,IAAI,CAACA;IACjB,CAAC,CAAC;EACJ;EAEAc,WAAWA,CAACV,IAAY,EAAES,UAAuB,EAAQ;IACvDjB,WAAW,CAACc,OAAO,CAAC,CAAC,EAAEK,QAAQ,CAACX,IAAI,EAAES,UAAU,CAAC;EACnD;EAEAG,eAAeA,CAACC,KAAY,EAAEJ,UAAuB,EAAQ;IAC3D,MAAMK,IAAI,GAAG,IAAI,CAACf,SAAS,CAAC,aAAac,KAAK,CAACb,IAAI,EAAE,EAAE;MACrDQ,IAAI,EAAE,UAAU;MAChBC,UAAU,EAAE;QACV,CAACpB,mBAAmB,GAAGwB,KAAK,CAACb,IAAI;QACjC,CAACb,sBAAsB,GAAG0B,KAAK,CAACE,OAAO;QACvC,CAAC3B,yBAAyB,GAAGyB,KAAK,CAACG,KAAK,IAAI,EAAE;QAC9C,GAAGP;MACL;IACF,CAAC,CAAC;IACFK,IAAI,CAACG,SAAS,CAAC,OAAO,EAAEJ,KAAK,CAACE,OAAO,CAAC;IACtCD,IAAI,CAACI,GAAG,CAAC,CAAC;EACZ;AACF","ignoreList":[]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ function shouldLog(debug) {
4
+ return debug || process.env.NODE_ENV === 'development';
5
+ }
6
+ export class ConsoleSpanExporter {
7
+ constructor(debug = false) {
8
+ this.debug = debug;
9
+ }
10
+ export(spans) {
11
+ if (!shouldLog(this.debug)) return;
12
+ for (const span of spans) {
13
+ const duration = span.endTimeMs !== undefined ? `${span.endTimeMs - span.startTimeMs}ms` : 'ongoing';
14
+ const lines = [`[OTEL SPAN] ${span.name} (traceId=${span.traceId} spanId=${span.spanId})${span.parentSpanId ? ` parentSpanId=${span.parentSpanId}` : ''}`, ` duration: ${duration} status: ${span.status}${span.statusMessage ? ` (${span.statusMessage})` : ''}`, ` attributes: ${JSON.stringify(span.attributes)}`];
15
+ if (span.events.length > 0) {
16
+ lines.push(' events:');
17
+ for (const event of span.events) {
18
+ const offset = event.timestampMs - span.startTimeMs;
19
+ const attrsStr = Object.keys(event.attributes).length > 0 ? ` ${JSON.stringify(event.attributes)}` : '{}';
20
+ lines.push(` [+${offset}ms] ${event.name} ${attrsStr}`);
21
+ }
22
+ }
23
+ if (span.droppedEventsCount > 0) {
24
+ lines.push(` dropped_events: ${span.droppedEventsCount}`);
25
+ }
26
+ console.log(lines.join('\n'));
27
+ }
28
+ }
29
+ }
30
+ export class ConsoleMetricExporter {
31
+ constructor(debug = false) {
32
+ this.debug = debug;
33
+ }
34
+ export(metrics) {
35
+ if (!shouldLog(this.debug)) return;
36
+ for (const metric of metrics) {
37
+ console.log(`[OTEL METRIC] ${metric.name} ${metric.type} value=${metric.value}`, Object.keys(metric.attributes).length > 0 ? metric.attributes : '');
38
+ }
39
+ }
40
+ }
41
+ export class ConsoleLogExporter {
42
+ constructor(debug = false) {
43
+ this.debug = debug;
44
+ }
45
+ export(logs) {
46
+ if (!shouldLog(this.debug)) return;
47
+ for (const log of logs) {
48
+ const traceInfo = log.traceId ? `{ trace: ${log.traceId}, span: ${log.spanId} }` : '';
49
+ console.log(`[OTEL LOG] ${log.severity.padEnd(5)} ${log.body}`, traceInfo, Object.keys(log.attributes).length > 0 ? log.attributes : '');
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=console-exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["shouldLog","debug","process","env","NODE_ENV","ConsoleSpanExporter","constructor","export","spans","span","duration","endTimeMs","undefined","startTimeMs","lines","name","traceId","spanId","parentSpanId","status","statusMessage","JSON","stringify","attributes","events","length","push","event","offset","timestampMs","attrsStr","Object","keys","droppedEventsCount","console","log","join","ConsoleMetricExporter","metrics","metric","type","value","ConsoleLogExporter","logs","traceInfo","severity","padEnd","body"],"sourceRoot":"../../../src","sources":["exporters/console-exporter.ts"],"mappings":"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","ignoreList":[]}