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.
- package/LICENSE +20 -0
- package/README.md +37 -0
- package/lib/module/context/span-context.js +14 -0
- package/lib/module/context/span-context.js.map +1 -0
- package/lib/module/core/attributes.js +43 -0
- package/lib/module/core/attributes.js.map +1 -0
- package/lib/module/core/clock.js +8 -0
- package/lib/module/core/clock.js.map +1 -0
- package/lib/module/core/ids.js +16 -0
- package/lib/module/core/ids.js.map +1 -0
- package/lib/module/core/log-record.js +41 -0
- package/lib/module/core/log-record.js.map +1 -0
- package/lib/module/core/meter.js +70 -0
- package/lib/module/core/meter.js.map +1 -0
- package/lib/module/core/resource.js +20 -0
- package/lib/module/core/resource.js.map +1 -0
- package/lib/module/core/span.js +96 -0
- package/lib/module/core/span.js.map +1 -0
- package/lib/module/core/tracer.js +48 -0
- package/lib/module/core/tracer.js.map +1 -0
- package/lib/module/exporters/console-exporter.js +53 -0
- package/lib/module/exporters/console-exporter.js.map +1 -0
- package/lib/module/exporters/otlp-http-exporter.js +317 -0
- package/lib/module/exporters/otlp-http-exporter.js.map +1 -0
- package/lib/module/exporters/types.js +4 -0
- package/lib/module/exporters/types.js.map +1 -0
- package/lib/module/index.js +24 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/instrumentation/errors.js +63 -0
- package/lib/module/instrumentation/errors.js.map +1 -0
- package/lib/module/instrumentation/lifecycle.js +15 -0
- package/lib/module/instrumentation/lifecycle.js.map +1 -0
- package/lib/module/instrumentation/navigation.js +51 -0
- package/lib/module/instrumentation/navigation.js.map +1 -0
- package/lib/module/instrumentation/network.js +183 -0
- package/lib/module/instrumentation/network.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/react/OtelProvider.js +57 -0
- package/lib/module/react/OtelProvider.js.map +1 -0
- package/lib/module/react/useOtel.js +12 -0
- package/lib/module/react/useOtel.js.map +1 -0
- package/lib/module/sdk.js +127 -0
- package/lib/module/sdk.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/context/span-context.d.ts +9 -0
- package/lib/typescript/src/context/span-context.d.ts.map +1 -0
- package/lib/typescript/src/core/attributes.d.ts +6 -0
- package/lib/typescript/src/core/attributes.d.ts.map +1 -0
- package/lib/typescript/src/core/clock.d.ts +2 -0
- package/lib/typescript/src/core/clock.d.ts.map +1 -0
- package/lib/typescript/src/core/ids.d.ts +3 -0
- package/lib/typescript/src/core/ids.d.ts.map +1 -0
- package/lib/typescript/src/core/log-record.d.ts +15 -0
- package/lib/typescript/src/core/log-record.d.ts.map +1 -0
- package/lib/typescript/src/core/meter.d.ts +30 -0
- package/lib/typescript/src/core/meter.d.ts.map +1 -0
- package/lib/typescript/src/core/resource.d.ts +25 -0
- package/lib/typescript/src/core/resource.d.ts.map +1 -0
- package/lib/typescript/src/core/span.d.ts +77 -0
- package/lib/typescript/src/core/span.d.ts.map +1 -0
- package/lib/typescript/src/core/tracer.d.ts +21 -0
- package/lib/typescript/src/core/tracer.d.ts.map +1 -0
- package/lib/typescript/src/exporters/console-exporter.d.ts +17 -0
- package/lib/typescript/src/exporters/console-exporter.d.ts.map +1 -0
- package/lib/typescript/src/exporters/otlp-http-exporter.d.ts +58 -0
- package/lib/typescript/src/exporters/otlp-http-exporter.d.ts.map +1 -0
- package/lib/typescript/src/exporters/types.d.ts +25 -0
- package/lib/typescript/src/exporters/types.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +25 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/instrumentation/errors.d.ts +15 -0
- package/lib/typescript/src/instrumentation/errors.d.ts.map +1 -0
- package/lib/typescript/src/instrumentation/lifecycle.d.ts +3 -0
- package/lib/typescript/src/instrumentation/lifecycle.d.ts.map +1 -0
- package/lib/typescript/src/instrumentation/navigation.d.ts +7 -0
- package/lib/typescript/src/instrumentation/navigation.d.ts.map +1 -0
- package/lib/typescript/src/instrumentation/network.d.ts +33 -0
- package/lib/typescript/src/instrumentation/network.d.ts.map +1 -0
- package/lib/typescript/src/react/OtelProvider.d.ts +21 -0
- package/lib/typescript/src/react/OtelProvider.d.ts.map +1 -0
- package/lib/typescript/src/react/useOtel.d.ts +3 -0
- package/lib/typescript/src/react/useOtel.d.ts.map +1 -0
- package/lib/typescript/src/sdk.d.ts +50 -0
- package/lib/typescript/src/sdk.d.ts.map +1 -0
- package/package.json +125 -0
- package/src/context/span-context.ts +17 -0
- package/src/core/attributes.ts +61 -0
- package/src/core/clock.ts +5 -0
- package/src/core/ids.ts +15 -0
- package/src/core/log-record.ts +58 -0
- package/src/core/meter.ts +82 -0
- package/src/core/resource.ts +50 -0
- package/src/core/span.ts +161 -0
- package/src/core/tracer.ts +75 -0
- package/src/exporters/console-exporter.ts +89 -0
- package/src/exporters/otlp-http-exporter.ts +377 -0
- package/src/exporters/types.ts +29 -0
- package/src/index.ts +63 -0
- package/src/instrumentation/errors.ts +95 -0
- package/src/instrumentation/lifecycle.ts +17 -0
- package/src/instrumentation/navigation.ts +61 -0
- package/src/instrumentation/network.ts +253 -0
- package/src/react/OtelProvider.tsx +98 -0
- package/src/react/useOtel.ts +14 -0
- 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 @@
|
|
|
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":[]}
|