@tracepanel/js 0.5.0 → 0.7.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/README.md +265 -14
- package/dist/agent.d.ts +5 -1
- package/dist/agent.js +12 -3
- package/dist/agent.js.map +1 -1
- package/dist/aws.d.ts +27 -0
- package/dist/aws.js +368 -0
- package/dist/aws.js.map +1 -0
- package/dist/browser.d.ts +4 -1
- package/dist/browser.js +33 -3
- package/dist/browser.js.map +1 -1
- package/dist/bun.js +6 -82
- package/dist/bun.js.map +1 -1
- package/dist/calls.d.ts +5 -0
- package/dist/calls.js +7 -0
- package/dist/calls.js.map +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/explain.d.ts +5 -0
- package/dist/explain.js +56 -7
- package/dist/explain.js.map +1 -1
- package/dist/express.js +43 -3
- package/dist/express.js.map +1 -1
- package/dist/fastify.d.ts +2 -0
- package/dist/fastify.js +100 -0
- package/dist/fastify.js.map +1 -0
- package/dist/frameworks.js +3 -0
- package/dist/frameworks.js.map +1 -1
- package/dist/graphql.d.ts +39 -0
- package/dist/graphql.js +337 -0
- package/dist/graphql.js.map +1 -0
- package/dist/hono.d.ts +2 -0
- package/dist/hono.js +63 -0
- package/dist/hono.js.map +1 -0
- package/dist/koa.d.ts +2 -0
- package/dist/koa.js +119 -0
- package/dist/koa.js.map +1 -0
- package/dist/llm.d.ts +20 -0
- package/dist/llm.js +632 -0
- package/dist/llm.js.map +1 -0
- package/dist/memory.d.ts +69 -0
- package/dist/memory.js +203 -0
- package/dist/memory.js.map +1 -0
- package/dist/model.d.ts +22 -1
- package/dist/model.js.map +1 -1
- package/dist/next.js +4 -4
- package/dist/next.js.map +1 -1
- package/dist/processor.d.ts +50 -5
- package/dist/processor.js +193 -30
- package/dist/processor.js.map +1 -1
- package/dist/profile.d.ts +34 -8
- package/dist/profile.js +98 -13
- package/dist/profile.js.map +1 -1
- package/dist/propagation.d.ts +12 -0
- package/dist/propagation.js +48 -0
- package/dist/propagation.js.map +1 -0
- package/dist/queries.d.ts +20 -0
- package/dist/queries.js +75 -0
- package/dist/queries.js.map +1 -0
- package/dist/respond.d.ts +12 -0
- package/dist/respond.js +85 -0
- package/dist/respond.js.map +1 -0
- package/dist/setup.js +27 -6
- package/dist/setup.js.map +1 -1
- package/dist/sql.d.ts +1 -0
- package/dist/sql.js +11 -2
- package/dist/sql.js.map +1 -1
- package/dist/sqlite.d.ts +13 -0
- package/dist/sqlite.js +291 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/stack.d.ts +3 -1
- package/dist/stack.js +30 -6
- package/dist/stack.js.map +1 -1
- package/dist/testing.d.ts +128 -0
- package/dist/testing.js +362 -0
- package/dist/testing.js.map +1 -0
- package/dist/transactions.d.ts +11 -1
- package/dist/transactions.js +70 -34
- package/dist/transactions.js.map +1 -1
- package/dist/view.d.ts +17 -0
- package/dist/view.js +71 -0
- package/dist/view.js.map +1 -0
- package/dist/vitest-setup.d.ts +1 -0
- package/dist/vitest-setup.js +63 -0
- package/dist/vitest-setup.js.map +1 -0
- package/dist/vitest.d.ts +57 -0
- package/dist/vitest.js +130 -0
- package/dist/vitest.js.map +1 -0
- package/dist/widget.d.ts +16 -0
- package/dist/widget.js +42 -1
- package/dist/widget.js.map +1 -1
- package/package.json +81 -4
package/dist/profile.d.ts
CHANGED
|
@@ -1,29 +1,46 @@
|
|
|
1
1
|
import type { Config } from "./config.js";
|
|
2
|
+
import { type Heap } from "./memory.js";
|
|
2
3
|
import type { Profile } from "./model.js";
|
|
3
4
|
import { type RequestHeaders } from "./request.js";
|
|
4
5
|
export declare const HEADER = "x-tracepanel-profile";
|
|
5
6
|
export declare const COOKIE = "tracepanel_profile";
|
|
6
|
-
/** On a request's root span: the request asked
|
|
7
|
+
/** On a request's root span: what the request asked for ("1", or "memory"). */
|
|
7
8
|
export declare const ATTRIBUTE = "tracepanel.profile";
|
|
8
|
-
/** In the context a framework starts the request's root span in (Next.js's): the request asked
|
|
9
|
+
/** In the context a framework starts the request's root span in (Next.js's): what the request asked for. */
|
|
9
10
|
export declare const ASKED: symbol;
|
|
10
|
-
/**
|
|
11
|
-
export
|
|
12
|
-
/**
|
|
13
|
-
export declare function
|
|
11
|
+
/** What a request asks for: the profile ("1"), or the profile with its memory ("memory"). */
|
|
12
|
+
export type Asked = "1" | "memory";
|
|
13
|
+
/** What a value asks for: "1" or "memory" as they are, true (a span marked by code) "1"; else nothing. */
|
|
14
|
+
export declare function asking(value: unknown): Asked | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* What a request asks for: the X-Tracepanel-Profile header's, else the cookie's the panel's toggle sets; undefined
|
|
17
|
+
* when neither asks.
|
|
18
|
+
*/
|
|
19
|
+
export declare function requested(headers: RequestHeaders): Asked | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* How to profile a trace: "memory" with its memory, "1" its time only; undefined for none. The setting profiles
|
|
22
|
+
* every one, a request may ask; nothing when profiling is off.
|
|
23
|
+
*/
|
|
24
|
+
export declare function wanted(config: Config, asked: Asked | undefined): Asked | undefined;
|
|
14
25
|
/** Whether this runtime can profile: Node, with its inspector. */
|
|
15
26
|
export declare function available(): boolean;
|
|
27
|
+
/** Whether this runtime can profile memory too: Node's inspector, and V8's GC profiler. */
|
|
28
|
+
export declare function memoryProfiling(): boolean;
|
|
16
29
|
/** One trace's profile while it runs: its console profile's title, and when it started (performance.now()). */
|
|
17
30
|
export interface Recording {
|
|
18
31
|
title: string;
|
|
19
32
|
startedMs: number;
|
|
20
33
|
/** The trace it profiles, as the profiler knows every trace of the process (see enter()). */
|
|
21
34
|
trace: object;
|
|
35
|
+
/** Its memory, when that was asked for. */
|
|
36
|
+
heap: Heap | undefined;
|
|
22
37
|
}
|
|
23
38
|
/** The trace's profile and the samples left out because another trace ran at the same time. */
|
|
24
39
|
export interface Result {
|
|
25
40
|
profile: Profile | undefined;
|
|
26
41
|
dropped: number;
|
|
42
|
+
/** The collector's runs during the trace, read once Node has told them (after the trace's late spans). */
|
|
43
|
+
gc?: () => Profile["gc"];
|
|
27
44
|
}
|
|
28
45
|
/** The app's profiler: the profile that runs while traces are profiled, and when each trace of the process ran. */
|
|
29
46
|
export declare class Profiler {
|
|
@@ -40,17 +57,26 @@ export declare class Profiler {
|
|
|
40
57
|
private ended;
|
|
41
58
|
/** The console profiles stopped, by title, as the inspector hands them over. */
|
|
42
59
|
private readonly finished;
|
|
60
|
+
private heaps;
|
|
61
|
+
private readonly collections;
|
|
43
62
|
constructor(root: string, intervalMs: number);
|
|
44
63
|
/** A trace started (each one, profiled or not): a sample taken while it runs may be its. */
|
|
45
64
|
enter(trace: object): void;
|
|
46
65
|
/** A trace ended. */
|
|
47
66
|
leave(trace: object): void;
|
|
48
|
-
/**
|
|
49
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Begins profiling a trace that started (enter() first), its memory too when `memory`; undefined when the
|
|
69
|
+
* inspector can't.
|
|
70
|
+
*/
|
|
71
|
+
start(trace: object, memory?: boolean): Recording | undefined;
|
|
50
72
|
/** Ends a trace's profile, before it leaves: what was sampled while it alone ran. */
|
|
51
73
|
stop(recording: Recording): Result;
|
|
52
74
|
/** The profile that runs under the traces' own: started with the first profiled trace. */
|
|
53
75
|
private ensure;
|
|
76
|
+
/** Whether another trace than the recording's ran while it did (the heap is the process's). */
|
|
77
|
+
private overlapped;
|
|
78
|
+
/** The profile's `memory`: its sites' frames added to the profile's own, each once. */
|
|
79
|
+
private memory;
|
|
54
80
|
/** No trace is profiled: the profile under them stops after a while, or now when it ran long. */
|
|
55
81
|
private rest;
|
|
56
82
|
private halt;
|
package/dist/profile.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Where a trace's time goes in code: V8's sampling profiler, through Node's inspector (the trace's `profile`, a flame
|
|
2
2
|
// graph in the console). Nothing runs until a trace is profiled: the setting profiles every one, a request asks with
|
|
3
|
-
// the X-Tracepanel-Profile: 1 header or the panel's tracepanel_profile=1 cookie.
|
|
3
|
+
// the X-Tracepanel-Profile: 1 header or the panel's tracepanel_profile=1 cookie. "memory" there rather than "1", or
|
|
4
|
+
// TRACEPANEL_PROFILE_MEMORY=1, profiles its memory too (memory.ts). Every profile has the collector's runs (`gc`).
|
|
4
5
|
//
|
|
5
6
|
// The profiler samples the whole thread, and one event loop runs every request of the process at once: a sample
|
|
6
7
|
// can't tell which request a frame belongs to. So a profiled trace keeps the samples taken while it was the only trace
|
|
@@ -15,13 +16,14 @@
|
|
|
15
16
|
import { relative } from "node:path";
|
|
16
17
|
import { createContextKey } from "@opentelemetry/api";
|
|
17
18
|
import { call, connect, inspector } from "./inspector.js";
|
|
19
|
+
import { Collections, HeapSampler, memoryAvailable } from "./memory.js";
|
|
18
20
|
import { headerValue, parseCookies } from "./request.js";
|
|
19
21
|
import { inApp, libraryPath, ownFile, place } from "./stack.js";
|
|
20
22
|
export const HEADER = "x-tracepanel-profile";
|
|
21
23
|
export const COOKIE = "tracepanel_profile";
|
|
22
|
-
/** On a request's root span: the request asked
|
|
24
|
+
/** On a request's root span: what the request asked for ("1", or "memory"). */
|
|
23
25
|
export const ATTRIBUTE = "tracepanel.profile";
|
|
24
|
-
/** In the context a framework starts the request's root span in (Next.js's): the request asked
|
|
26
|
+
/** In the context a framework starts the request's root span in (Next.js's): what the request asked for. */
|
|
25
27
|
export const ASKED = createContextKey("tracepanel.profile");
|
|
26
28
|
// How deep a stack is kept: a recursion beyond it is cut, outermost frames kept.
|
|
27
29
|
const MAX_DEPTH = 128;
|
|
@@ -35,22 +37,46 @@ const RENEW_MS = 60_000;
|
|
|
35
37
|
const IDLE = "(idle)";
|
|
36
38
|
const ROOT = "(root)";
|
|
37
39
|
const OTHER = { function: "(other)", module: null, file: "", line: 0, in_app: false };
|
|
38
|
-
/**
|
|
40
|
+
/** A frame as the profile names it, once: by its function, file and line. */
|
|
41
|
+
function frameKey(frame) {
|
|
42
|
+
return `${frame.file}:${frame.line}:${frame.function}`;
|
|
43
|
+
}
|
|
44
|
+
/** What a value asks for: "1" or "memory" as they are, true (a span marked by code) "1"; else nothing. */
|
|
45
|
+
export function asking(value) {
|
|
46
|
+
if (value === true || value === "1")
|
|
47
|
+
return "1";
|
|
48
|
+
return value === "memory" ? "memory" : undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* What a request asks for: the X-Tracepanel-Profile header's, else the cookie's the panel's toggle sets; undefined
|
|
52
|
+
* when neither asks.
|
|
53
|
+
*/
|
|
39
54
|
export function requested(headers) {
|
|
40
|
-
|
|
41
|
-
|
|
55
|
+
const asked = asking(headerValue(headers[HEADER])?.trim());
|
|
56
|
+
if (asked)
|
|
57
|
+
return asked;
|
|
42
58
|
const cookies = headerValue(headers.cookie);
|
|
43
|
-
|
|
44
|
-
|
|
59
|
+
if (cookies?.includes(COOKIE) !== true)
|
|
60
|
+
return undefined;
|
|
61
|
+
return asking(parseCookies(cookies).find(([name]) => name === COOKIE)?.[1]);
|
|
45
62
|
}
|
|
46
|
-
/**
|
|
63
|
+
/**
|
|
64
|
+
* How to profile a trace: "memory" with its memory, "1" its time only; undefined for none. The setting profiles
|
|
65
|
+
* every one, a request may ask; nothing when profiling is off.
|
|
66
|
+
*/
|
|
47
67
|
export function wanted(config, asked) {
|
|
48
|
-
|
|
68
|
+
if (!(config.profileEnabled && (config.profile || asked) && available()))
|
|
69
|
+
return undefined;
|
|
70
|
+
return (config.profileMemory || asked === "memory") && memoryAvailable() ? "memory" : "1";
|
|
49
71
|
}
|
|
50
72
|
/** Whether this runtime can profile: Node, with its inspector. */
|
|
51
73
|
export function available() {
|
|
52
74
|
return inspector() !== null;
|
|
53
75
|
}
|
|
76
|
+
/** Whether this runtime can profile memory too: Node's inspector, and V8's GC profiler. */
|
|
77
|
+
export function memoryProfiling() {
|
|
78
|
+
return available() && memoryAvailable();
|
|
79
|
+
}
|
|
54
80
|
let next = 0;
|
|
55
81
|
/** The app's profiler: the profile that runs while traces are profiled, and when each trace of the process ran. */
|
|
56
82
|
export class Profiler {
|
|
@@ -67,6 +93,8 @@ export class Profiler {
|
|
|
67
93
|
ended = [];
|
|
68
94
|
/** The console profiles stopped, by title, as the inspector hands them over. */
|
|
69
95
|
finished = new Map();
|
|
96
|
+
heaps;
|
|
97
|
+
collections = new Collections();
|
|
70
98
|
constructor(root, intervalMs) {
|
|
71
99
|
this.root = root;
|
|
72
100
|
this.intervalMs = intervalMs;
|
|
@@ -84,14 +112,21 @@ export class Profiler {
|
|
|
84
112
|
if (this.recordings.size > 0)
|
|
85
113
|
this.ended.push([started, performance.now()]);
|
|
86
114
|
}
|
|
87
|
-
/**
|
|
88
|
-
|
|
115
|
+
/**
|
|
116
|
+
* Begins profiling a trace that started (enter() first), its memory too when `memory`; undefined when the
|
|
117
|
+
* inspector can't.
|
|
118
|
+
*/
|
|
119
|
+
start(trace, memory = false) {
|
|
89
120
|
const console = inspector()?.console;
|
|
90
121
|
if (!console || !this.ensure())
|
|
91
122
|
return undefined;
|
|
92
123
|
clearTimeout(this.idle);
|
|
124
|
+
this.collections.watch();
|
|
93
125
|
next += 1;
|
|
94
|
-
|
|
126
|
+
if (memory && this.session && !this.heaps)
|
|
127
|
+
this.heaps = new HeapSampler(this.session);
|
|
128
|
+
const heap = memory ? this.heaps?.begin() : undefined;
|
|
129
|
+
const recording = { title: `tracepanel:${next}`, startedMs: performance.now(), trace, heap };
|
|
95
130
|
console.profile(recording.title);
|
|
96
131
|
this.recordings.add(recording);
|
|
97
132
|
return recording;
|
|
@@ -101,10 +136,24 @@ export class Profiler {
|
|
|
101
136
|
if (!this.recordings.has(recording))
|
|
102
137
|
return { profile: undefined, dropped: 0 };
|
|
103
138
|
inspector()?.console.profileEnd(recording.title);
|
|
139
|
+
const endedMs = performance.now();
|
|
140
|
+
// Before it is let go: whether another trace ran while it did.
|
|
141
|
+
const shared = recording.heap ? this.overlapped(recording) : false;
|
|
142
|
+
const measured = recording.heap
|
|
143
|
+
? this.heaps?.end(recording.heap, (frame) => this.frame(frame) === null)
|
|
144
|
+
: undefined;
|
|
104
145
|
this.recordings.delete(recording);
|
|
105
146
|
const profile = this.finished.get(recording.title);
|
|
106
147
|
this.finished.delete(recording.title);
|
|
107
148
|
const result = profile ? this.document(recording, profile) : { profile: undefined, dropped: 0 };
|
|
149
|
+
if (measured) {
|
|
150
|
+
result.profile ??= { interval_us: Math.round(this.intervalMs * 1000), samples: 0, frames: [], stacks: [] };
|
|
151
|
+
result.profile.memory = this.memory(result.profile, measured.sites, shared, measured);
|
|
152
|
+
}
|
|
153
|
+
if (result.profile) {
|
|
154
|
+
const { startedMs } = recording;
|
|
155
|
+
result.gc = () => this.collections.during(startedMs, endedMs);
|
|
156
|
+
}
|
|
108
157
|
if (this.recordings.size === 0)
|
|
109
158
|
this.rest();
|
|
110
159
|
else {
|
|
@@ -147,6 +196,41 @@ export class Profiler {
|
|
|
147
196
|
}
|
|
148
197
|
return true;
|
|
149
198
|
}
|
|
199
|
+
/** Whether another trace than the recording's ran while it did (the heap is the process's). */
|
|
200
|
+
overlapped(recording) {
|
|
201
|
+
for (const trace of this.open.keys())
|
|
202
|
+
if (trace !== recording.trace)
|
|
203
|
+
return true;
|
|
204
|
+
return this.ended.some(([, end]) => end >= recording.startedMs);
|
|
205
|
+
}
|
|
206
|
+
/** The profile's `memory`: its sites' frames added to the profile's own, each once. */
|
|
207
|
+
memory(profile, sites, shared, measured) {
|
|
208
|
+
const index = new Map(profile.frames.map((frame, at) => [frameKey(frame), at]));
|
|
209
|
+
const named = sites.flatMap((site) => {
|
|
210
|
+
const frames = site.frames.flatMap((callFrame) => {
|
|
211
|
+
const frame = this.frame(callFrame);
|
|
212
|
+
if (!frame)
|
|
213
|
+
return [];
|
|
214
|
+
const key = frameKey(frame);
|
|
215
|
+
let at = index.get(key);
|
|
216
|
+
if (at === undefined) {
|
|
217
|
+
at = profile.frames.length;
|
|
218
|
+
index.set(key, at);
|
|
219
|
+
profile.frames.push(frame);
|
|
220
|
+
}
|
|
221
|
+
return [at];
|
|
222
|
+
});
|
|
223
|
+
return frames.length > 0 ? [{ frames, bytes: site.bytes, count: site.count }] : [];
|
|
224
|
+
});
|
|
225
|
+
return {
|
|
226
|
+
peak: measured.peak,
|
|
227
|
+
net: measured.net,
|
|
228
|
+
...(measured.allocated !== undefined ? { allocated: measured.allocated } : {}),
|
|
229
|
+
sites: named,
|
|
230
|
+
sites_at: "end",
|
|
231
|
+
shared,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
150
234
|
/** No trace is profiled: the profile under them stops after a while, or now when it ran long. */
|
|
151
235
|
rest() {
|
|
152
236
|
this.ended = [];
|
|
@@ -162,6 +246,7 @@ export class Profiler {
|
|
|
162
246
|
if (!this.session || !this.running || this.recordings.size > 0)
|
|
163
247
|
return;
|
|
164
248
|
this.running = false;
|
|
249
|
+
this.collections.rest();
|
|
165
250
|
try {
|
|
166
251
|
call(this.session, "Profiler.stop");
|
|
167
252
|
}
|
package/dist/profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,qHAAqH;AACrH,iFAAiF;AACjF,EAAE;AACF,gHAAgH;AAChH,uHAAuH;AACvH,mHAAmH;AACnH,qHAAqH;AACrH,mHAAmH;AACnH,oEAAoE;AACpE,EAAE;AACF,iHAAiH;AACjH,qHAAqH;AACrH,4EAA4E;AAE5E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAgB,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAuB,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,MAAM,MAAM,GAAG,sBAAsB,CAAC;AAC7C,MAAM,CAAC,MAAM,MAAM,GAAG,oBAAoB,CAAC;AAC3C,kEAAkE;AAClE,MAAM,CAAC,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAC9C,kHAAkH;AAClH,MAAM,CAAC,MAAM,KAAK,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;AAE5D,iFAAiF;AACjF,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,0GAA0G;AAC1G,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,gFAAgF;AAChF,MAAM,OAAO,GAAG,MAAM,CAAC;AACvB,6GAA6G;AAC7G,MAAM,QAAQ,GAAG,MAAM,CAAC;AACxB,iGAAiG;AACjG,MAAM,IAAI,GAAG,QAAQ,CAAC;AACtB,MAAM,IAAI,GAAG,QAAQ,CAAC;AACtB,MAAM,KAAK,GAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAEpG,qHAAqH;AACrH,MAAM,UAAU,SAAS,CAAC,OAAuB;IAC/C,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,CACL,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI;QAClC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC,CAChF,CAAC;AACJ,CAAC;AAED,oHAAoH;AACpH,MAAM,UAAU,MAAM,CAAC,MAAc,EAAE,KAAc;IACnD,OAAO,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;AAC3E,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,SAAS;IACvB,OAAO,SAAS,EAAE,KAAK,IAAI,CAAC;AAC9B,CAAC;AA8BD,IAAI,IAAI,GAAG,CAAC,CAAC;AAEb,mHAAmH;AACnH,MAAM,OAAO,QAAQ;IAcA,IAAI;IACJ,UAAU;IAdrB,OAAO,CAAsB;IAC7B,OAAO,GAAG,KAAK,CAAC;IAChB,YAAY,GAAG,CAAC,CAAC;IACjB,IAAI,CAA6B;IACxB,UAAU,GAAG,IAAI,GAAG,EAAa,CAAC;IACnD,mEAAmE;IAClD,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,6EAA6E;IACrE,KAAK,GAAuB,EAAE,CAAC;IACvC,gFAAgF;IAC/D,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE1D,YACmB,IAAY,EACZ,UAAkB;oBADlB,IAAI;0BACJ,UAAU;IAC1B,CAAC;IAEJ,4FAA4F;IAC5F,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,qBAAqB;IACrB,KAAK,CAAC,KAAa;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,iGAAiG;IACjG,KAAK,CAAC,KAAa;QACjB,MAAM,OAAO,GAAG,SAAS,EAAE,EAAE,OAAO,CAAC;QACrC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,SAAS,CAAC;QACjD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,CAAC;QACV,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,cAAc,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC;QACvF,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,qFAAqF;IACrF,IAAI,CAAC,SAAoB;QACvB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/E,SAAS,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAChG,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;aACvC,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YACjF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0FAA0F;IAClF,MAAM;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAC3B,IAAI,CAAC;gBACH,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;gBACjC,IAAI,CAAC,OAAO,EAAE,8BAA8B,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YAClG,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,UAAU,EAAE,CAAC;gBACrB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,CAAC,EAAE,CAAC,iCAAiC,EAAE,CAAC,OAA4D,EAAE,EAAE;gBAC7G,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC1C,mFAAmF;gBACnF,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC;oBACrE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iGAAiG;IACzF,IAAI;QACV,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,GAAG,QAAQ,EAAE,CAAC;YACrD,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAEO,IAAI;QACV,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC;YAAE,OAAO;QACvE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;IACH,CAAC;IAED,kFAAkF;IAC1E,MAAM,CAAC,SAAoB,EAAE,EAAU;QAC7C,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,KAAK,KAAK,SAAS,CAAC,KAAK,IAAI,OAAO,IAAI,EAAE;gBAAE,OAAO,IAAI,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,4GAA4G;IACpG,QAAQ,CAAC,SAAoB,EAAE,OAAmB;QACxD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK;YAAE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,sFAAsF;QACtF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;QACnD,MAAM,UAAU,GAAG,CAAC,SAAoB,EAAiB,EAAE;YACzD,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YAC3G,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YACxB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAmB,EAAE;YAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACtC,MAAM,KAAK,GAAgB,EAAE,CAAC;YAC9B,KAAK,IAAI,EAAE,GAAuB,EAAE,EAAE,EAAE,KAAK,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3B,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,KAAK,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,KAAK,GAAoB,IAAI,CAAC;YAClC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,EAAE,CAAC;gBACpC,KAAK,GAAG,EAAE,CAAC;gBACX,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;oBACxC,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;wBAAE,MAAM;oBACrC,MAAM,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;oBACjC,IAAI,EAAE,KAAK,IAAI;wBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,GAAG,EAA+C,CAAC;QACtE,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;YACzC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC/C,gEAAgE;YAChE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;gBACpF,OAAO,IAAI,CAAC,CAAC;gBACb,OAAO;YACT,CAAC;YACD,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,UAAU,EAAE,CAAC;gBAClD,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;oBACtB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;gBACD,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;gBACf,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,OAAO;gBAAE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;;gBAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC1D,yFAAyF;QACzF,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,GAAmB,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;YAC7B,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC5C,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;oBACrB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;oBACjB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAiB,CAAC,CAAC;gBAC3C,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;YAC3F,OAAO;SACR,CAAC;IACJ,CAAC;IAED,uEAAuE;IAC/D,KAAK,CAAC,SAAoB;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,IAAI,aAAa,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,GAAG;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC9F,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACzF,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;YACrE,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,GAAG;SACZ,CAAC;IACJ,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Context, type TextMapGetter, type TextMapPropagator, type TextMapSetter } from "@opentelemetry/api";
|
|
2
|
+
import { type Asked } from "./profile.js";
|
|
3
|
+
/** X-Tracepanel-Profile on a call made in a trace whose request asked to be profiled. */
|
|
4
|
+
export declare class ProfilePropagator implements TextMapPropagator {
|
|
5
|
+
private readonly askedBy;
|
|
6
|
+
constructor(askedBy: (spanId: string) => Asked | undefined);
|
|
7
|
+
inject(context: Context, carrier: unknown, setter: TextMapSetter): void;
|
|
8
|
+
extract(context: Context, _carrier: unknown, _getter: TextMapGetter): Context;
|
|
9
|
+
fields(): string[];
|
|
10
|
+
}
|
|
11
|
+
/** OpenTelemetry's default propagators (the W3C trace context and baggage), with the profile's ask beside them. */
|
|
12
|
+
export declare function profilePropagator(askedBy: (spanId: string) => Asked | undefined): TextMapPropagator;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// What a call to another app carries: the W3C trace context and baggage (OpenTelemetry's own), and, when the trace
|
|
2
|
+
// making it is profiled because its request asked (the X-Tracepanel-Profile header, the panel's cookie, a call that
|
|
3
|
+
// carried it here), the same ask: X-Tracepanel-Profile: 1, or memory. So the panel's Profile toggle profiles the
|
|
4
|
+
// whole chain, the browser's call to a BFF and each service the BFF calls in turn. It goes on exactly the calls that
|
|
5
|
+
// carry a traceparent (undici's fetch, node:http and what is built on it, Bun's calls): the propagator is the one they
|
|
6
|
+
// all inject with. A trace the `profile` setting profiles asks nothing of the next app, whose own setting decides.
|
|
7
|
+
import { trace, } from "@opentelemetry/api";
|
|
8
|
+
import { CompositePropagator, W3CBaggagePropagator, W3CTraceContextPropagator } from "@opentelemetry/core";
|
|
9
|
+
import { HEADER } from "./profile.js";
|
|
10
|
+
/** Whether the carrier has the header already, where it can say: the app's own goes, not this one. */
|
|
11
|
+
function hasHeader(carrier) {
|
|
12
|
+
if (carrier === null || typeof carrier !== "object")
|
|
13
|
+
return false;
|
|
14
|
+
if (typeof carrier.has === "function" && typeof carrier.get === "function") {
|
|
15
|
+
return carrier.has(HEADER);
|
|
16
|
+
}
|
|
17
|
+
const getHeader = carrier.getHeader;
|
|
18
|
+
if (typeof getHeader === "function")
|
|
19
|
+
return getHeader.call(carrier, HEADER) !== undefined;
|
|
20
|
+
return Object.keys(carrier).some((name) => name.toLowerCase() === HEADER);
|
|
21
|
+
}
|
|
22
|
+
/** X-Tracepanel-Profile on a call made in a trace whose request asked to be profiled. */
|
|
23
|
+
export class ProfilePropagator {
|
|
24
|
+
askedBy;
|
|
25
|
+
constructor(askedBy) {
|
|
26
|
+
this.askedBy = askedBy;
|
|
27
|
+
}
|
|
28
|
+
inject(context, carrier, setter) {
|
|
29
|
+
const span = trace.getSpan(context);
|
|
30
|
+
const asked = span ? this.askedBy(span.spanContext().spanId) : undefined;
|
|
31
|
+
if (asked && !hasHeader(carrier))
|
|
32
|
+
setter.set(carrier, HEADER, asked);
|
|
33
|
+
}
|
|
34
|
+
extract(context, _carrier, _getter) {
|
|
35
|
+
// A request's ask is read where its trace starts (profile.ts's requested()).
|
|
36
|
+
return context;
|
|
37
|
+
}
|
|
38
|
+
fields() {
|
|
39
|
+
return [HEADER];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** OpenTelemetry's default propagators (the W3C trace context and baggage), with the profile's ask beside them. */
|
|
43
|
+
export function profilePropagator(askedBy) {
|
|
44
|
+
return new CompositePropagator({
|
|
45
|
+
propagators: [new W3CTraceContextPropagator(), new W3CBaggagePropagator(), new ProfilePropagator(askedBy)],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=propagation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propagation.js","sourceRoot":"","sources":["../src/propagation.ts"],"names":[],"mappings":"AAAA,mHAAmH;AACnH,oHAAoH;AACpH,iHAAiH;AACjH,qHAAqH;AACrH,uHAAuH;AACvH,mHAAmH;AAEnH,OAAO,EAKL,KAAK,GACN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EAAc,MAAM,EAAE,MAAM,cAAc,CAAC;AAElD,sGAAsG;AACtG,SAAS,SAAS,CAAC,OAAgB;IACjC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClE,IAAI,OAAQ,OAAmB,CAAC,GAAG,KAAK,UAAU,IAAI,OAAQ,OAAmB,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QACrG,OAAQ,OAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,SAAS,GAAI,OAAmC,CAAC,SAAS,CAAC;IACjE,IAAI,OAAO,SAAS,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,SAAS,CAAC;IAC1F,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,yFAAyF;AACzF,MAAM,OAAO,iBAAiB;IACC,OAAO;IAApC,YAA6B,OAA8C;uBAA9C,OAAO;IAA0C,CAAC;IAE/E,MAAM,CAAC,OAAgB,EAAE,OAAgB,EAAE,MAAqB;QAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,CAAC,OAAgB,EAAE,QAAiB,EAAE,OAAsB;QACjE,6EAA6E;QAC7E,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;CACF;AAED,mHAAmH;AACnH,MAAM,UAAU,iBAAiB,CAAC,OAA8C;IAC9E,OAAO,IAAI,mBAAmB,CAAC;QAC7B,WAAW,EAAE,CAAC,IAAI,yBAAyB,EAAE,EAAE,IAAI,oBAAoB,EAAE,EAAE,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;KAC3G,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Context } from "@opentelemetry/api";
|
|
2
|
+
/** The app's line of the latest ORM call in this context, and the ORM: what a query span without one takes. */
|
|
3
|
+
export declare const QUERY_ORIGIN: symbol;
|
|
4
|
+
export interface QueryOrigin {
|
|
5
|
+
origin: string;
|
|
6
|
+
orm: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The app's context from here on, as `await client.query("BEGIN")` returns: what the global context manager's
|
|
10
|
+
* attach() does (AsyncLocalStorage's enterWith). A context manager without it leaves the app's context as it is.
|
|
11
|
+
*/
|
|
12
|
+
export declare function enter(target: Context): void;
|
|
13
|
+
/** Wraps the methods of an ORM class's prototype the app calls to start a query: each one takes the app's line. */
|
|
14
|
+
export declare function markQueries(proto: object | undefined, orm: string, root: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Drizzle's entry points on Bun. Its ES modules load without the hooks Node has (import-in-the-middle): a Bun
|
|
17
|
+
* plugin adds a line to each file as it loads, which hands its class over to be wrapped. A file that has changed and
|
|
18
|
+
* no longer has the class is left as it is.
|
|
19
|
+
*/
|
|
20
|
+
export declare function traceBunQueries(root: string): void;
|
package/dist/queries.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Where an ORM's query was made, when the driver's stack can't say. Bun's (JavaScriptCore's) stacks have no async
|
|
2
|
+
// frames: `await db.select().from(product)` runs Drizzle's then() from a microtask, and the driver's span starts under
|
|
3
|
+
// Drizzle's frames alone, none of the app's. The app's line is taken here instead, as the app calls the ORM (the
|
|
4
|
+
// query's first builder call, db.transaction(), db.query's findMany()), and handed to the driver's span in the app's
|
|
5
|
+
// context from then on, with the ORM's name: the span takes it when its own stack has none of the app's code.
|
|
6
|
+
import { readFileSync } from "node:fs";
|
|
7
|
+
import { context, createContextKey, trace } from "@opentelemetry/api";
|
|
8
|
+
import { madeAt } from "./stack.js";
|
|
9
|
+
/** The app's line of the latest ORM call in this context, and the ORM: what a query span without one takes. */
|
|
10
|
+
export const QUERY_ORIGIN = createContextKey("tracepanel.query_origin");
|
|
11
|
+
/**
|
|
12
|
+
* The app's context from here on, as `await client.query("BEGIN")` returns: what the global context manager's
|
|
13
|
+
* attach() does (AsyncLocalStorage's enterWith). A context manager without it leaves the app's context as it is.
|
|
14
|
+
*/
|
|
15
|
+
export function enter(target) {
|
|
16
|
+
const manager = context._getContextManager?.();
|
|
17
|
+
manager?.attach?.(target);
|
|
18
|
+
}
|
|
19
|
+
const WRAPPED = Symbol.for("tracepanel.queries");
|
|
20
|
+
/** Wraps the methods of an ORM class's prototype the app calls to start a query: each one takes the app's line. */
|
|
21
|
+
export function markQueries(proto, orm, root) {
|
|
22
|
+
if (!proto || proto[WRAPPED])
|
|
23
|
+
return;
|
|
24
|
+
Object.defineProperty(proto, WRAPPED, { value: true });
|
|
25
|
+
for (const name of Object.getOwnPropertyNames(proto)) {
|
|
26
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, name);
|
|
27
|
+
const original = descriptor?.value;
|
|
28
|
+
if (name === "constructor" || typeof original !== "function")
|
|
29
|
+
continue;
|
|
30
|
+
const wrapped = function (...args) {
|
|
31
|
+
if (trace.getActiveSpan()) {
|
|
32
|
+
try {
|
|
33
|
+
const { origin } = madeAt(root);
|
|
34
|
+
if (origin)
|
|
35
|
+
enter(context.active().setValue(QUERY_ORIGIN, { origin, orm }));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Never in the way of the app's query.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return original.apply(this, args);
|
|
42
|
+
};
|
|
43
|
+
Object.defineProperty(proto, name, { ...descriptor, value: wrapped });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Drizzle's classes the app calls to start a query, by the file each is in: a dialect's database (PgDatabase,
|
|
47
|
+
// MySqlDatabase, BaseSQLiteDatabase: db and tx) and its relational query builder (db.query.product.findMany()).
|
|
48
|
+
const DRIZZLE = /[\\/]drizzle-orm[\\/][\w-]+-core[\\/](db|query-builders[\\/]query)\.c?js$/;
|
|
49
|
+
const DATABASE = /^class (\w+Database) /m;
|
|
50
|
+
const HOOK = Symbol.for("tracepanel.queries.drizzle");
|
|
51
|
+
/**
|
|
52
|
+
* Drizzle's entry points on Bun. Its ES modules load without the hooks Node has (import-in-the-middle): a Bun
|
|
53
|
+
* plugin adds a line to each file as it loads, which hands its class over to be wrapped. A file that has changed and
|
|
54
|
+
* no longer has the class is left as it is.
|
|
55
|
+
*/
|
|
56
|
+
export function traceBunQueries(root) {
|
|
57
|
+
const bun = globalThis.Bun;
|
|
58
|
+
if (!bun?.plugin)
|
|
59
|
+
return;
|
|
60
|
+
globalThis[HOOK] = (proto) => markQueries(proto, "drizzle", root);
|
|
61
|
+
bun.plugin({
|
|
62
|
+
name: "tracepanel-queries",
|
|
63
|
+
setup(build) {
|
|
64
|
+
build.onLoad({ filter: DRIZZLE }, (args) => {
|
|
65
|
+
const source = readFileSync(args.path, "utf8");
|
|
66
|
+
const name = DRIZZLE.exec(args.path)?.[1] === "db" ? DATABASE.exec(source)?.[1] : "RelationalQueryBuilder";
|
|
67
|
+
const hook = name
|
|
68
|
+
? `\n;typeof ${name} === "function" && globalThis[Symbol.for("tracepanel.queries.drizzle")]?.(${name}.prototype);\n`
|
|
69
|
+
: "";
|
|
70
|
+
return { contents: source + hook, loader: "js" };
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BodyTap } from "./body.js";
|
|
2
|
+
import type { Runtime } from "./runtime.js";
|
|
3
|
+
/** On a request whose response withTracepanel() marks: a framework's middleware under it leaves the response be. */
|
|
4
|
+
export declare const MARKED: unique symbol;
|
|
5
|
+
/**
|
|
6
|
+
* The trace's headers on the response, and the widget in an HTML page: put into its body as it streams when its size
|
|
7
|
+
* isn't declared, with `ended` settled once that body has gone out.
|
|
8
|
+
*/
|
|
9
|
+
export declare function marked(tracepanel: Runtime, request: Request, response: Response, startedMs: number, framework: string, body?: BodyTap): Promise<{
|
|
10
|
+
response: Response;
|
|
11
|
+
ended?: Promise<void>;
|
|
12
|
+
}>;
|
package/dist/respond.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// A fetch handler's response (Bun.serve's, Hono's) as it goes out: the trace's headers on it, the widget's script in an
|
|
2
|
+
// HTML page, and what the request carried into its trace.
|
|
3
|
+
import { redirectCookie, requestAttrs, responseHeaders } from "./request.js";
|
|
4
|
+
import { exposedHeaders, inject, Stream, streamablePage } from "./widget.js";
|
|
5
|
+
/** On a request whose response withTracepanel() marks: a framework's middleware under it leaves the response be. */
|
|
6
|
+
export const MARKED = Symbol.for("tracepanel.marked");
|
|
7
|
+
/**
|
|
8
|
+
* The trace's headers on the response, and the widget in an HTML page: put into its body as it streams when its size
|
|
9
|
+
* isn't declared, with `ended` settled once that body has gone out.
|
|
10
|
+
*/
|
|
11
|
+
export async function marked(tracepanel, request, response, startedMs, framework, body) {
|
|
12
|
+
if (tracepanel.config.captureRequest) {
|
|
13
|
+
tracepanel.processor.setTraceAttrs({
|
|
14
|
+
...requestAttrs(Object.fromEntries(request.headers), new URL(request.url).search),
|
|
15
|
+
...body?.attrs(),
|
|
16
|
+
...responseHeaders(response.headers.entries()),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const html = (response.headers.get("content-type") ?? "").includes("text/html");
|
|
20
|
+
const page = html && !response.headers.has("content-encoding");
|
|
21
|
+
const marks = tracepanel.badge({
|
|
22
|
+
method: request.method,
|
|
23
|
+
status: response.status,
|
|
24
|
+
startedMs,
|
|
25
|
+
page,
|
|
26
|
+
framework: tracepanel.processor.framework() ?? framework,
|
|
27
|
+
});
|
|
28
|
+
if (!marks)
|
|
29
|
+
return { response };
|
|
30
|
+
const headers = new Headers(response.headers);
|
|
31
|
+
for (const [name, value] of Object.entries(marks.headers))
|
|
32
|
+
headers.set(name, value);
|
|
33
|
+
const redirect = redirectCookie(marks.headers["Tracepanel-Id"] ?? "", response.status, Object.fromEntries(request.headers));
|
|
34
|
+
if (redirect)
|
|
35
|
+
headers.append("Set-Cookie", redirect);
|
|
36
|
+
const expose = exposedHeaders(headers.get("access-control-allow-origin") ?? undefined, headers.get("access-control-expose-headers"));
|
|
37
|
+
if (expose)
|
|
38
|
+
headers.set("Access-Control-Expose-Headers", expose);
|
|
39
|
+
const init = { status: response.status, statusText: response.statusText, headers };
|
|
40
|
+
if (!marks.script || !response.body)
|
|
41
|
+
return { response: new Response(response.body, init) };
|
|
42
|
+
if (streamablePage((name) => headers.get(name))) {
|
|
43
|
+
let ended = () => { };
|
|
44
|
+
const done = new Promise((resolve) => (ended = resolve));
|
|
45
|
+
return { response: new Response(through(response.body, new Stream(marks.script), ended), init), ended: done };
|
|
46
|
+
}
|
|
47
|
+
headers.delete("content-length");
|
|
48
|
+
return { response: new Response(inject(await response.text(), marks.script), init) };
|
|
49
|
+
}
|
|
50
|
+
/** A body through the widget's script, piece by piece as the client reads it; `ended` once it is over. */
|
|
51
|
+
function through(body, script, ended) {
|
|
52
|
+
const reader = body.getReader();
|
|
53
|
+
return new ReadableStream({
|
|
54
|
+
async pull(controller) {
|
|
55
|
+
try {
|
|
56
|
+
// Until something goes out: a pull that enqueues nothing is not called again.
|
|
57
|
+
for (;;) {
|
|
58
|
+
const { done, value } = await reader.read();
|
|
59
|
+
if (done) {
|
|
60
|
+
const rest = script.end();
|
|
61
|
+
if (rest.length > 0)
|
|
62
|
+
controller.enqueue(rest);
|
|
63
|
+
controller.close();
|
|
64
|
+
ended();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const piece = script.feed(value);
|
|
68
|
+
if (piece.length > 0) {
|
|
69
|
+
controller.enqueue(piece);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
controller.error(error);
|
|
76
|
+
ended();
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
async cancel(reason) {
|
|
80
|
+
ended();
|
|
81
|
+
await reader.cancel(reason);
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=respond.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond.js","sourceRoot":"","sources":["../src/respond.ts"],"names":[],"mappings":"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"}
|