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.
- package/README.md +1133 -13
- package/lib/module/core/meter.js +28 -2
- package/lib/module/core/meter.js.map +1 -1
- package/lib/module/core/processor.js +28 -0
- package/lib/module/core/processor.js.map +1 -0
- package/lib/module/core/resource.js +1 -0
- package/lib/module/core/resource.js.map +1 -1
- package/lib/module/core/sampler.js +55 -0
- package/lib/module/core/sampler.js.map +1 -0
- package/lib/module/core/span.js +15 -1
- package/lib/module/core/span.js.map +1 -1
- package/lib/module/core/tracer.js +24 -4
- package/lib/module/core/tracer.js.map +1 -1
- package/lib/module/exporters/multi-exporter.js +57 -0
- package/lib/module/exporters/multi-exporter.js.map +1 -0
- package/lib/module/exporters/otlp-http-exporter.js +69 -9
- package/lib/module/exporters/otlp-http-exporter.js.map +1 -1
- package/lib/module/exporters/wal.js +59 -3
- package/lib/module/exporters/wal.js.map +1 -1
- package/lib/module/index.js +16 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/instrumentation/expo-router.js +76 -0
- package/lib/module/instrumentation/expo-router.js.map +1 -0
- package/lib/module/instrumentation/fetch.js +99 -0
- package/lib/module/instrumentation/fetch.js.map +1 -0
- package/lib/module/instrumentation/lifecycle.js +6 -1
- package/lib/module/instrumentation/lifecycle.js.map +1 -1
- package/lib/module/instrumentation/linking.js +65 -0
- package/lib/module/instrumentation/linking.js.map +1 -0
- package/lib/module/instrumentation/network.js +28 -4
- package/lib/module/instrumentation/network.js.map +1 -1
- package/lib/module/instrumentation/startup.js +46 -0
- package/lib/module/instrumentation/startup.js.map +1 -0
- package/lib/module/sdk.js +65 -5
- package/lib/module/sdk.js.map +1 -1
- package/lib/module/version.js +7 -0
- package/lib/module/version.js.map +1 -0
- package/lib/typescript/src/core/meter.d.ts +2 -0
- package/lib/typescript/src/core/meter.d.ts.map +1 -1
- package/lib/typescript/src/core/processor.d.ts +29 -0
- package/lib/typescript/src/core/processor.d.ts.map +1 -0
- package/lib/typescript/src/core/resource.d.ts +3 -0
- package/lib/typescript/src/core/resource.d.ts.map +1 -1
- package/lib/typescript/src/core/sampler.d.ts +31 -0
- package/lib/typescript/src/core/sampler.d.ts.map +1 -0
- package/lib/typescript/src/core/span.d.ts +16 -0
- package/lib/typescript/src/core/span.d.ts.map +1 -1
- package/lib/typescript/src/core/tracer.d.ts +8 -3
- package/lib/typescript/src/core/tracer.d.ts.map +1 -1
- package/lib/typescript/src/exporters/multi-exporter.d.ts +28 -0
- package/lib/typescript/src/exporters/multi-exporter.d.ts.map +1 -0
- package/lib/typescript/src/exporters/otlp-http-exporter.d.ts +9 -0
- package/lib/typescript/src/exporters/otlp-http-exporter.d.ts.map +1 -1
- package/lib/typescript/src/exporters/wal.d.ts +2 -0
- package/lib/typescript/src/exporters/wal.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +13 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/instrumentation/expo-router.d.ts +31 -0
- package/lib/typescript/src/instrumentation/expo-router.d.ts.map +1 -0
- package/lib/typescript/src/instrumentation/fetch.d.ts +18 -0
- package/lib/typescript/src/instrumentation/fetch.d.ts.map +1 -0
- package/lib/typescript/src/instrumentation/lifecycle.d.ts.map +1 -1
- package/lib/typescript/src/instrumentation/linking.d.ts +23 -0
- package/lib/typescript/src/instrumentation/linking.d.ts.map +1 -0
- package/lib/typescript/src/instrumentation/network.d.ts.map +1 -1
- package/lib/typescript/src/instrumentation/startup.d.ts +16 -0
- package/lib/typescript/src/instrumentation/startup.d.ts.map +1 -0
- package/lib/typescript/src/sdk.d.ts +34 -0
- package/lib/typescript/src/sdk.d.ts.map +1 -1
- package/lib/typescript/src/version.d.ts +2 -0
- package/lib/typescript/src/version.d.ts.map +1 -0
- package/package.json +6 -1
- package/src/core/meter.ts +33 -2
- package/src/core/processor.ts +33 -0
- package/src/core/resource.ts +6 -0
- package/src/core/sampler.ts +65 -0
- package/src/core/span.ts +28 -1
- package/src/core/tracer.ts +42 -7
- package/src/exporters/multi-exporter.ts +59 -0
- package/src/exporters/otlp-http-exporter.ts +79 -10
- package/src/exporters/wal.ts +62 -3
- package/src/index.ts +34 -1
- package/src/instrumentation/expo-router.ts +94 -0
- package/src/instrumentation/fetch.ts +134 -0
- package/src/instrumentation/lifecycle.ts +7 -1
- package/src/instrumentation/linking.ts +83 -0
- package/src/instrumentation/network.ts +33 -4
- package/src/instrumentation/startup.ts +49 -0
- package/src/sdk.ts +86 -4
- package/src/version.ts +6 -0
package/lib/module/core/meter.js
CHANGED
|
@@ -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:
|
|
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:
|
|
126
|
+
attributes: cachedSanitize(this.attrCache, attrs)
|
|
101
127
|
});
|
|
102
128
|
}
|
|
103
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["sanitizeAttributes","now","DEFAULT_HISTOGRAM_BOUNDARIES","
|
|
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;
|
|
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":[]}
|
package/lib/module/core/span.js
CHANGED
|
@@ -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
|
-
|
|
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":";;AAAA,SACEA,sBAAsB,EACtBC,yBAAyB,EACzBC,mBAAmB,QACd,qCAAqC;AAG5C,SAASC,kBAAkB,EAAEC,aAAa,QAAQ,iBAAc;AAChE,SAASC,GAAG,QAAQ,YAAS;AAC7B,SAASC,cAAc,EAAEC,eAAe,QAAQ,UAAO;;AAEvD;;
|
|
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":";;AAAA,SACEA,sBAAsB,EACtBC,yBAAyB,EACzBC,mBAAmB,QACd,qCAAqC;AAG5C,SAASC,kBAAkB,EAAEC,aAAa,QAAQ,iBAAc;AAChE,SAASC,GAAG,QAAQ,YAAS;AAC7B,SAASC,cAAc,EAAEC,eAAe,QAAQ,UAAO;;AAEvD;;AAKA;;AAoBA;;AAuBA;;AAMA,OAAO,MAAMC,IAAI,CAAyB;EACxC,OAAwBC,UAAU,GAAG,GAAG;EASxCC,SAAS,GAAuBC,SAAS;EACzC;;EAEAC,MAAM,GAAgB,EAAE;EACxBC,KAAK,GAAe,EAAE;EACtBC,kBAAkB,GAAG,CAAC;EACtBC,MAAM,GAAe,OAAO;EAC5BC,aAAa,GAAuBL,SAAS;EAK7CM,WAAWA,CAACC,MASX,EAAE;IACD,IAAI,CAACC,OAAO,GAAGD,MAAM,CAACE,MAAM,EAAED,OAAO,IAAIZ,eAAe,CAAC,CAAC;IAC1D,IAAI,CAACc,MAAM,GAAGf,cAAc,CAAC,CAAC;IAC9B,IAAI,CAACgB,YAAY,GAAGJ,MAAM,CAACE,MAAM,EAAEC,MAAM;IACzC,IAAI,CAACE,IAAI,GAAGL,MAAM,CAACK,IAAI;IACvB,IAAI,CAACC,IAAI,GAAGN,MAAM,CAACM,IAAI,IAAI,UAAU;IACrC,IAAI,CAACC,WAAW,GAAGpB,GAAG,CAAC,CAAC;IACxB,IAAI,CAACqB,UAAU,GAAGR,MAAM,CAACQ,UAAU,GAC/BvB,kBAAkB,CAACe,MAAM,CAACQ,UAAU,CAAC,GACrC,CAAC,CAAC;IACN,IAAI,CAACb,KAAK,GAAGK,MAAM,CAACL,KAAK,IAAI,EAAE;IAC/B,IAAI,CAACc,QAAQ,GAAGT,MAAM,CAACS,QAAQ;IAC/B,IAAI,CAACC,SAAS,GAAGV,MAAM,CAACU,SAAS;IACjC,IAAI,CAACA,SAAS,EAAEC,OAAO,GAAG,IAAI,CAAC;EACjC;EAEAC,YAAYA,CAACC,GAAW,EAAEC,KAAyB,EAAQ;IACzD,IAAI,IAAI,CAACtB,SAAS,KAAKC,SAAS,EAAE;IAClC;IACA,MAAMsB,SAAS,GAAG7B,aAAa,CAAC4B,KAAK,CAAC;IACtC,IAAIC,SAAS,KAAKtB,SAAS,EAAE;MAC3B,IAAI,CAACe,UAAU,CAACK,GAAG,CAAC,GAAGE,SAAS;IAClC;EACF;EAEAC,QAAQA,CAACX,IAAY,EAAEY,KAAkB,EAAQ;IAC/C,IAAI,IAAI,CAACzB,SAAS,KAAKC,SAAS,EAAE;IAClC,IAAI,IAAI,CAACC,MAAM,CAACwB,MAAM,IAAI5B,IAAI,CAACC,UAAU,EAAE;MACzC,IAAI,CAACK,kBAAkB,EAAE;MACzB;IACF;IACA,IAAI,CAACF,MAAM,CAACyB,IAAI,CAAC;MACfd,IAAI;MACJe,WAAW,EAAEjC,GAAG,CAAC,CAAC;MAClBqB,UAAU,EAAES,KAAK,GAAGhC,kBAAkB,CAACgC,KAAK,CAAC,GAAG,CAAC;IACnD,CAAC,CAAC;EACJ;EAEAI,SAASA,CAACxB,MAAkB,EAAEyB,OAAgB,EAAQ;IACpD,IAAI,IAAI,CAAC9B,SAAS,KAAKC,SAAS,EAAE;IAClC,IAAI,CAACI,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,aAAa,GAAGwB,OAAO;EAC9B;EAEAC,eAAeA,CAACC,KAAY,EAAEP,KAAkB,EAAQ;IACtD,IAAI,CAACD,QAAQ,CAAC,WAAW,EAAE;MACzB,CAAChC,mBAAmB,GAAGwC,KAAK,CAACnB,IAAI;MACjC,CAACvB,sBAAsB,GAAG0C,KAAK,CAACF,OAAO;MACvC,CAACvC,yBAAyB,GAAGyC,KAAK,CAACC,KAAK,IAAI,EAAE;MAC9C,GAAGR;IACL,CAAC,CAAC;IACF,IAAI,CAACI,SAAS,CAAC,OAAO,EAAEG,KAAK,CAACF,OAAO,CAAC;EACxC;EAEAI,GAAGA,CAAA,EAAS;IACV,IAAI,IAAI,CAAClC,SAAS,KAAKC,SAAS,EAAE;IAClC,IAAI,CAACD,SAAS,GAAGL,GAAG,CAAC,CAAC;IACtB,IAAI,IAAI,CAACU,MAAM,KAAK,OAAO,EAAE;MAC3B,IAAI,CAACA,MAAM,GAAG,IAAI;IACpB;IACA;IACA,IAAI,IAAI,CAACa,SAAS,EAAE;MAClB,IAAI,CAACA,SAAS,CAACiB,KAAK,CAAC,IAAI,CAAC;IAC5B,CAAC,MAAM;MACL,IAAI,CAAClB,QAAQ,EAAEmB,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/B;EACF;AACF;;AAEA;AACA;AACA,OAAO,MAAMC,QAAQ,CAAyB;EACnC5B,OAAO,GAAG,EAAE;EACZE,MAAM,GAAG,EAAE;EACXC,YAAY,GAAGX,SAAS;EACxBY,IAAI,GAAG,EAAE;EACTC,IAAI,GAAa,UAAU;EAC3BC,WAAW,GAAG,CAAC;EACff,SAAS,GAAGC,SAAS;EACrBe,UAAU,GAAG,CAAC,CAAC;EACfd,MAAM,GAAgB,EAAE;EACxBC,KAAK,GAAe,EAAE;EACtBC,kBAAkB,GAAG,CAAC;EACtBC,MAAM,GAAe,OAAO;EAC5BC,aAAa,GAAGL,SAAS;EAElCmB,YAAYA,CAACkB,IAAY,EAAEC,MAA0B,EAAQ,CAAC;EAC9Df,QAAQA,CAACgB,KAAa,EAAEC,MAAmB,EAAQ,CAAC;EACpDZ,SAASA,CAACa,OAAmB,EAAEC,QAAiB,EAAQ,CAAC;EACzDZ,eAAeA,CAACa,MAAa,EAAEH,MAAmB,EAAQ,CAAC;EAC3DP,GAAGA,CAAA,EAAS,CAAC;AACf","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
|
-
|
|
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
|
-
//
|
|
21
|
-
|
|
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","
|
|
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:
|
|
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(
|
|
209
|
-
this.deliverBatch(
|
|
231
|
+
const id = this.wal_.write(batch);
|
|
232
|
+
this.deliverBatch(batch, id);
|
|
210
233
|
} else {
|
|
211
|
-
this.deliverBatch(
|
|
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:
|
|
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.
|
|
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:
|
|
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
|
-
})
|
|
448
|
+
});
|
|
389
449
|
}
|
|
390
450
|
}
|
|
391
451
|
//# sourceMappingURL=otlp-http-exporter.js.map
|