@owlpane/browser 0.1.1
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 +21 -0
- package/README.md +67 -0
- package/dist/dom-replay.d.ts +13 -0
- package/dist/dom-replay.js +40 -0
- package/dist/dom-replay.js.map +1 -0
- package/dist/env.d.ts +43 -0
- package/dist/env.js +29 -0
- package/dist/env.js.map +1 -0
- package/dist/exporter.d.ts +33 -0
- package/dist/exporter.js +85 -0
- package/dist/exporter.js.map +1 -0
- package/dist/ids.d.ts +19 -0
- package/dist/ids.js +46 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +131 -0
- package/dist/index.js.map +1 -0
- package/dist/instrument-http.d.ts +13 -0
- package/dist/instrument-http.js +164 -0
- package/dist/instrument-http.js.map +1 -0
- package/dist/log-otlp.d.ts +16 -0
- package/dist/log-otlp.js +28 -0
- package/dist/log-otlp.js.map +1 -0
- package/dist/observers.d.ts +30 -0
- package/dist/observers.js +176 -0
- package/dist/observers.js.map +1 -0
- package/dist/otlp.d.ts +47 -0
- package/dist/otlp.js +49 -0
- package/dist/otlp.js.map +1 -0
- package/dist/queue.d.ts +18 -0
- package/dist/queue.js +41 -0
- package/dist/queue.js.map +1 -0
- package/dist/tracer.d.ts +45 -0
- package/dist/tracer.js +61 -0
- package/dist/tracer.js.map +1 -0
- package/dist/url.d.ts +11 -0
- package/dist/url.js +68 -0
- package/dist/url.js.map +1 -0
- package/dist/vitals.d.ts +32 -0
- package/dist/vitals.js +54 -0
- package/dist/vitals.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { formatTraceparent } from "./ids.js";
|
|
2
|
+
import { sanitizeUrl, shouldPropagate } from "./url.js";
|
|
3
|
+
function baseHref(env) {
|
|
4
|
+
return env.location?.href;
|
|
5
|
+
}
|
|
6
|
+
function httpAttrs(c, method, raw) {
|
|
7
|
+
const base = baseHref(c.env);
|
|
8
|
+
const url = sanitizeUrl(raw, base, c.opts.keepQuery);
|
|
9
|
+
return {
|
|
10
|
+
"http.request.method": method.toUpperCase(),
|
|
11
|
+
"url.full": url,
|
|
12
|
+
"server.address": (() => {
|
|
13
|
+
try {
|
|
14
|
+
return new URL(raw, base).hostname;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
})(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function errStatus(code) {
|
|
23
|
+
return code !== undefined && code >= 400 ? { code: 2, message: `HTTP ${code}` } : { code: 0 };
|
|
24
|
+
}
|
|
25
|
+
function absolute(c, raw) {
|
|
26
|
+
try {
|
|
27
|
+
return new URL(raw, baseHref(c.env)).toString();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return raw;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Replaces `global.fetch` with an instrumented wrapper. Returns an undo function. */
|
|
34
|
+
export function instrumentFetch(c, original) {
|
|
35
|
+
const g = c.env.global;
|
|
36
|
+
if (!g)
|
|
37
|
+
return () => undefined;
|
|
38
|
+
const wrapped = function (input, init) {
|
|
39
|
+
let span;
|
|
40
|
+
let callArgs = [input, init];
|
|
41
|
+
try {
|
|
42
|
+
const isReq = c.env.Request && input instanceof c.env.Request;
|
|
43
|
+
const raw = typeof input === "string" ? input : isReq ? input.url : String(input?.href ?? input);
|
|
44
|
+
if (c.isOwnUrl(absolute(c, raw)))
|
|
45
|
+
return original(input, init);
|
|
46
|
+
const method = String(init?.method ?? (isReq ? input.method : "GET"));
|
|
47
|
+
span = c.tracer.start("HTTP " + method.toUpperCase(), 3, { attributes: httpAttrs(c, method, raw) });
|
|
48
|
+
if (shouldPropagate(raw, baseHref(c.env), c.opts.propagateTraceTo) && c.env.Headers) {
|
|
49
|
+
try {
|
|
50
|
+
const headers = new c.env.Headers(init?.headers ?? (isReq ? input.headers : undefined));
|
|
51
|
+
if (!headers.has("traceparent")) {
|
|
52
|
+
headers.set("traceparent", formatTraceparent(span.traceId, span.spanId, span.sampled));
|
|
53
|
+
callArgs = [input, { ...init, headers }];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
callArgs = [input, init];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return original(input, init);
|
|
63
|
+
}
|
|
64
|
+
const s = span;
|
|
65
|
+
let p;
|
|
66
|
+
try {
|
|
67
|
+
p = original(...callArgs);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
s.end({ status: { code: 2, message: String(e?.message ?? e) }, attributes: { "error.type": e?.name ?? "Error" } });
|
|
71
|
+
throw e;
|
|
72
|
+
}
|
|
73
|
+
return p.then((res) => {
|
|
74
|
+
try {
|
|
75
|
+
const code = typeof res?.status === "number" ? res.status : undefined;
|
|
76
|
+
s.end({ status: errStatus(code), attributes: { "http.response.status_code": code, "error.type": code !== undefined && code >= 400 ? String(code) : undefined } });
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
/* ignore */
|
|
80
|
+
}
|
|
81
|
+
return res;
|
|
82
|
+
}, (e) => {
|
|
83
|
+
try {
|
|
84
|
+
s.end({ status: { code: 2, message: String(e?.message ?? e) }, attributes: { "error.type": e?.name ?? "Error" } });
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
/* ignore */
|
|
88
|
+
}
|
|
89
|
+
throw e;
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
g.fetch = wrapped;
|
|
93
|
+
return () => {
|
|
94
|
+
if (g.fetch === wrapped)
|
|
95
|
+
g.fetch = original;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const KEY = Symbol.for("owlpane.xhr");
|
|
99
|
+
/** Patches XMLHttpRequest.prototype open/send. Returns an undo function. */
|
|
100
|
+
export function instrumentXhr(c) {
|
|
101
|
+
const X = c.env.XMLHttpRequest;
|
|
102
|
+
const proto = X?.prototype;
|
|
103
|
+
if (!proto || typeof proto.open !== "function" || typeof proto.send !== "function")
|
|
104
|
+
return () => undefined;
|
|
105
|
+
const origOpen = proto.open;
|
|
106
|
+
const origSend = proto.send;
|
|
107
|
+
proto.open = function (method, url, ...rest) {
|
|
108
|
+
try {
|
|
109
|
+
this[KEY] = { method: String(method), raw: String(url?.href ?? url) };
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
/* ignore */
|
|
113
|
+
}
|
|
114
|
+
return origOpen.call(this, method, url, ...rest);
|
|
115
|
+
};
|
|
116
|
+
proto.send = function (...args) {
|
|
117
|
+
try {
|
|
118
|
+
const meta = this[KEY];
|
|
119
|
+
if (meta && !c.isOwnUrl(absolute(c, meta.raw))) {
|
|
120
|
+
const span = c.tracer.start("HTTP " + meta.method.toUpperCase(), 3, { attributes: httpAttrs(c, meta.method, meta.raw) });
|
|
121
|
+
if (shouldPropagate(meta.raw, baseHref(c.env), c.opts.propagateTraceTo) && typeof this.setRequestHeader === "function") {
|
|
122
|
+
try {
|
|
123
|
+
this.setRequestHeader("traceparent", formatTraceparent(span.traceId, span.spanId, span.sampled));
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
/* ignore */
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
let finished = false;
|
|
130
|
+
const finish = (kind) => {
|
|
131
|
+
if (finished)
|
|
132
|
+
return;
|
|
133
|
+
finished = true;
|
|
134
|
+
try {
|
|
135
|
+
const code = typeof this.status === "number" && this.status > 0 ? this.status : undefined;
|
|
136
|
+
if (code === undefined || kind) {
|
|
137
|
+
span.end({ status: { code: 2, message: kind ?? "network error" }, attributes: { "error.type": kind ?? "network_error" } });
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
span.end({ status: errStatus(code), attributes: { "http.response.status_code": code, "error.type": code >= 400 ? String(code) : undefined } });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
/* ignore */
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
if (typeof this.addEventListener === "function") {
|
|
148
|
+
this.addEventListener("abort", () => finish("abort"));
|
|
149
|
+
this.addEventListener("timeout", () => finish("timeout"));
|
|
150
|
+
this.addEventListener("loadend", () => finish());
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
/* fall through to the real send */
|
|
156
|
+
}
|
|
157
|
+
return origSend.apply(this, args);
|
|
158
|
+
};
|
|
159
|
+
return () => {
|
|
160
|
+
proto.open = origOpen;
|
|
161
|
+
proto.send = origSend;
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=instrument-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrument-http.js","sourceRoot":"","sources":["../src/instrument-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Attrs } from "./otlp.js";
|
|
2
|
+
export declare function buildLogsRequestBody(resourceAttrs: Attrs, records: Array<{
|
|
3
|
+
timeMs: number;
|
|
4
|
+
body: string;
|
|
5
|
+
attributes: Attrs;
|
|
6
|
+
}>): string;
|
|
7
|
+
export type LogFetchLike = (input: string, init: {
|
|
8
|
+
method: string;
|
|
9
|
+
headers: Record<string, string>;
|
|
10
|
+
body: string;
|
|
11
|
+
keepalive: boolean;
|
|
12
|
+
}) => Promise<{
|
|
13
|
+
ok: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
/** POST OTLP/HTTP JSON logs. Never throws. */
|
|
16
|
+
export declare function postLogs(url: string, projectKey: string, body: string, fetchFn: LogFetchLike | undefined): Promise<void>;
|
package/dist/log-otlp.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { encodeAttrs, unixNano } from "./otlp.js";
|
|
2
|
+
const REPLAY_SCOPE = { name: "@owlpane/browser-replay", version: "0.1.0" };
|
|
3
|
+
export function buildLogsRequestBody(resourceAttrs, records) {
|
|
4
|
+
const resource = JSON.stringify({ attributes: encodeAttrs(resourceAttrs) });
|
|
5
|
+
const logs = records.map((r) => JSON.stringify({
|
|
6
|
+
timeUnixNano: unixNano(r.timeMs),
|
|
7
|
+
body: { stringValue: r.body },
|
|
8
|
+
attributes: encodeAttrs(r.attributes),
|
|
9
|
+
}));
|
|
10
|
+
return `{"resourceLogs":[{"resource":${resource},"scopeLogs":[{"scope":${JSON.stringify(REPLAY_SCOPE)},"logRecords":[${logs.join(",")}]}]}]}`;
|
|
11
|
+
}
|
|
12
|
+
/** POST OTLP/HTTP JSON logs. Never throws. */
|
|
13
|
+
export async function postLogs(url, projectKey, body, fetchFn) {
|
|
14
|
+
if (!fetchFn)
|
|
15
|
+
return;
|
|
16
|
+
try {
|
|
17
|
+
await fetchFn(url, {
|
|
18
|
+
method: "POST",
|
|
19
|
+
headers: { "content-type": "application/json", authorization: `Bearer ${projectKey}` },
|
|
20
|
+
body,
|
|
21
|
+
keepalive: true,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
/* ignore */
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=log-otlp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-otlp.js","sourceRoot":"","sources":["../src/log-otlp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAE3E,MAAM,UAAU,oBAAoB,CAClC,aAAoB,EACpB,OAAmE;IAEnE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,IAAI,CAAC,SAAS,CAAC;QACb,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAChC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE;QAC7B,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;KACtC,CAAC,CACH,CAAC;IACF,OAAO,gCAAgC,QAAQ,0BAA0B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAChJ,CAAC;AASD,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,UAAkB,EAClB,IAAY,EACZ,OAAiC;IAEjC,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,UAAU,EAAE,EAAE;YACtF,IAAI;YACJ,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Env } from "./env.js";
|
|
2
|
+
import type { ActiveSpan, ResolvedOptions, Tracer } from "./tracer.js";
|
|
3
|
+
type Ctx = {
|
|
4
|
+
env: Env;
|
|
5
|
+
opts: ResolvedOptions;
|
|
6
|
+
tracer: Tracer;
|
|
7
|
+
page: ActiveSpan;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Emits one 'documentLoad' span covering navigation start..loadEventEnd. Phase timings are
|
|
11
|
+
* attributes (milliseconds relative to navigation start) rather than child spans, to keep volume low.
|
|
12
|
+
*/
|
|
13
|
+
export declare function captureDocumentLoad(c: Ctx): void;
|
|
14
|
+
export type VitalsHandle = {
|
|
15
|
+
report(): void;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* LCP / CLS / INP via PerformanceObserver. Values keep updating while the page is alive and are
|
|
19
|
+
* reported once, when the page is hidden (or `report()` is called), as spans named 'webvital.<NAME>'.
|
|
20
|
+
*/
|
|
21
|
+
export declare function captureVitals(c: Ctx): VitalsHandle;
|
|
22
|
+
export type ErrorReporter = (error: unknown, source: string, where?: {
|
|
23
|
+
file?: string;
|
|
24
|
+
line?: number;
|
|
25
|
+
col?: number;
|
|
26
|
+
}) => void;
|
|
27
|
+
/** Records an error as a span with an OTLP 'exception' event (same attribute names as the Node SDK / OTel). */
|
|
28
|
+
export declare function createErrorReporter(c: Ctx): ErrorReporter;
|
|
29
|
+
export declare function captureErrors(c: Ctx, report: ErrorReporter): void;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { ClsTracker, InpTracker, rate } from "./vitals.js";
|
|
2
|
+
function observe(env, type, cb, extra = {}) {
|
|
3
|
+
const PO = env.PerformanceObserver;
|
|
4
|
+
if (!PO)
|
|
5
|
+
return false;
|
|
6
|
+
try {
|
|
7
|
+
const supported = PO.supportedEntryTypes;
|
|
8
|
+
if (supported && !supported.includes(type))
|
|
9
|
+
return false;
|
|
10
|
+
const po = new PO((list) => {
|
|
11
|
+
try {
|
|
12
|
+
cb(list.getEntries());
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
/* ignore */
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
po.observe({ type, buffered: true, ...extra });
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Emits one 'documentLoad' span covering navigation start..loadEventEnd. Phase timings are
|
|
27
|
+
* attributes (milliseconds relative to navigation start) rather than child spans, to keep volume low.
|
|
28
|
+
*/
|
|
29
|
+
export function captureDocumentLoad(c) {
|
|
30
|
+
const { env } = c;
|
|
31
|
+
const run = () => {
|
|
32
|
+
try {
|
|
33
|
+
const nav = env.performance?.getEntriesByType?.("navigation")?.[0];
|
|
34
|
+
const origin = env.performance?.timeOrigin ?? env.now();
|
|
35
|
+
const attrs = {};
|
|
36
|
+
let end = env.now();
|
|
37
|
+
if (nav) {
|
|
38
|
+
const ms = (v) => (typeof v === "number" && v >= 0 ? Math.round(v * 100) / 100 : undefined);
|
|
39
|
+
attrs["browser.navigation.type"] = nav.type;
|
|
40
|
+
attrs["browser.timing.redirect_ms"] = ms(nav.redirectEnd - nav.redirectStart);
|
|
41
|
+
attrs["browser.timing.dns_ms"] = ms(nav.domainLookupEnd - nav.domainLookupStart);
|
|
42
|
+
attrs["browser.timing.connect_ms"] = ms(nav.connectEnd - nav.connectStart);
|
|
43
|
+
attrs["browser.timing.ttfb_ms"] = ms(nav.responseStart - nav.startTime);
|
|
44
|
+
attrs["browser.timing.response_ms"] = ms(nav.responseEnd - nav.responseStart);
|
|
45
|
+
attrs["browser.timing.dom_interactive_ms"] = ms(nav.domInteractive);
|
|
46
|
+
attrs["browser.timing.dom_content_loaded_ms"] = ms(nav.domContentLoadedEventEnd);
|
|
47
|
+
attrs["browser.timing.load_ms"] = ms(nav.loadEventEnd);
|
|
48
|
+
attrs["browser.timing.transfer_size_bytes"] = ms(nav.transferSize);
|
|
49
|
+
if (nav.loadEventEnd > 0)
|
|
50
|
+
end = origin + nav.loadEventEnd;
|
|
51
|
+
}
|
|
52
|
+
c.page.end({ endMs: end, attributes: attrs });
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
/* ignore */
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
if (env.document?.readyState === "complete")
|
|
59
|
+
env.setTimeout?.(run, 0);
|
|
60
|
+
else
|
|
61
|
+
env.addEventListener?.("load", () => env.setTimeout?.(run, 0));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* LCP / CLS / INP via PerformanceObserver. Values keep updating while the page is alive and are
|
|
65
|
+
* reported once, when the page is hidden (or `report()` is called), as spans named 'webvital.<NAME>'.
|
|
66
|
+
*/
|
|
67
|
+
export function captureVitals(c) {
|
|
68
|
+
const { env } = c;
|
|
69
|
+
let lcp;
|
|
70
|
+
const cls = new ClsTracker();
|
|
71
|
+
const inp = new InpTracker();
|
|
72
|
+
let clsSeen = false;
|
|
73
|
+
let reported = false;
|
|
74
|
+
observe(env, "largest-contentful-paint", (es) => {
|
|
75
|
+
for (const e of es)
|
|
76
|
+
lcp = e.renderTime || e.loadTime || e.startTime;
|
|
77
|
+
});
|
|
78
|
+
observe(env, "layout-shift", (es) => {
|
|
79
|
+
for (const e of es) {
|
|
80
|
+
clsSeen = true;
|
|
81
|
+
cls.add(e);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
observe(env, "event", (es) => es.forEach((e) => inp.add(e)), { durationThreshold: 40 });
|
|
85
|
+
function emit(name, value, extra = {}) {
|
|
86
|
+
const now = env.now();
|
|
87
|
+
const s = c.tracer.start(`webvital.${name}`, 1, {
|
|
88
|
+
traceId: c.page.traceId,
|
|
89
|
+
parentSpanId: c.page.spanId,
|
|
90
|
+
sampled: c.page.sampled,
|
|
91
|
+
startMs: now,
|
|
92
|
+
attributes: { "webvital.name": name, "webvital.value": name === "CLS" ? Math.round(value * 10000) / 10000 : Math.round(value * 100) / 100, "webvital.unit": name === "CLS" ? "score" : "ms", "webvital.rating": rate(name, value), ...extra },
|
|
93
|
+
});
|
|
94
|
+
s.end({ endMs: now });
|
|
95
|
+
}
|
|
96
|
+
function report() {
|
|
97
|
+
if (reported)
|
|
98
|
+
return;
|
|
99
|
+
reported = true;
|
|
100
|
+
try {
|
|
101
|
+
if (lcp !== undefined)
|
|
102
|
+
emit("LCP", lcp);
|
|
103
|
+
if (clsSeen || lcp !== undefined)
|
|
104
|
+
emit("CLS", cls.value);
|
|
105
|
+
const v = inp.value;
|
|
106
|
+
if (v !== undefined)
|
|
107
|
+
emit("INP", v, { "webvital.interactions": inp.count });
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
/* ignore */
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { report };
|
|
114
|
+
}
|
|
115
|
+
function errorInfo(x) {
|
|
116
|
+
if (x && typeof x === "object" && ("message" in x || "stack" in x)) {
|
|
117
|
+
const e = x;
|
|
118
|
+
return { type: String(e.name || "Error"), message: String(e.message ?? ""), stack: typeof e.stack === "string" ? e.stack : undefined };
|
|
119
|
+
}
|
|
120
|
+
return { type: typeof x === "string" ? "string" : "UnknownError", message: typeof x === "string" ? x : safeString(x) };
|
|
121
|
+
}
|
|
122
|
+
function safeString(x) {
|
|
123
|
+
try {
|
|
124
|
+
return typeof x === "object" ? JSON.stringify(x) ?? String(x) : String(x);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return String(x);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Records an error as a span with an OTLP 'exception' event (same attribute names as the Node SDK / OTel). */
|
|
131
|
+
export function createErrorReporter(c) {
|
|
132
|
+
let count = 0;
|
|
133
|
+
return (error, source, where) => {
|
|
134
|
+
try {
|
|
135
|
+
if (count >= c.opts.maxErrorsPerPage)
|
|
136
|
+
return;
|
|
137
|
+
count++;
|
|
138
|
+
const info = errorInfo(error);
|
|
139
|
+
const now = c.env.now();
|
|
140
|
+
const s = c.tracer.start("exception", 1, {
|
|
141
|
+
traceId: c.page.traceId,
|
|
142
|
+
parentSpanId: c.page.spanId,
|
|
143
|
+
sampled: c.page.sampled,
|
|
144
|
+
startMs: now,
|
|
145
|
+
attributes: { "owlpane.error.source": source, "code.filepath": where?.file, "code.lineno": where?.line, "code.column": where?.col },
|
|
146
|
+
});
|
|
147
|
+
s.end({
|
|
148
|
+
endMs: now,
|
|
149
|
+
status: { code: 2, message: info.message.slice(0, 500) },
|
|
150
|
+
events: [
|
|
151
|
+
{
|
|
152
|
+
name: "exception",
|
|
153
|
+
timeMs: now,
|
|
154
|
+
attributes: { "exception.type": info.type, "exception.message": info.message.slice(0, 2000), "exception.stacktrace": info.stack?.slice(0, 8000), "exception.escaped": true },
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
/* ignore */
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
export function captureErrors(c, report) {
|
|
165
|
+
const add = c.env.addEventListener;
|
|
166
|
+
if (!add)
|
|
167
|
+
return;
|
|
168
|
+
add("error", (ev) => {
|
|
169
|
+
// Resource load errors have no `message`; skip them.
|
|
170
|
+
if (!ev || (ev.message === undefined && ev.error === undefined))
|
|
171
|
+
return;
|
|
172
|
+
report(ev.error ?? ev.message, "onerror", { file: ev.filename ? String(ev.filename).split(/[?#]/)[0] : undefined, line: ev.lineno, col: ev.colno });
|
|
173
|
+
});
|
|
174
|
+
add("unhandledrejection", (ev) => report(ev?.reason, "unhandledrejection"));
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=observers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observers.js","sourceRoot":"","sources":["../src/observers.ts"],"names":[],"mappings":"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"}
|
package/dist/otlp.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export type AttrValue = string | number | boolean;
|
|
2
|
+
export type Attrs = Record<string, AttrValue | undefined | null>;
|
|
3
|
+
export type SpanEvent = {
|
|
4
|
+
name: string;
|
|
5
|
+
timeMs: number;
|
|
6
|
+
attributes?: Attrs;
|
|
7
|
+
};
|
|
8
|
+
export type SpanData = {
|
|
9
|
+
traceId: string;
|
|
10
|
+
spanId: string;
|
|
11
|
+
parentSpanId?: string;
|
|
12
|
+
name: string;
|
|
13
|
+
/** OTLP SpanKind: 1 internal, 2 server, 3 client. */
|
|
14
|
+
kind: 1 | 3;
|
|
15
|
+
/** Epoch milliseconds (fractional allowed). */
|
|
16
|
+
startMs: number;
|
|
17
|
+
endMs: number;
|
|
18
|
+
attributes: Attrs;
|
|
19
|
+
events?: SpanEvent[];
|
|
20
|
+
/** OTLP status code: 0 unset, 1 ok, 2 error. */
|
|
21
|
+
status?: {
|
|
22
|
+
code: 0 | 1 | 2;
|
|
23
|
+
message?: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export type OtlpAnyValue = {
|
|
27
|
+
stringValue: string;
|
|
28
|
+
} | {
|
|
29
|
+
intValue: string;
|
|
30
|
+
} | {
|
|
31
|
+
doubleValue: number;
|
|
32
|
+
} | {
|
|
33
|
+
boolValue: boolean;
|
|
34
|
+
};
|
|
35
|
+
export type OtlpKeyValue = {
|
|
36
|
+
key: string;
|
|
37
|
+
value: OtlpAnyValue;
|
|
38
|
+
};
|
|
39
|
+
export declare function unixNano(ms: number): string;
|
|
40
|
+
export declare function encodeValue(v: AttrValue): OtlpAnyValue;
|
|
41
|
+
export declare function encodeAttrs(attrs: Attrs | undefined): OtlpKeyValue[];
|
|
42
|
+
export declare function encodeSpan(s: SpanData): Record<string, unknown>;
|
|
43
|
+
export declare const SCOPE: {
|
|
44
|
+
name: string;
|
|
45
|
+
};
|
|
46
|
+
/** Wraps already-serialised span JSON strings into an ExportTraceServiceRequest body. */
|
|
47
|
+
export declare function buildRequestBody(resourceAttrs: Attrs, spanJson: string[], version: string): string;
|
package/dist/otlp.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function unixNano(ms) {
|
|
2
|
+
if (!Number.isFinite(ms) || ms < 0)
|
|
3
|
+
return "0";
|
|
4
|
+
return (BigInt(Math.round(ms * 1000)) * 1000n).toString();
|
|
5
|
+
}
|
|
6
|
+
export function encodeValue(v) {
|
|
7
|
+
if (typeof v === "boolean")
|
|
8
|
+
return { boolValue: v };
|
|
9
|
+
if (typeof v === "number") {
|
|
10
|
+
if (!Number.isFinite(v))
|
|
11
|
+
return { stringValue: String(v) };
|
|
12
|
+
return Number.isInteger(v) && Math.abs(v) <= Number.MAX_SAFE_INTEGER ? { intValue: String(v) } : { doubleValue: v };
|
|
13
|
+
}
|
|
14
|
+
return { stringValue: String(v) };
|
|
15
|
+
}
|
|
16
|
+
export function encodeAttrs(attrs) {
|
|
17
|
+
const out = [];
|
|
18
|
+
if (!attrs)
|
|
19
|
+
return out;
|
|
20
|
+
for (const [key, value] of Object.entries(attrs)) {
|
|
21
|
+
if (value === undefined || value === null)
|
|
22
|
+
continue;
|
|
23
|
+
out.push({ key, value: encodeValue(value) });
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
export function encodeSpan(s) {
|
|
28
|
+
const o = {
|
|
29
|
+
traceId: s.traceId,
|
|
30
|
+
spanId: s.spanId,
|
|
31
|
+
name: s.name,
|
|
32
|
+
kind: s.kind,
|
|
33
|
+
startTimeUnixNano: unixNano(s.startMs),
|
|
34
|
+
endTimeUnixNano: unixNano(Math.max(s.endMs, s.startMs)),
|
|
35
|
+
attributes: encodeAttrs(s.attributes),
|
|
36
|
+
events: (s.events ?? []).map((e) => ({ timeUnixNano: unixNano(e.timeMs), name: e.name, attributes: encodeAttrs(e.attributes) })),
|
|
37
|
+
status: s.status ? { code: s.status.code, ...(s.status.message ? { message: s.status.message } : {}) } : { code: 0 },
|
|
38
|
+
};
|
|
39
|
+
if (s.parentSpanId)
|
|
40
|
+
o.parentSpanId = s.parentSpanId;
|
|
41
|
+
return o;
|
|
42
|
+
}
|
|
43
|
+
export const SCOPE = { name: "@owlpane/browser" };
|
|
44
|
+
/** Wraps already-serialised span JSON strings into an ExportTraceServiceRequest body. */
|
|
45
|
+
export function buildRequestBody(resourceAttrs, spanJson, version) {
|
|
46
|
+
const resource = JSON.stringify({ attributes: encodeAttrs(resourceAttrs) });
|
|
47
|
+
return `{"resourceSpans":[{"resource":${resource},"scopeSpans":[{"scope":${JSON.stringify({ ...SCOPE, version })},"spans":[${spanJson.join(",")}]}]}]}`;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=otlp.js.map
|
package/dist/otlp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp.js","sourceRoot":"","sources":["../src/otlp.ts"],"names":[],"mappings":"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"}
|
package/dist/queue.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type QueueItem = {
|
|
2
|
+
json: string;
|
|
3
|
+
bytes: number;
|
|
4
|
+
};
|
|
5
|
+
/** Bounded FIFO. Oldest items are dropped when full so a broken endpoint cannot grow memory. */
|
|
6
|
+
export declare class SpanQueue {
|
|
7
|
+
private readonly maxItems;
|
|
8
|
+
private items;
|
|
9
|
+
dropped: number;
|
|
10
|
+
constructor(maxItems: number);
|
|
11
|
+
get size(): number;
|
|
12
|
+
push(item: QueueItem): void;
|
|
13
|
+
/**
|
|
14
|
+
* Removes and returns items for one request, capped by count and by total bytes.
|
|
15
|
+
* A single oversize item is dropped (counted) rather than blocking the queue.
|
|
16
|
+
*/
|
|
17
|
+
take(maxCount: number, maxBytes: number): QueueItem[];
|
|
18
|
+
}
|
package/dist/queue.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Bounded FIFO. Oldest items are dropped when full so a broken endpoint cannot grow memory. */
|
|
2
|
+
export class SpanQueue {
|
|
3
|
+
maxItems;
|
|
4
|
+
items = [];
|
|
5
|
+
dropped = 0;
|
|
6
|
+
constructor(maxItems) {
|
|
7
|
+
this.maxItems = maxItems;
|
|
8
|
+
}
|
|
9
|
+
get size() {
|
|
10
|
+
return this.items.length;
|
|
11
|
+
}
|
|
12
|
+
push(item) {
|
|
13
|
+
this.items.push(item);
|
|
14
|
+
while (this.items.length > this.maxItems) {
|
|
15
|
+
this.items.shift();
|
|
16
|
+
this.dropped++;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Removes and returns items for one request, capped by count and by total bytes.
|
|
21
|
+
* A single oversize item is dropped (counted) rather than blocking the queue.
|
|
22
|
+
*/
|
|
23
|
+
take(maxCount, maxBytes) {
|
|
24
|
+
const out = [];
|
|
25
|
+
let bytes = 0;
|
|
26
|
+
while (this.items.length && out.length < maxCount) {
|
|
27
|
+
const next = this.items[0];
|
|
28
|
+
if (next.bytes > maxBytes) {
|
|
29
|
+
this.items.shift();
|
|
30
|
+
this.dropped++;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (bytes + next.bytes > maxBytes)
|
|
34
|
+
break;
|
|
35
|
+
bytes += next.bytes;
|
|
36
|
+
out.push(this.items.shift());
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,MAAM,OAAO,SAAS;IAGS;IAFrB,KAAK,GAAgB,EAAE,CAAC;IAChC,OAAO,GAAG,CAAC,CAAC;IACZ,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,IAAe;QAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,QAAgB,EAAE,QAAgB;QACrC,MAAM,GAAG,GAAgB,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,QAAQ;gBAAE,MAAM;YACzC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|