traceperf 0.2.0 → 1.3.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 +612 -209
- package/dist/__tests__/helpers/console.d.ts +9 -0
- package/dist/__tests__/helpers/console.js +25 -0
- package/dist/__tests__/helpers/console.js.map +1 -0
- package/dist/auto.d.ts +30 -0
- package/dist/auto.js +91 -0
- package/dist/auto.js.map +1 -0
- package/dist/browser.d.ts +52 -144
- package/dist/browser.js +112 -439
- package/dist/browser.js.map +1 -1
- package/dist/cli.d.ts +68 -0
- package/dist/cli.js +528 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/allocations.d.ts +38 -0
- package/dist/core/allocations.js +85 -0
- package/dist/core/allocations.js.map +1 -0
- package/dist/core/cpu-profile.d.ts +84 -0
- package/dist/core/cpu-profile.js +181 -0
- package/dist/core/cpu-profile.js.map +1 -0
- package/dist/core/env.d.ts +10 -0
- package/dist/core/env.js +40 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/event-loop.d.ts +30 -0
- package/dist/core/event-loop.js +43 -0
- package/dist/core/event-loop.js.map +1 -0
- package/dist/core/explain.d.ts +48 -0
- package/dist/core/explain.js +236 -0
- package/dist/core/explain.js.map +1 -0
- package/dist/core/exporters.d.ts +111 -0
- package/dist/core/exporters.js +236 -0
- package/dist/core/exporters.js.map +1 -0
- package/dist/core/index.d.ts +9 -3
- package/dist/core/index.js +9 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/optimized-performance-monitor.d.ts +180 -26
- package/dist/core/optimized-performance-monitor.js +687 -175
- package/dist/core/optimized-performance-monitor.js.map +1 -1
- package/dist/core/prometheus.d.ts +36 -0
- package/dist/core/prometheus.js +93 -0
- package/dist/core/prometheus.js.map +1 -0
- package/dist/core/records.d.ts +97 -0
- package/dist/core/records.js +87 -0
- package/dist/core/records.js.map +1 -0
- package/dist/core/stats.d.ts +45 -0
- package/dist/core/stats.js +136 -0
- package/dist/core/stats.js.map +1 -0
- package/dist/core/timeline.d.ts +28 -0
- package/dist/core/timeline.js +65 -0
- package/dist/core/timeline.js.map +1 -0
- package/dist/drivers.d.ts +51 -0
- package/dist/drivers.js +205 -0
- package/dist/drivers.js.map +1 -0
- package/dist/esm/auto.d.ts +30 -0
- package/dist/esm/auto.js +87 -0
- package/dist/esm/auto.js.map +1 -0
- package/dist/esm/browser.d.ts +52 -144
- package/dist/esm/browser.js +101 -445
- package/dist/esm/browser.js.map +1 -1
- package/dist/esm/cli.d.ts +68 -0
- package/dist/esm/cli.js +520 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/core/allocations.d.ts +38 -0
- package/dist/esm/core/allocations.js +82 -0
- package/dist/esm/core/allocations.js.map +1 -0
- package/dist/esm/core/cpu-profile.d.ts +84 -0
- package/dist/esm/core/cpu-profile.js +176 -0
- package/dist/esm/core/cpu-profile.js.map +1 -0
- package/dist/esm/core/env.d.ts +10 -0
- package/dist/esm/core/env.js +35 -0
- package/dist/esm/core/env.js.map +1 -0
- package/dist/esm/core/event-loop.d.ts +30 -0
- package/dist/esm/core/event-loop.js +40 -0
- package/dist/esm/core/event-loop.js.map +1 -0
- package/dist/esm/core/explain.d.ts +48 -0
- package/dist/esm/core/explain.js +232 -0
- package/dist/esm/core/explain.js.map +1 -0
- package/dist/esm/core/exporters.d.ts +111 -0
- package/dist/esm/core/exporters.js +229 -0
- package/dist/esm/core/exporters.js.map +1 -0
- package/dist/esm/core/index.d.ts +10 -4
- package/dist/esm/core/index.js +10 -4
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/core/optimized-performance-monitor.d.ts +180 -26
- package/dist/esm/core/optimized-performance-monitor.js +685 -173
- package/dist/esm/core/optimized-performance-monitor.js.map +1 -1
- package/dist/esm/core/prometheus.d.ts +36 -0
- package/dist/esm/core/prometheus.js +89 -0
- package/dist/esm/core/prometheus.js.map +1 -0
- package/dist/esm/core/records.d.ts +97 -0
- package/dist/esm/core/records.js +82 -0
- package/dist/esm/core/records.js.map +1 -0
- package/dist/esm/core/stats.d.ts +45 -0
- package/dist/esm/core/stats.js +131 -0
- package/dist/esm/core/stats.js.map +1 -0
- package/dist/esm/core/timeline.d.ts +28 -0
- package/dist/esm/core/timeline.js +62 -0
- package/dist/esm/core/timeline.js.map +1 -0
- package/dist/esm/drivers.d.ts +51 -0
- package/dist/esm/drivers.js +197 -0
- package/dist/esm/drivers.js.map +1 -0
- package/dist/esm/index.d.ts +13 -5
- package/dist/esm/index.js +21 -17
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instrument.d.ts +88 -0
- package/dist/esm/instrument.js +274 -0
- package/dist/esm/instrument.js.map +1 -0
- package/dist/esm/integrations.d.ts +70 -0
- package/dist/esm/integrations.js +197 -0
- package/dist/esm/integrations.js.map +1 -0
- package/dist/esm/node-builtins.d.ts +1 -0
- package/dist/esm/node-builtins.js +32 -0
- package/dist/esm/node-builtins.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/register.d.ts +20 -0
- package/dist/esm/register.js +98 -0
- package/dist/esm/register.js.map +1 -0
- package/dist/esm/report-html.d.ts +11 -0
- package/dist/esm/report-html.js +106 -0
- package/dist/esm/report-html.js.map +1 -0
- package/dist/esm/types/index.d.ts +4 -80
- package/dist/esm/types/index.js +1 -2
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/options.d.ts +72 -0
- package/dist/esm/types/options.js +2 -0
- package/dist/esm/types/options.js.map +1 -0
- package/dist/esm/watch.d.ts +17 -0
- package/dist/esm/watch.js +87 -0
- package/dist/esm/watch.js.map +1 -0
- package/dist/index.d.ts +10 -2
- package/dist/index.js +26 -29
- package/dist/index.js.map +1 -1
- package/dist/instrument.d.ts +88 -0
- package/dist/instrument.js +282 -0
- package/dist/instrument.js.map +1 -0
- package/dist/integrations.d.ts +70 -0
- package/dist/integrations.js +205 -0
- package/dist/integrations.js.map +1 -0
- package/dist/node-builtins.d.ts +1 -0
- package/dist/node-builtins.js +67 -0
- package/dist/node-builtins.js.map +1 -0
- package/dist/register.d.ts +20 -0
- package/dist/register.js +103 -0
- package/dist/register.js.map +1 -0
- package/dist/report-html.d.ts +11 -0
- package/dist/report-html.js +109 -0
- package/dist/report-html.js.map +1 -0
- package/dist/traceperf.browser.js +1910 -0
- package/dist/traceperf.browser.min.js +6 -0
- package/dist/types/index.d.ts +4 -80
- package/dist/types/index.js +1 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/options.d.ts +72 -0
- package/dist/types/{config.js → options.js} +1 -1
- package/dist/types/options.js.map +1 -0
- package/dist/watch.d.ts +17 -0
- package/dist/watch.js +90 -0
- package/dist/watch.js.map +1 -0
- package/package.json +99 -19
- package/dist/core/config.d.ts +0 -77
- package/dist/core/config.js +0 -116
- package/dist/core/config.js.map +0 -1
- package/dist/core/constants.d.ts +0 -78
- package/dist/core/constants.js +0 -109
- package/dist/core/constants.js.map +0 -1
- package/dist/core/logger.d.ts +0 -97
- package/dist/core/logger.js +0 -186
- package/dist/core/logger.js.map +0 -1
- package/dist/esm/core/config.d.ts +0 -77
- package/dist/esm/core/config.js +0 -112
- package/dist/esm/core/config.js.map +0 -1
- package/dist/esm/core/constants.d.ts +0 -78
- package/dist/esm/core/constants.js +0 -106
- package/dist/esm/core/constants.js.map +0 -1
- package/dist/esm/core/logger.d.ts +0 -97
- package/dist/esm/core/logger.js +0 -182
- package/dist/esm/core/logger.js.map +0 -1
- package/dist/esm/formatters/ascii.d.ts +0 -52
- package/dist/esm/formatters/ascii.js +0 -100
- package/dist/esm/formatters/ascii.js.map +0 -1
- package/dist/esm/formatters/cli.d.ts +0 -50
- package/dist/esm/formatters/cli.js +0 -96
- package/dist/esm/formatters/cli.js.map +0 -1
- package/dist/esm/formatters/index.d.ts +0 -3
- package/dist/esm/formatters/index.js +0 -4
- package/dist/esm/formatters/index.js.map +0 -1
- package/dist/esm/formatters/json.d.ts +0 -45
- package/dist/esm/formatters/json.js +0 -85
- package/dist/esm/formatters/json.js.map +0 -1
- package/dist/esm/trackers/execution.d.ts +0 -101
- package/dist/esm/trackers/execution.js +0 -226
- package/dist/esm/trackers/execution.js.map +0 -1
- package/dist/esm/trackers/index.d.ts +0 -2
- package/dist/esm/trackers/index.js +0 -3
- package/dist/esm/trackers/index.js.map +0 -1
- package/dist/esm/trackers/performance.d.ts +0 -68
- package/dist/esm/trackers/performance.js +0 -112
- package/dist/esm/trackers/performance.js.map +0 -1
- package/dist/esm/types/config.d.ts +0 -142
- package/dist/esm/types/config.js +0 -2
- package/dist/esm/types/config.js.map +0 -1
- package/dist/esm/types/logger.d.ts +0 -147
- package/dist/esm/types/logger.js +0 -2
- package/dist/esm/types/logger.js.map +0 -1
- package/dist/esm/utils/colors.d.ts +0 -87
- package/dist/esm/utils/colors.js +0 -146
- package/dist/esm/utils/colors.js.map +0 -1
- package/dist/esm/utils/index.d.ts +0 -3
- package/dist/esm/utils/index.js +0 -4
- package/dist/esm/utils/index.js.map +0 -1
- package/dist/esm/utils/proxy-tracker.d.ts +0 -68
- package/dist/esm/utils/proxy-tracker.js +0 -127
- package/dist/esm/utils/proxy-tracker.js.map +0 -1
- package/dist/esm/utils/stack.d.ts +0 -63
- package/dist/esm/utils/stack.js +0 -110
- package/dist/esm/utils/stack.js.map +0 -1
- package/dist/esm/utils/string.d.ts +0 -29
- package/dist/esm/utils/string.js +0 -45
- package/dist/esm/utils/string.js.map +0 -1
- package/dist/esm/utils/timing.d.ts +0 -65
- package/dist/esm/utils/timing.js +0 -99
- package/dist/esm/utils/timing.js.map +0 -1
- package/dist/formatters/ascii.d.ts +0 -52
- package/dist/formatters/ascii.js +0 -104
- package/dist/formatters/ascii.js.map +0 -1
- package/dist/formatters/cli.d.ts +0 -50
- package/dist/formatters/cli.js +0 -100
- package/dist/formatters/cli.js.map +0 -1
- package/dist/formatters/index.d.ts +0 -3
- package/dist/formatters/index.js +0 -20
- package/dist/formatters/index.js.map +0 -1
- package/dist/formatters/json.d.ts +0 -45
- package/dist/formatters/json.js +0 -89
- package/dist/formatters/json.js.map +0 -1
- package/dist/trackers/execution.d.ts +0 -101
- package/dist/trackers/execution.js +0 -230
- package/dist/trackers/execution.js.map +0 -1
- package/dist/trackers/index.d.ts +0 -2
- package/dist/trackers/index.js +0 -19
- package/dist/trackers/index.js.map +0 -1
- package/dist/trackers/performance.d.ts +0 -68
- package/dist/trackers/performance.js +0 -116
- package/dist/trackers/performance.js.map +0 -1
- package/dist/types/config.d.ts +0 -142
- package/dist/types/config.js.map +0 -1
- package/dist/types/logger.d.ts +0 -147
- package/dist/types/logger.js +0 -3
- package/dist/types/logger.js.map +0 -1
- package/dist/types.d.ts +0 -65
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/dist/utils/colors.d.ts +0 -87
- package/dist/utils/colors.js +0 -160
- package/dist/utils/colors.js.map +0 -1
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.js +0 -20
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/proxy-tracker.d.ts +0 -68
- package/dist/utils/proxy-tracker.js +0 -131
- package/dist/utils/proxy-tracker.js.map +0 -1
- package/dist/utils/stack.d.ts +0 -63
- package/dist/utils/stack.js +0 -116
- package/dist/utils/stack.js.map +0 -1
- package/dist/utils/string.d.ts +0 -29
- package/dist/utils/string.js +0 -50
- package/dist/utils/string.js.map +0 -1
- package/dist/utils/timing.d.ts +0 -65
- package/dist/utils/timing.js +0 -106
- package/dist/utils/timing.js.map +0 -1
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { loadNodeBuiltin } from './core/env.js';
|
|
2
|
+
const PATCHED = Symbol.for('traceperf.instrumented');
|
|
3
|
+
function describeUrl(input) {
|
|
4
|
+
try {
|
|
5
|
+
if (typeof input === 'string' || input instanceof URL) {
|
|
6
|
+
const url = new URL(String(input), 'http://localhost');
|
|
7
|
+
return { host: url.host, path: url.pathname };
|
|
8
|
+
}
|
|
9
|
+
if (input && typeof input.url === 'string') {
|
|
10
|
+
const url = new URL(input.url, 'http://localhost');
|
|
11
|
+
return { method: input.method, host: url.host, path: url.pathname };
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch (_a) {
|
|
15
|
+
// fall through
|
|
16
|
+
}
|
|
17
|
+
return { host: 'unknown', path: '' };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Track every `fetch()` call: label "fetch GET api.example.com/users".
|
|
21
|
+
* Timing covers the request until the response headers arrive (reading the
|
|
22
|
+
* body is not included). Responses with status >= 500 are marked failed.
|
|
23
|
+
*/
|
|
24
|
+
export function instrumentFetch(tp, options = {}) {
|
|
25
|
+
const g = typeof globalThis !== 'undefined' ? globalThis : undefined;
|
|
26
|
+
if (!g || typeof g.fetch !== 'function')
|
|
27
|
+
return () => undefined;
|
|
28
|
+
if (g.fetch[PATCHED])
|
|
29
|
+
return () => undefined;
|
|
30
|
+
const { errorStatus = 500, ...trackOptions } = options;
|
|
31
|
+
const original = g.fetch;
|
|
32
|
+
const patched = function fetch(input, init) {
|
|
33
|
+
const { method: inputMethod, host, path } = describeUrl(input);
|
|
34
|
+
const method = (init && init.method) || inputMethod || 'GET';
|
|
35
|
+
const span = tp.start(`fetch ${method.toUpperCase()} ${host}${path}`, trackOptions);
|
|
36
|
+
let promise;
|
|
37
|
+
try {
|
|
38
|
+
promise = span.run(() => original.call(this, input, init));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
span.end(error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
return Promise.resolve(promise).then(response => {
|
|
45
|
+
span.end(response && response.status >= errorStatus ? new Error(`HTTP ${response.status}`) : undefined);
|
|
46
|
+
return response;
|
|
47
|
+
}, error => {
|
|
48
|
+
span.end(error);
|
|
49
|
+
throw error;
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
patched[PATCHED] = original;
|
|
53
|
+
g.fetch = patched;
|
|
54
|
+
return () => {
|
|
55
|
+
if (g.fetch === patched)
|
|
56
|
+
g.fetch = original;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Track outgoing Node.js http/https requests (`request` and `get`), which
|
|
61
|
+
* covers clients built on them such as axios and got. Label:
|
|
62
|
+
* "http GET api.example.com/users". Timing covers the full response
|
|
63
|
+
* (until the body has been read). Node.js only.
|
|
64
|
+
*/
|
|
65
|
+
export function instrumentHttp(tp, options = {}) {
|
|
66
|
+
const { errorStatus = 500, ...trackOptions } = options;
|
|
67
|
+
const restores = [];
|
|
68
|
+
for (const moduleName of ['http', 'https']) {
|
|
69
|
+
const mod = loadNodeBuiltin(moduleName);
|
|
70
|
+
if (!mod)
|
|
71
|
+
continue;
|
|
72
|
+
for (const fnName of ['request', 'get']) {
|
|
73
|
+
const original = mod[fnName];
|
|
74
|
+
if (typeof original !== 'function' || original[PATCHED])
|
|
75
|
+
continue;
|
|
76
|
+
const patched = function (...args) {
|
|
77
|
+
const span = tp.start(`${moduleName} request`, trackOptions);
|
|
78
|
+
let req;
|
|
79
|
+
try {
|
|
80
|
+
req = span.run(() => original.apply(this, args));
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
span.end(error);
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
// The Host header includes a non-default port; req.host does not
|
|
87
|
+
const host = (typeof req.getHeader === 'function' && req.getHeader('host')) || req.host || 'unknown';
|
|
88
|
+
span.setLabel(`${moduleName} ${req.method || 'GET'} ${host}${String(req.path || '').split('?')[0]}`);
|
|
89
|
+
let ended = false;
|
|
90
|
+
let statusError;
|
|
91
|
+
// Whichever of res 'end' / res 'close' / req 'close' comes first ends
|
|
92
|
+
// the span (their order differs between Node versions)
|
|
93
|
+
const end = (error = statusError) => {
|
|
94
|
+
if (ended)
|
|
95
|
+
return;
|
|
96
|
+
ended = true;
|
|
97
|
+
span.end(error);
|
|
98
|
+
};
|
|
99
|
+
req.once('response', (res) => {
|
|
100
|
+
statusError = res.statusCode >= errorStatus ? new Error(`HTTP ${res.statusCode}`) : undefined;
|
|
101
|
+
res.once('end', () => end());
|
|
102
|
+
res.once('close', () => end());
|
|
103
|
+
});
|
|
104
|
+
req.once('error', (error) => end(error));
|
|
105
|
+
req.once('close', () => end());
|
|
106
|
+
return req;
|
|
107
|
+
};
|
|
108
|
+
patched[PATCHED] = original;
|
|
109
|
+
mod[fnName] = patched;
|
|
110
|
+
restores.push(() => {
|
|
111
|
+
if (mod[fnName] === patched)
|
|
112
|
+
mod[fnName] = original;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return () => restores.forEach(restore => restore());
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Patch methods of an object or prototype in place, e.g. a database client:
|
|
120
|
+
*
|
|
121
|
+
* instrumentMethods(tp, pg.Client.prototype, ['query'], {
|
|
122
|
+
* labelFor: (_m, [q]) => `pg ${String(q?.text ?? q).trim().split(/\s+/)[0]}`,
|
|
123
|
+
* });
|
|
124
|
+
*
|
|
125
|
+
* `methods` defaults to every own function property except the constructor.
|
|
126
|
+
*/
|
|
127
|
+
export function instrumentMethods(tp, target, methods, options = {}) {
|
|
128
|
+
const { prefix, labelFor, ...trackOptions } = options;
|
|
129
|
+
const ctor = target.constructor;
|
|
130
|
+
const ownerName = typeof target === 'function' ? target.name
|
|
131
|
+
: ctor && ctor.prototype === target ? ctor.name
|
|
132
|
+
: ctor && ctor !== Object ? ctor.name : '';
|
|
133
|
+
const labelPrefix = prefix !== null && prefix !== void 0 ? prefix : (ownerName ? `${ownerName}.` : '');
|
|
134
|
+
const names = methods !== null && methods !== void 0 ? methods : Object.getOwnPropertyNames(target).filter(name => {
|
|
135
|
+
if (name === 'constructor')
|
|
136
|
+
return false;
|
|
137
|
+
const descriptor = Object.getOwnPropertyDescriptor(target, name);
|
|
138
|
+
return !!descriptor && typeof descriptor.value === 'function';
|
|
139
|
+
});
|
|
140
|
+
const restores = [];
|
|
141
|
+
for (const name of names) {
|
|
142
|
+
const original = target[name];
|
|
143
|
+
if (typeof original !== 'function' || original[PATCHED])
|
|
144
|
+
continue;
|
|
145
|
+
const patched = function (...args) {
|
|
146
|
+
const label = labelFor ? labelFor(name, args) : `${labelPrefix}${name}`;
|
|
147
|
+
return tp.track(() => original.apply(this, args), { ...trackOptions, label });
|
|
148
|
+
};
|
|
149
|
+
Object.defineProperty(patched, 'name', { value: original.name, configurable: true });
|
|
150
|
+
Object.defineProperty(patched, 'length', { value: original.length, configurable: true });
|
|
151
|
+
patched[PATCHED] = original;
|
|
152
|
+
const hadOwn = Object.prototype.hasOwnProperty.call(target, name);
|
|
153
|
+
target[name] = patched;
|
|
154
|
+
restores.push(() => {
|
|
155
|
+
if (target[name] !== patched)
|
|
156
|
+
return;
|
|
157
|
+
if (hadOwn)
|
|
158
|
+
target[name] = original;
|
|
159
|
+
else
|
|
160
|
+
delete target[name];
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return () => restores.forEach(restore => restore());
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Prisma client extension: every model operation becomes a tracked call
|
|
167
|
+
* labelled "prisma.User.findMany".
|
|
168
|
+
*
|
|
169
|
+
* const prisma = new PrismaClient().$extends(prismaExtension(tp));
|
|
170
|
+
*/
|
|
171
|
+
export function prismaExtension(tp, options = {}) {
|
|
172
|
+
return {
|
|
173
|
+
name: 'traceperf',
|
|
174
|
+
query: {
|
|
175
|
+
$allModels: {
|
|
176
|
+
$allOperations(params) {
|
|
177
|
+
var _a, _b;
|
|
178
|
+
const label = (_a = options.label) !== null && _a !== void 0 ? _a : `prisma.${(_b = params.model) !== null && _b !== void 0 ? _b : 'raw'}.${params.operation}`;
|
|
179
|
+
return tp.track(() => params.query(params.args), { ...options, label });
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Collapse ids in a URL path so labels stay few: /users/42/orders/9f1c... ->
|
|
187
|
+
* /users/:id/orders/:id. Numbers, UUIDs, long hex and long mixed tokens count as ids.
|
|
188
|
+
*/
|
|
189
|
+
export function normalizePath(url) {
|
|
190
|
+
let path = String(url || '/');
|
|
191
|
+
const q = path.search(/[?#]/);
|
|
192
|
+
if (q !== -1)
|
|
193
|
+
path = path.slice(0, q);
|
|
194
|
+
if (!path)
|
|
195
|
+
return '/';
|
|
196
|
+
// Fast path: ids always contain a digit
|
|
197
|
+
if (!/\d/.test(path))
|
|
198
|
+
return path;
|
|
199
|
+
const segments = path.split('/');
|
|
200
|
+
for (let i = 0; i < segments.length; i++) {
|
|
201
|
+
const seg = segments[i];
|
|
202
|
+
if (seg && /\d/.test(seg) && isIdSegment(seg))
|
|
203
|
+
segments[i] = ':id';
|
|
204
|
+
}
|
|
205
|
+
return segments.join('/');
|
|
206
|
+
}
|
|
207
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
208
|
+
function isIdSegment(seg) {
|
|
209
|
+
if (/^\d+$/.test(seg))
|
|
210
|
+
return true;
|
|
211
|
+
if (seg.length === 36 && UUID.test(seg))
|
|
212
|
+
return true;
|
|
213
|
+
if (seg.length >= 16 && /^[0-9a-f]+$/i.test(seg))
|
|
214
|
+
return true;
|
|
215
|
+
return seg.length >= 20 && /^[A-Za-z0-9_-]+$/.test(seg);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Track every incoming request of every Node http/https server as a
|
|
219
|
+
* top-level call, so work done while handling it (queries, fetches, tracked
|
|
220
|
+
* functions) nests under it, with no framework middleware. Responses with
|
|
221
|
+
* status >= 500 and connections closed before a response count as failed.
|
|
222
|
+
*/
|
|
223
|
+
export function instrumentHttpServer(tp, options = {}) {
|
|
224
|
+
const { errorStatus = 500, labelFor, ignore, ...trackOptions } = options;
|
|
225
|
+
const restores = [];
|
|
226
|
+
for (const moduleName of ['http', 'https']) {
|
|
227
|
+
const mod = loadNodeBuiltin(moduleName);
|
|
228
|
+
const proto = mod && mod.Server && mod.Server.prototype;
|
|
229
|
+
if (!proto)
|
|
230
|
+
continue;
|
|
231
|
+
const original = proto.emit;
|
|
232
|
+
if (typeof original !== 'function' || original[PATCHED])
|
|
233
|
+
continue;
|
|
234
|
+
const hadOwn = Object.prototype.hasOwnProperty.call(proto, 'emit');
|
|
235
|
+
const patched = function (event, req, res, ...rest) {
|
|
236
|
+
if (event !== 'request' || !req || !res || typeof res.once !== 'function' || (ignore && ignore(req))) {
|
|
237
|
+
return original.call(this, event, req, res, ...rest);
|
|
238
|
+
}
|
|
239
|
+
const label = labelFor ? labelFor(req) : `${req.method || 'GET'} ${normalizePath(req.url)}`;
|
|
240
|
+
const span = tp.start(label, trackOptions);
|
|
241
|
+
// Disabled or sampled out: nothing to finish
|
|
242
|
+
if (!span.id)
|
|
243
|
+
return original.call(this, event, req, res, ...rest);
|
|
244
|
+
let ended = false;
|
|
245
|
+
const end = (error) => {
|
|
246
|
+
if (ended)
|
|
247
|
+
return;
|
|
248
|
+
ended = true;
|
|
249
|
+
span.end(error);
|
|
250
|
+
};
|
|
251
|
+
res.once('finish', () => end(res.statusCode >= errorStatus ? new Error(`HTTP ${res.statusCode}`) : undefined));
|
|
252
|
+
res.once('close', () => end(res.writableFinished ? undefined : new Error('connection closed before the response was sent')));
|
|
253
|
+
try {
|
|
254
|
+
return span.run(() => original.call(this, event, req, res, ...rest));
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
end(error);
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
patched[PATCHED] = original;
|
|
262
|
+
proto.emit = patched;
|
|
263
|
+
restores.push(() => {
|
|
264
|
+
if (proto.emit !== patched)
|
|
265
|
+
return;
|
|
266
|
+
if (hadOwn)
|
|
267
|
+
proto.emit = original;
|
|
268
|
+
else
|
|
269
|
+
delete proto.emit;
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
return () => restores.forEach(restore => restore());
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=instrument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../src/instrument.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework integrations: one top-level execution per HTTP request, with
|
|
3
|
+
* tracked calls made while handling the request nested under it.
|
|
4
|
+
*
|
|
5
|
+
* Every helper takes the traceperf instance to record into, so they work
|
|
6
|
+
* with the default instance and with createTracePerf() instances alike.
|
|
7
|
+
*/
|
|
8
|
+
import type { OptimizedPerformanceMonitor } from './core/optimized-performance-monitor.js';
|
|
9
|
+
import type { TrackOptions } from './types/options.js';
|
|
10
|
+
/** What a label function gets to work with */
|
|
11
|
+
export interface RequestInfo {
|
|
12
|
+
method: string;
|
|
13
|
+
/** Route pattern when the framework knows it, e.g. "/users/:id" */
|
|
14
|
+
route?: string;
|
|
15
|
+
/** Path without the query string */
|
|
16
|
+
path: string;
|
|
17
|
+
}
|
|
18
|
+
export interface HttpTracingOptions extends Omit<TrackOptions, 'label'> {
|
|
19
|
+
/** Build the label; default "METHOD /route/pattern" (falls back to the path) */
|
|
20
|
+
label?: (request: RequestInfo) => string;
|
|
21
|
+
/** Treat responses with status >= this as failed (default 500) */
|
|
22
|
+
errorStatus?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Express / Connect middleware. Register it before your routes:
|
|
26
|
+
*
|
|
27
|
+
* app.use(expressMiddleware(tp));
|
|
28
|
+
*/
|
|
29
|
+
export declare function expressMiddleware(tp: OptimizedPerformanceMonitor, options?: HttpTracingOptions): (req: any, res: any, next: (err?: unknown) => void) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Fastify plugin (applies to every route, no fastify-plugin needed):
|
|
32
|
+
*
|
|
33
|
+
* await app.register(fastifyPlugin(tp));
|
|
34
|
+
*/
|
|
35
|
+
export declare function fastifyPlugin(tp: OptimizedPerformanceMonitor, options?: HttpTracingOptions): (fastify: any, _opts: unknown, done: () => void) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Hono middleware:
|
|
38
|
+
*
|
|
39
|
+
* app.use('*', honoMiddleware(tp));
|
|
40
|
+
*/
|
|
41
|
+
export declare function honoMiddleware(tp: OptimizedPerformanceMonitor, options?: HttpTracingOptions): (c: any, next: () => Promise<void>) => Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Wrap any request handler, e.g. a Next.js route handler:
|
|
44
|
+
*
|
|
45
|
+
* export const GET = withTracing(tp, async (request) => { ... });
|
|
46
|
+
*
|
|
47
|
+
* When the first argument looks like a Request, the label defaults to
|
|
48
|
+
* "METHOD /path"; otherwise the function name.
|
|
49
|
+
*/
|
|
50
|
+
export declare function withTracing<T extends (...args: any[]) => any>(tp: OptimizedPerformanceMonitor, handler: T, options?: Omit<HttpTracingOptions, 'errorStatus'>): (...args: Parameters<T>) => ReturnType<T>;
|
|
51
|
+
/**
|
|
52
|
+
* Koa middleware. Register it first:
|
|
53
|
+
*
|
|
54
|
+
* app.use(koaMiddleware(tp));
|
|
55
|
+
*
|
|
56
|
+
* Labels use the matched route when @koa/router sets ctx._matchedRoute.
|
|
57
|
+
*/
|
|
58
|
+
export declare function koaMiddleware(tp: OptimizedPerformanceMonitor, options?: HttpTracingOptions): (ctx: any, next: () => Promise<unknown>) => Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* NestJS interceptor (works without importing Nest or rxjs into traceperf):
|
|
61
|
+
*
|
|
62
|
+
* app.useGlobalInterceptors(nestInterceptor(tp));
|
|
63
|
+
*
|
|
64
|
+
* Label: "GET /users/:id" for HTTP, otherwise "Controller.handler".
|
|
65
|
+
*/
|
|
66
|
+
export declare function nestInterceptor(tp: OptimizedPerformanceMonitor, options?: HttpTracingOptions): {
|
|
67
|
+
intercept(context: any, next: {
|
|
68
|
+
handle(): any;
|
|
69
|
+
}): any;
|
|
70
|
+
};
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
const stripQuery = (url) => {
|
|
2
|
+
if (!url)
|
|
3
|
+
return '/';
|
|
4
|
+
const q = url.indexOf('?');
|
|
5
|
+
return q === -1 ? url : url.slice(0, q);
|
|
6
|
+
};
|
|
7
|
+
const defaultLabel = (r) => `${r.method} ${r.route || r.path}`;
|
|
8
|
+
const statusError = (status, errorStatus) => status !== undefined && status >= errorStatus ? new Error(`HTTP ${status}`) : undefined;
|
|
9
|
+
function splitOptions(options) {
|
|
10
|
+
const { label = defaultLabel, errorStatus = 500, ...trackOptions } = options;
|
|
11
|
+
return { label, errorStatus, trackOptions };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Express / Connect middleware. Register it before your routes:
|
|
15
|
+
*
|
|
16
|
+
* app.use(expressMiddleware(tp));
|
|
17
|
+
*/
|
|
18
|
+
export function expressMiddleware(tp, options = {}) {
|
|
19
|
+
const { label, errorStatus, trackOptions } = splitOptions(options);
|
|
20
|
+
return function traceperfExpress(req, res, next) {
|
|
21
|
+
const path = stripQuery(req.originalUrl || req.url);
|
|
22
|
+
const span = tp.start(label({ method: req.method, path }), trackOptions);
|
|
23
|
+
let finished = false;
|
|
24
|
+
const finish = () => {
|
|
25
|
+
if (finished)
|
|
26
|
+
return;
|
|
27
|
+
finished = true;
|
|
28
|
+
const route = req.route && req.route.path ? `${req.baseUrl || ''}${req.route.path}` : undefined;
|
|
29
|
+
span.setLabel(label({ method: req.method, route, path }));
|
|
30
|
+
span.end(statusError(res.statusCode, errorStatus));
|
|
31
|
+
};
|
|
32
|
+
res.once('finish', finish);
|
|
33
|
+
res.once('close', finish);
|
|
34
|
+
span.run(() => next());
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Fastify plugin (applies to every route, no fastify-plugin needed):
|
|
39
|
+
*
|
|
40
|
+
* await app.register(fastifyPlugin(tp));
|
|
41
|
+
*/
|
|
42
|
+
export function fastifyPlugin(tp, options = {}) {
|
|
43
|
+
const { label, errorStatus, trackOptions } = splitOptions(options);
|
|
44
|
+
const spanKey = Symbol('traceperf.span');
|
|
45
|
+
const plugin = function traceperfFastify(fastify, _opts, done) {
|
|
46
|
+
fastify.addHook('onRequest', (request, _reply, hookDone) => {
|
|
47
|
+
const span = tp.start(label({ method: request.method, path: stripQuery(request.url) }), trackOptions);
|
|
48
|
+
request[spanKey] = span;
|
|
49
|
+
span.run(() => hookDone());
|
|
50
|
+
});
|
|
51
|
+
fastify.addHook('onResponse', (request, reply, hookDone) => {
|
|
52
|
+
const span = request[spanKey];
|
|
53
|
+
if (span) {
|
|
54
|
+
const route = (request.routeOptions && request.routeOptions.url) || request.routerPath;
|
|
55
|
+
span.setLabel(label({ method: request.method, route, path: stripQuery(request.url) }));
|
|
56
|
+
span.end(statusError(reply.statusCode, errorStatus));
|
|
57
|
+
}
|
|
58
|
+
hookDone();
|
|
59
|
+
});
|
|
60
|
+
done();
|
|
61
|
+
};
|
|
62
|
+
// Same effect as wrapping with fastify-plugin: hooks apply to the whole app
|
|
63
|
+
plugin[Symbol.for('skip-override')] = true;
|
|
64
|
+
plugin[Symbol.for('fastify.display-name')] = 'traceperf';
|
|
65
|
+
return plugin;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Hono middleware:
|
|
69
|
+
*
|
|
70
|
+
* app.use('*', honoMiddleware(tp));
|
|
71
|
+
*/
|
|
72
|
+
export function honoMiddleware(tp, options = {}) {
|
|
73
|
+
const { label, errorStatus, trackOptions } = splitOptions(options);
|
|
74
|
+
return async function traceperfHono(c, next) {
|
|
75
|
+
var _a;
|
|
76
|
+
const path = c.req.path;
|
|
77
|
+
const span = tp.start(label({ method: c.req.method, path }), trackOptions);
|
|
78
|
+
let thrown;
|
|
79
|
+
try {
|
|
80
|
+
await span.run(() => next());
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
thrown = error;
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
const route = typeof c.req.routePath === 'string' && c.req.routePath !== '/*' && c.req.routePath !== '*'
|
|
88
|
+
? c.req.routePath : undefined;
|
|
89
|
+
span.setLabel(label({ method: c.req.method, route, path }));
|
|
90
|
+
span.end((_a = thrown !== null && thrown !== void 0 ? thrown : c.error) !== null && _a !== void 0 ? _a : statusError(c.res && c.res.status, errorStatus));
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Wrap any request handler, e.g. a Next.js route handler:
|
|
96
|
+
*
|
|
97
|
+
* export const GET = withTracing(tp, async (request) => { ... });
|
|
98
|
+
*
|
|
99
|
+
* When the first argument looks like a Request, the label defaults to
|
|
100
|
+
* "METHOD /path"; otherwise the function name.
|
|
101
|
+
*/
|
|
102
|
+
export function withTracing(tp, handler, options = {}) {
|
|
103
|
+
const { label, trackOptions } = splitOptions(options);
|
|
104
|
+
const wrapped = function (...args) {
|
|
105
|
+
const request = args[0];
|
|
106
|
+
let name = handler.name || 'handler';
|
|
107
|
+
if (request && typeof request.method === 'string' && typeof request.url === 'string') {
|
|
108
|
+
let path = stripQuery(request.url);
|
|
109
|
+
try {
|
|
110
|
+
path = new URL(request.url, 'http://localhost').pathname;
|
|
111
|
+
}
|
|
112
|
+
catch (_a) {
|
|
113
|
+
// keep the raw path
|
|
114
|
+
}
|
|
115
|
+
name = label({ method: request.method, path });
|
|
116
|
+
}
|
|
117
|
+
return tp.track(() => handler.apply(this, args), { ...trackOptions, label: name });
|
|
118
|
+
};
|
|
119
|
+
Object.defineProperty(wrapped, 'name', { value: handler.name, configurable: true });
|
|
120
|
+
Object.defineProperty(wrapped, 'length', { value: handler.length, configurable: true });
|
|
121
|
+
return wrapped;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Koa middleware. Register it first:
|
|
125
|
+
*
|
|
126
|
+
* app.use(koaMiddleware(tp));
|
|
127
|
+
*
|
|
128
|
+
* Labels use the matched route when @koa/router sets ctx._matchedRoute.
|
|
129
|
+
*/
|
|
130
|
+
export function koaMiddleware(tp, options = {}) {
|
|
131
|
+
const { label, errorStatus, trackOptions } = splitOptions(options);
|
|
132
|
+
return async function traceperfKoa(ctx, next) {
|
|
133
|
+
const path = stripQuery(ctx.path || ctx.url);
|
|
134
|
+
const span = tp.start(label({ method: ctx.method, path }), trackOptions);
|
|
135
|
+
let thrown;
|
|
136
|
+
try {
|
|
137
|
+
await span.run(() => next());
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
thrown = error;
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
const route = typeof ctx._matchedRoute === 'string' ? ctx._matchedRoute : undefined;
|
|
145
|
+
span.setLabel(label({ method: ctx.method, route, path }));
|
|
146
|
+
const status = thrown ? (thrown.status || thrown.statusCode || 500) : ctx.status;
|
|
147
|
+
span.end(thrown && status >= errorStatus ? thrown : statusError(status, errorStatus));
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* NestJS interceptor (works without importing Nest or rxjs into traceperf):
|
|
153
|
+
*
|
|
154
|
+
* app.useGlobalInterceptors(nestInterceptor(tp));
|
|
155
|
+
*
|
|
156
|
+
* Label: "GET /users/:id" for HTTP, otherwise "Controller.handler".
|
|
157
|
+
*/
|
|
158
|
+
export function nestInterceptor(tp, options = {}) {
|
|
159
|
+
const { label, errorStatus, trackOptions } = splitOptions(options);
|
|
160
|
+
return {
|
|
161
|
+
intercept(context, next) {
|
|
162
|
+
var _a, _b, _c, _d;
|
|
163
|
+
const type = typeof context.getType === 'function' ? context.getType() : 'http';
|
|
164
|
+
const request = type === 'http' ? context.switchToHttp().getRequest() : undefined;
|
|
165
|
+
const response = type === 'http' ? context.switchToHttp().getResponse() : undefined;
|
|
166
|
+
const handlerName = `${(_b = (_a = context.getClass) === null || _a === void 0 ? void 0 : _a.call(context).name) !== null && _b !== void 0 ? _b : 'Controller'}.${(_d = (_c = context.getHandler) === null || _c === void 0 ? void 0 : _c.call(context).name) !== null && _d !== void 0 ? _d : 'handler'}`;
|
|
167
|
+
const route = request && request.route && request.route.path
|
|
168
|
+
? `${request.baseUrl || ''}${request.route.path}` : request && request.routeOptions && request.routeOptions.url;
|
|
169
|
+
const name = request
|
|
170
|
+
? label({ method: request.method, route, path: stripQuery(request.originalUrl || request.url) })
|
|
171
|
+
: handlerName;
|
|
172
|
+
const span = tp.start(name, trackOptions);
|
|
173
|
+
const source = span.run(() => next.handle());
|
|
174
|
+
const Observable = source.constructor;
|
|
175
|
+
return new Observable((subscriber) => {
|
|
176
|
+
const subscription = span.run(() => source.subscribe({
|
|
177
|
+
next: (value) => subscriber.next(value),
|
|
178
|
+
error: (error) => {
|
|
179
|
+
span.end(error);
|
|
180
|
+
subscriber.error(error);
|
|
181
|
+
},
|
|
182
|
+
complete: () => {
|
|
183
|
+
var _a;
|
|
184
|
+
const status = response && ((_a = response.statusCode) !== null && _a !== void 0 ? _a : (typeof response.status === 'number' ? response.status : undefined));
|
|
185
|
+
span.end(statusError(status, errorStatus));
|
|
186
|
+
subscriber.complete();
|
|
187
|
+
},
|
|
188
|
+
}));
|
|
189
|
+
return () => {
|
|
190
|
+
subscription.unsubscribe();
|
|
191
|
+
span.end();
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/integrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static imports of the Node built-ins traceperf uses, for Node-only entry
|
|
3
|
+
* points. Imported first by register.ts so that, in the ESM build on Node
|
|
4
|
+
* versions without process.getBuiltinModule, they are available before the
|
|
5
|
+
* default instance is created (AsyncLocalStorage for nesting across await,
|
|
6
|
+
* http/https for request tracking).
|
|
7
|
+
*/
|
|
8
|
+
import * as asyncHooks from 'async_hooks';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as http from 'http';
|
|
11
|
+
import * as https from 'https';
|
|
12
|
+
import * as inspector from 'inspector';
|
|
13
|
+
import * as moduleApi from 'module';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import * as perfHooks from 'perf_hooks';
|
|
16
|
+
import * as v8 from 'v8';
|
|
17
|
+
import { provideNodeBuiltins } from './core/env.js';
|
|
18
|
+
// `import * as` gives a namespace object in ESM; patching must hit the real
|
|
19
|
+
// module objects, which are the namespaces' default export in ESM.
|
|
20
|
+
const real = (ns) => (ns && ns.default && typeof ns.default === 'object' ? ns.default : ns);
|
|
21
|
+
provideNodeBuiltins({
|
|
22
|
+
async_hooks: real(asyncHooks),
|
|
23
|
+
fs: real(fs),
|
|
24
|
+
http: real(http),
|
|
25
|
+
https: real(https),
|
|
26
|
+
inspector: real(inspector),
|
|
27
|
+
module: real(moduleApi),
|
|
28
|
+
path: real(path),
|
|
29
|
+
perf_hooks: real(perfHooks),
|
|
30
|
+
v8: real(v8),
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=node-builtins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-builtins.js","sourceRoot":"","sources":["../../src/node-builtins.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,SAAS,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,4EAA4E;AAC5E,mEAAmE;AACnE,MAAM,IAAI,GAAG,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEjG,mBAAmB,CAAC;IAClB,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;IAC7B,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;IAC3B,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;CACb,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `traceperf/auto`: instrument an app without changing its code.
|
|
3
|
+
*
|
|
4
|
+
* node --require traceperf/auto server.js
|
|
5
|
+
* node --import traceperf/auto server.mjs
|
|
6
|
+
* NODE_OPTIONS="--require traceperf/auto" npm start
|
|
7
|
+
*
|
|
8
|
+
* Environment variables (all optional):
|
|
9
|
+
* TRACEPERF_OUTPUT=calls.jsonl append every request tree as JSON lines
|
|
10
|
+
* (console trees are then off unless TRACEPERF_SILENT=0)
|
|
11
|
+
* TRACEPERF_THRESHOLD=50 only print/record calls taking at least 50 ms
|
|
12
|
+
* TRACEPERF_SAMPLE_RATE=0.1 track 10% of top-level calls
|
|
13
|
+
* TRACEPERF_SILENT=1 no per-call console trees
|
|
14
|
+
* TRACEPERF_SUMMARY=0 no stats + explanations on exit (default on)
|
|
15
|
+
* TRACEPERF_DISABLE=http,fetch skip targets (server, http, fetch, pg, mysql2, mongodb, ioredis)
|
|
16
|
+
* TRACEPERF_IGNORE=^/health regular expression of request paths not to track
|
|
17
|
+
* TRACEPERF_QUIET=1 no "traceperf: tracking ..." line at startup
|
|
18
|
+
* TRACEPERF_ENABLED=0 load nothing
|
|
19
|
+
*/
|
|
20
|
+
import './node-builtins.js';
|