traceperf 0.2.1 → 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 +608 -253
- 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,98 @@
|
|
|
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'; // must stay first: see node-builtins.ts
|
|
21
|
+
import tracePerf from './index.js';
|
|
22
|
+
import { AUTO_TARGETS, autoInstrument } from './auto.js';
|
|
23
|
+
import { explain, formatFindings } from './core/explain.js';
|
|
24
|
+
import { jsonLinesExporter } from './core/exporters.js';
|
|
25
|
+
import { loadNodeBuiltin } from './core/env.js';
|
|
26
|
+
const env = (typeof process !== 'undefined' && process.env) || {};
|
|
27
|
+
const flag = (value, fallback) => value === undefined || value === '' ? fallback : !/^(0|false|no|off)$/i.test(value);
|
|
28
|
+
const num = (value) => (value === undefined || value === '' || !Number.isFinite(Number(value)) ? undefined : Number(value));
|
|
29
|
+
const AUTO_KEY = Symbol.for('traceperf.auto');
|
|
30
|
+
const g = globalThis;
|
|
31
|
+
if (flag(env.TRACEPERF_ENABLED, true) && !g[AUTO_KEY]) {
|
|
32
|
+
g[AUTO_KEY] = true;
|
|
33
|
+
const fs = loadNodeBuiltin('fs');
|
|
34
|
+
const output = env.TRACEPERF_OUTPUT;
|
|
35
|
+
const threshold = num(env.TRACEPERF_THRESHOLD);
|
|
36
|
+
const sampleRate = num(env.TRACEPERF_SAMPLE_RATE);
|
|
37
|
+
tracePerf.setConfig({
|
|
38
|
+
silent: flag(env.TRACEPERF_SILENT, !!output),
|
|
39
|
+
trackMemory: false,
|
|
40
|
+
...(threshold !== undefined ? { threshold } : {}),
|
|
41
|
+
...(sampleRate !== undefined ? { sampleRate } : {}),
|
|
42
|
+
});
|
|
43
|
+
if (output && fs) {
|
|
44
|
+
tracePerf.use(jsonLinesExporter(line => fs.appendFileSync(output, line + '\n')));
|
|
45
|
+
}
|
|
46
|
+
// Keep the most recent trees for the exit summary
|
|
47
|
+
const recent = [];
|
|
48
|
+
const summary = flag(env.TRACEPERF_SUMMARY, true);
|
|
49
|
+
if (summary) {
|
|
50
|
+
tracePerf.onComplete(root => {
|
|
51
|
+
recent.push(root);
|
|
52
|
+
if (recent.length > 1000)
|
|
53
|
+
recent.shift();
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const disable = (env.TRACEPERF_DISABLE || '').split(',').map(s => s.trim()).filter(Boolean);
|
|
57
|
+
const unknown = disable.filter(t => !AUTO_TARGETS.includes(t));
|
|
58
|
+
if (unknown.length)
|
|
59
|
+
process.stderr.write(`traceperf: unknown TRACEPERF_DISABLE target(s): ${unknown.join(', ')}\n`);
|
|
60
|
+
let ignore;
|
|
61
|
+
try {
|
|
62
|
+
ignore = env.TRACEPERF_IGNORE ? new RegExp(env.TRACEPERF_IGNORE) : undefined;
|
|
63
|
+
}
|
|
64
|
+
catch (_a) {
|
|
65
|
+
process.stderr.write('traceperf: TRACEPERF_IGNORE is not a valid regular expression; ignoring it\n');
|
|
66
|
+
}
|
|
67
|
+
const { instrumented } = autoInstrument(tracePerf, {
|
|
68
|
+
disable,
|
|
69
|
+
server: ignore ? { ignore: req => ignore.test(String(req.url || '').split('?')[0]) } : undefined,
|
|
70
|
+
});
|
|
71
|
+
if (!flag(env.TRACEPERF_QUIET, false)) {
|
|
72
|
+
process.stderr.write(`traceperf: tracking ${instrumented.join(', ') || 'nothing'}${output ? ` -> ${output}` : ''}\n`);
|
|
73
|
+
}
|
|
74
|
+
let printed = false;
|
|
75
|
+
const printSummary = () => {
|
|
76
|
+
if (printed || !summary)
|
|
77
|
+
return;
|
|
78
|
+
printed = true;
|
|
79
|
+
const stats = tracePerf.getStats();
|
|
80
|
+
if (Object.keys(stats).length === 0)
|
|
81
|
+
return;
|
|
82
|
+
process.stderr.write(`\ntraceperf summary\n\n${tracePerf.formatStats()}\n\n${formatFindings(explain(recent, { max: 10 }))}\n`);
|
|
83
|
+
};
|
|
84
|
+
process.once('exit', printSummary);
|
|
85
|
+
// Ctrl-C / kill: print, then exit as the signal would have, unless the app
|
|
86
|
+
// handles the signal itself (its exit then triggers the 'exit' summary)
|
|
87
|
+
for (const signal of ['SIGINT', 'SIGTERM']) {
|
|
88
|
+
const onSignal = () => {
|
|
89
|
+
if (process.listenerCount(signal) > 1)
|
|
90
|
+
return;
|
|
91
|
+
process.removeListener(signal, onSignal);
|
|
92
|
+
printSummary();
|
|
93
|
+
process.kill(process.pid, signal);
|
|
94
|
+
};
|
|
95
|
+
process.on(signal, onSignal);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained HTML report: flame chart (one row per nesting level, one
|
|
3
|
+
* band per lane), statistics table and slowest calls. No scripts, no
|
|
4
|
+
* external assets - safe to attach to an issue or open from disk.
|
|
5
|
+
*/
|
|
6
|
+
import type { Call } from './cli.js';
|
|
7
|
+
import type { LabelStats } from './core/stats.js';
|
|
8
|
+
export declare function renderHtmlReport(calls: Call[], stats: Record<string, LabelStats>, options?: {
|
|
9
|
+
title?: string;
|
|
10
|
+
top?: number;
|
|
11
|
+
}): string;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
const esc = (s) => String(s)
|
|
2
|
+
.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
3
|
+
/** Stable colour per label (same label, same colour across reports) */
|
|
4
|
+
function colorFor(label, failed) {
|
|
5
|
+
if (failed)
|
|
6
|
+
return '#d73a49';
|
|
7
|
+
let h = 0;
|
|
8
|
+
for (let i = 0; i < label.length; i++)
|
|
9
|
+
h = (h * 31 + label.charCodeAt(i)) >>> 0;
|
|
10
|
+
// Hues 40..320 only: red is reserved for errors
|
|
11
|
+
return `hsl(${40 + (h % 280)}, 55%, 58%)`;
|
|
12
|
+
}
|
|
13
|
+
const ms = (n) => (n >= 1000 ? `${(n / 1000).toFixed(2)} s` : `${n.toFixed(n < 10 ? 3 : 1)} ms`);
|
|
14
|
+
export function renderHtmlReport(calls, stats, options = {}) {
|
|
15
|
+
var _a, _b;
|
|
16
|
+
const title = (_a = options.title) !== null && _a !== void 0 ? _a : 'traceperf report';
|
|
17
|
+
const top = (_b = options.top) !== null && _b !== void 0 ? _b : 20;
|
|
18
|
+
const width = 1200;
|
|
19
|
+
const rowH = 18;
|
|
20
|
+
const laneGap = 10;
|
|
21
|
+
const axisH = 22;
|
|
22
|
+
const start = calls.length ? Math.min(...calls.map(c => c.start)) : 0;
|
|
23
|
+
const end = calls.length ? Math.max(...calls.map(c => c.start + c.duration)) : 1;
|
|
24
|
+
const span = Math.max(end - start, 0.001);
|
|
25
|
+
const x = (t) => ((t - start) / span) * width;
|
|
26
|
+
// Vertical layout: each lane gets (max depth + 1) rows
|
|
27
|
+
const lanes = [...new Set(calls.map(c => c.lane))].sort((a, b) => a - b);
|
|
28
|
+
const laneTop = new Map();
|
|
29
|
+
let y = axisH;
|
|
30
|
+
for (const lane of lanes) {
|
|
31
|
+
laneTop.set(lane, y);
|
|
32
|
+
const depth = Math.max(...calls.filter(c => c.lane === lane).map(c => c.depth));
|
|
33
|
+
y += (depth + 1) * rowH + laneGap;
|
|
34
|
+
}
|
|
35
|
+
const height = y;
|
|
36
|
+
const rects = calls.map(c => {
|
|
37
|
+
const rx = x(c.start);
|
|
38
|
+
const rw = Math.max(1, x(c.start + c.duration) - rx);
|
|
39
|
+
const ry = laneTop.get(c.lane) + c.depth * rowH;
|
|
40
|
+
const tip = `${c.path}\n${ms(c.duration)} (self ${ms(c.selfDuration)})${c.error ? `\nerror: ${c.error}` : ''}`;
|
|
41
|
+
const text = rw > 40
|
|
42
|
+
? `<text x="${(rx + 4).toFixed(1)}" y="${ry + 13}">${esc(c.label.length * 6.5 > rw - 8 ? `${c.label.slice(0, Math.max(1, Math.floor((rw - 14) / 6.5)))}…` : c.label)}</text>`
|
|
43
|
+
: '';
|
|
44
|
+
return `<g class="call"><title>${esc(tip)}</title><rect x="${rx.toFixed(1)}" y="${ry}" width="${rw.toFixed(1)}" height="${rowH - 2}" rx="2" fill="${colorFor(c.label, !!c.error)}"/>${text}</g>`;
|
|
45
|
+
}).join('\n');
|
|
46
|
+
const ticks = Array.from({ length: 6 }, (_, i) => {
|
|
47
|
+
const tx = (i / 5) * width;
|
|
48
|
+
return `<line x1="${tx}" x2="${tx}" y1="${axisH - 4}" y2="${height}" class="grid"/><text x="${Math.min(tx + 3, width - 60)}" y="14" class="axis">${esc(ms((span * i) / 5))}</text>`;
|
|
49
|
+
}).join('');
|
|
50
|
+
const statRows = Object.keys(stats)
|
|
51
|
+
.sort((a, b) => stats[b].total - stats[a].total)
|
|
52
|
+
.map(label => {
|
|
53
|
+
const s = stats[label];
|
|
54
|
+
return `<tr><td>${esc(label)}</td><td>${s.count}</td><td>${s.errors}</td><td>${s.total.toFixed(1)}</td><td>${s.mean.toFixed(3)}</td><td>${s.p50.toFixed(3)}</td><td>${s.p95.toFixed(3)}</td><td>${s.p99.toFixed(3)}</td><td>${s.max.toFixed(3)}</td><td>${s.selfMean.toFixed(3)}</td></tr>`;
|
|
55
|
+
}).join('\n');
|
|
56
|
+
const slowest = calls.slice().sort((a, b) => b.duration - a.duration).slice(0, top)
|
|
57
|
+
.map(c => `<tr><td>${esc(ms(c.duration))}</td><td>${esc(c.path)}${c.error ? ` <span class="err">✖ ${esc(c.error)}</span>` : ''}</td></tr>`).join('\n');
|
|
58
|
+
return `<!doctype html>
|
|
59
|
+
<html lang="en">
|
|
60
|
+
<head>
|
|
61
|
+
<meta charset="utf-8">
|
|
62
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
63
|
+
<title>${esc(title)}</title>
|
|
64
|
+
<style>
|
|
65
|
+
:root { color-scheme: light dark; --bg: #fff; --fg: #1f2328; --muted: #656d76; --grid: #d0d7de; --row: #f6f8fa; }
|
|
66
|
+
@media (prefers-color-scheme: dark) { :root { --bg: #0d1117; --fg: #e6edf3; --muted: #8b949e; --grid: #30363d; --row: #161b22; } }
|
|
67
|
+
body { margin: 0; padding: 24px 16px; background: var(--bg); color: var(--fg); font: 14px/1.5 system-ui, sans-serif; }
|
|
68
|
+
main { max-width: 1240px; margin: 0 auto; }
|
|
69
|
+
h1 { font-size: 20px; margin: 0 0 4px; } h2 { font-size: 16px; margin: 28px 0 8px; }
|
|
70
|
+
.meta { color: var(--muted); margin: 0 0 16px; }
|
|
71
|
+
.chart { overflow-x: auto; border: 1px solid var(--grid); border-radius: 6px; padding: 8px; }
|
|
72
|
+
svg { display: block; } svg text { font: 11px ui-monospace, monospace; fill: #0d1117; pointer-events: none; }
|
|
73
|
+
svg text.axis { fill: var(--muted); } line.grid { stroke: var(--grid); stroke-width: 1; }
|
|
74
|
+
g.call:hover rect { stroke: var(--fg); stroke-width: 1.5; }
|
|
75
|
+
table { border-collapse: collapse; width: 100%; font: 12px ui-monospace, monospace; }
|
|
76
|
+
th, td { text-align: right; padding: 4px 8px; border-bottom: 1px solid var(--grid); white-space: nowrap; }
|
|
77
|
+
th:first-child, td:first-child { text-align: left; } tbody tr:nth-child(odd) { background: var(--row); }
|
|
78
|
+
.slow td:first-child { width: 1%; } .slow td:last-child, .slow th:last-child { text-align: left; white-space: normal; width: auto; } .err { color: #d73a49; }
|
|
79
|
+
.wrap { overflow-x: auto; }
|
|
80
|
+
</style>
|
|
81
|
+
</head>
|
|
82
|
+
<body>
|
|
83
|
+
<main>
|
|
84
|
+
<h1>${esc(title)}</h1>
|
|
85
|
+
<p class="meta">${calls.length} calls · ${Object.keys(stats).length} labels · ${lanes.length} lane${lanes.length === 1 ? '' : 's'} · span ${esc(ms(span))}. Hover a bar for details.</p>
|
|
86
|
+
<h2>Flame chart</h2>
|
|
87
|
+
<div class="chart"><svg width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" role="img" aria-label="flame chart">
|
|
88
|
+
${ticks}
|
|
89
|
+
${rects}
|
|
90
|
+
</svg></div>
|
|
91
|
+
<h2>Statistics (ms)</h2>
|
|
92
|
+
<div class="wrap"><table><thead><tr><th>label</th><th>calls</th><th>errors</th><th>total</th><th>mean</th><th>p50</th><th>p95</th><th>p99</th><th>max</th><th>self mean</th></tr></thead>
|
|
93
|
+
<tbody>
|
|
94
|
+
${statRows}
|
|
95
|
+
</tbody></table></div>
|
|
96
|
+
<h2>Slowest ${Math.min(top, calls.length)} calls</h2>
|
|
97
|
+
<div class="wrap"><table class="slow"><thead><tr><th>duration</th><th>call</th></tr></thead>
|
|
98
|
+
<tbody>
|
|
99
|
+
${slowest}
|
|
100
|
+
</tbody></table></div>
|
|
101
|
+
</main>
|
|
102
|
+
</body>
|
|
103
|
+
</html>
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=report-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-html.js","sourceRoot":"","sources":["../../src/report-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,82 +1,6 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
|
|
1
|
+
export * from './options.js';
|
|
2
|
+
import type { TracePerfConfig } from './options.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* @deprecated Use `TracePerfConfig`.
|
|
5
5
|
*/
|
|
6
|
-
export
|
|
7
|
-
/** Tracking mode for balancing performance vs detail */
|
|
8
|
-
trackingMode?: string;
|
|
9
|
-
/** Whether to suppress console output */
|
|
10
|
-
silent?: boolean;
|
|
11
|
-
/** Whether to track memory usage */
|
|
12
|
-
trackMemory?: boolean;
|
|
13
|
-
/** Whether to enable nested function tracking */
|
|
14
|
-
enableNestedTracking?: boolean;
|
|
15
|
-
/** Minimum duration threshold in microseconds */
|
|
16
|
-
threshold?: number;
|
|
17
|
-
/** Sampling rate (0.0-1.0) for reducing overhead */
|
|
18
|
-
sampleRate?: number;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Interface for tracking options
|
|
22
|
-
*/
|
|
23
|
-
export interface ITrackOptions {
|
|
24
|
-
/** Custom label for the tracked function */
|
|
25
|
-
label?: string;
|
|
26
|
-
/** Override default tracking mode */
|
|
27
|
-
trackingMode?: string;
|
|
28
|
-
/** Override default silent setting */
|
|
29
|
-
silent?: boolean;
|
|
30
|
-
/** Override default memory tracking */
|
|
31
|
-
trackMemory?: boolean;
|
|
32
|
-
/** Override default nested tracking */
|
|
33
|
-
enableNestedTracking?: boolean;
|
|
34
|
-
/** Minimum duration threshold in microseconds */
|
|
35
|
-
threshold?: number;
|
|
36
|
-
/** Sampling rate (0.0-1.0) for reducing overhead */
|
|
37
|
-
sampleRate?: number;
|
|
38
|
-
/** Any other options */
|
|
39
|
-
[key: string]: any;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Interface for execution trackers
|
|
43
|
-
*/
|
|
44
|
-
export interface IExecutionTracker {
|
|
45
|
-
/**
|
|
46
|
-
* Track the execution of a function
|
|
47
|
-
*
|
|
48
|
-
* @param fn - The function to track
|
|
49
|
-
* @param options - Options for tracking
|
|
50
|
-
* @returns The return value of the tracked function
|
|
51
|
-
*/
|
|
52
|
-
track<T>(fn: () => T, options?: ITrackOptions): T;
|
|
53
|
-
/**
|
|
54
|
-
* Create a trackable version of a function
|
|
55
|
-
*
|
|
56
|
-
* This is a helper method to create a tracked version of a function
|
|
57
|
-
* that can be used for nested function tracking.
|
|
58
|
-
*
|
|
59
|
-
* @param fn - The function to make trackable
|
|
60
|
-
* @param options - Options for tracking
|
|
61
|
-
* @returns A tracked version of the function
|
|
62
|
-
*/
|
|
63
|
-
createTrackable<T extends (...args: any[]) => any>(fn: T, options?: Omit<ITrackOptions, 'label'> & {
|
|
64
|
-
label?: string;
|
|
65
|
-
}): (...args: Parameters<T>) => ReturnType<T>;
|
|
66
|
-
/**
|
|
67
|
-
* Get the current call stack
|
|
68
|
-
*
|
|
69
|
-
* @returns The current call stack
|
|
70
|
-
*/
|
|
71
|
-
getCallStack(): string[];
|
|
72
|
-
/**
|
|
73
|
-
* Generate a visual representation of the execution flow
|
|
74
|
-
*
|
|
75
|
-
* @returns ASCII flow chart of the execution
|
|
76
|
-
*/
|
|
77
|
-
generateFlowChart(): string;
|
|
78
|
-
/**
|
|
79
|
-
* Clear all execution records
|
|
80
|
-
*/
|
|
81
|
-
clear(): void;
|
|
82
|
-
}
|
|
6
|
+
export type ITracePerfConfig = TracePerfConfig;
|
package/dist/esm/types/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ExecutionRecord, TracePerfPlugin, TrackingModeName } from '../core/records.js';
|
|
2
|
+
import type { StatsOptions } from '../core/stats.js';
|
|
3
|
+
/**
|
|
4
|
+
* Options for a single tracked function or call. Anything left out falls
|
|
5
|
+
* back to the instance configuration at the time of the call.
|
|
6
|
+
*/
|
|
7
|
+
export interface TrackOptions {
|
|
8
|
+
/** Label shown in output and stats (default: the function name) */
|
|
9
|
+
label?: string;
|
|
10
|
+
/** Tracking mode for this call */
|
|
11
|
+
trackingMode?: TrackingModeName;
|
|
12
|
+
/** Suppress console output for this call */
|
|
13
|
+
silent?: boolean;
|
|
14
|
+
/** Record the heap change for this call */
|
|
15
|
+
trackMemory?: boolean;
|
|
16
|
+
/** Only report this call if it takes at least this many milliseconds */
|
|
17
|
+
threshold?: number;
|
|
18
|
+
/** Fraction of calls to track (0.0 - 1.0) */
|
|
19
|
+
sampleRate?: number;
|
|
20
|
+
/** Include a short rendering of the arguments in output and records */
|
|
21
|
+
captureArgs?: boolean;
|
|
22
|
+
/** Attach tracked calls made inside this one as children (default true) */
|
|
23
|
+
enableNestedTracking?: boolean;
|
|
24
|
+
/** Attach this call to a specific parent execution */
|
|
25
|
+
parentExecutionId?: string | null;
|
|
26
|
+
}
|
|
27
|
+
/** Options for `track(fn, options)` */
|
|
28
|
+
export interface TrackCallOptions extends TrackOptions {
|
|
29
|
+
/** `this` for the tracked function */
|
|
30
|
+
thisContext?: unknown;
|
|
31
|
+
/** Arguments passed to the tracked function */
|
|
32
|
+
args?: unknown[];
|
|
33
|
+
}
|
|
34
|
+
/** Options for `registerModule` / `trackObject` */
|
|
35
|
+
export interface ModuleTrackOptions extends TrackOptions {
|
|
36
|
+
/** Prefix for each method label, e.g. "userService." */
|
|
37
|
+
prefix?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Configuration for `createTracePerf()` / `new OptimizedPerformanceMonitor()` */
|
|
40
|
+
export interface TracePerfConfig {
|
|
41
|
+
/** Detail level (default "balanced") */
|
|
42
|
+
trackingMode?: TrackingModeName;
|
|
43
|
+
/** Suppress console output (stats, hooks and exporters still run) */
|
|
44
|
+
silent?: boolean;
|
|
45
|
+
/** Record heap change per call (default true) */
|
|
46
|
+
trackMemory?: boolean;
|
|
47
|
+
/** Attach nested tracked calls to their caller (default true) */
|
|
48
|
+
enableNestedTracking?: boolean;
|
|
49
|
+
/** Only report calls taking at least this many milliseconds (default 0) */
|
|
50
|
+
threshold?: number;
|
|
51
|
+
/** Fraction of calls to track (default 1) */
|
|
52
|
+
sampleRate?: number;
|
|
53
|
+
/** Set to false to make every tracked function a plain pass-through */
|
|
54
|
+
enabled?: boolean;
|
|
55
|
+
/** Detailed mode flags calls whose synchronous part runs at least this long (ms, default 50; 0 disables) */
|
|
56
|
+
blockingThreshold?: number;
|
|
57
|
+
/** Collect per-label statistics (default true) */
|
|
58
|
+
stats?: boolean | StatsOptions;
|
|
59
|
+
/** Replace console output: called with each reported top-level tree */
|
|
60
|
+
reporter?: (root: ExecutionRecord) => void;
|
|
61
|
+
/** Plugins/exporters to register */
|
|
62
|
+
plugins?: TracePerfPlugin[];
|
|
63
|
+
/** Called with every finished top-level tree (also when silent) */
|
|
64
|
+
onComplete?: (root: ExecutionRecord) => void;
|
|
65
|
+
/**
|
|
66
|
+
* AsyncLocalStorage class to use for nesting across `await`. Detected
|
|
67
|
+
* automatically on Node.js, Bun, Deno and where it is a global; pass it
|
|
68
|
+
* explicitly on runtimes where it is only importable, e.g. Cloudflare
|
|
69
|
+
* Workers: `import { AsyncLocalStorage } from 'node:async_hooks'`.
|
|
70
|
+
*/
|
|
71
|
+
asyncLocalStorage?: new () => any;
|
|
72
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/types/options.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface WatchOptions {
|
|
2
|
+
top?: number;
|
|
3
|
+
sort?: 'p95' | 'p99' | 'mean' | 'total' | 'count' | 'max';
|
|
4
|
+
/** Calls/s is computed over this window (ms, default 10000) */
|
|
5
|
+
rateWindow?: number;
|
|
6
|
+
/** Show the arrival rate (only meaningful while following a live file; default true) */
|
|
7
|
+
showRate?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** Incremental state for `traceperf watch`; feed it text, render frames */
|
|
10
|
+
export declare function createWatcher(options?: WatchOptions): {
|
|
11
|
+
/** Add newly appended text (may end mid-line) */
|
|
12
|
+
ingest(text: string, now?: number): void;
|
|
13
|
+
/** Forget everything (e.g. the file was truncated) */
|
|
14
|
+
reset(): void;
|
|
15
|
+
/** Render one frame as text */
|
|
16
|
+
frame(title: string, now?: number): string;
|
|
17
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* traceperf watch: a live, top-style view of a JSON-lines log
|
|
3
|
+
* (from jsonLinesExporter) as the application writes it.
|
|
4
|
+
*/
|
|
5
|
+
import { StatsCollector } from './core/stats.js';
|
|
6
|
+
function toRecord(label, duration, selfDuration, error) {
|
|
7
|
+
return {
|
|
8
|
+
id: '', label, parentId: null, startTime: 0, endTime: duration, startEpochMs: 0, duration,
|
|
9
|
+
selfDuration, syncDuration: duration, async: false, children: [], threshold: 0,
|
|
10
|
+
trackingMode: 'balanced', silent: true, ...(error ? { error: new Error(error) } : {}),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** Incremental state for `traceperf watch`; feed it text, render frames */
|
|
14
|
+
export function createWatcher(options = {}) {
|
|
15
|
+
var _a;
|
|
16
|
+
const stats = new StatsCollector({ reservoirSize: 2048, maxLabels: 5000 });
|
|
17
|
+
const window = (_a = options.rateWindow) !== null && _a !== void 0 ? _a : 10000;
|
|
18
|
+
const arrivals = [];
|
|
19
|
+
let pending = '';
|
|
20
|
+
let calls = 0;
|
|
21
|
+
let invalid = 0;
|
|
22
|
+
const visit = (node) => {
|
|
23
|
+
if (!node || typeof node.label !== 'string' || typeof node.durationMs !== 'number')
|
|
24
|
+
return;
|
|
25
|
+
stats.add(toRecord(node.label, node.durationMs, typeof node.selfMs === 'number' ? node.selfMs : node.durationMs, node.error));
|
|
26
|
+
calls++;
|
|
27
|
+
(node.children || []).forEach(visit);
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
/** Add newly appended text (may end mid-line) */
|
|
31
|
+
ingest(text, now = Date.now()) {
|
|
32
|
+
var _a;
|
|
33
|
+
const lines = (pending + text).split('\n');
|
|
34
|
+
pending = (_a = lines.pop()) !== null && _a !== void 0 ? _a : '';
|
|
35
|
+
for (const line of lines) {
|
|
36
|
+
if (!line.trim())
|
|
37
|
+
continue;
|
|
38
|
+
try {
|
|
39
|
+
const before = calls;
|
|
40
|
+
visit(JSON.parse(line));
|
|
41
|
+
for (let i = before; i < calls; i++)
|
|
42
|
+
arrivals.push(now);
|
|
43
|
+
}
|
|
44
|
+
catch (_b) {
|
|
45
|
+
invalid++;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
while (arrivals.length && arrivals[0] < now - window)
|
|
49
|
+
arrivals.shift();
|
|
50
|
+
},
|
|
51
|
+
/** Forget everything (e.g. the file was truncated) */
|
|
52
|
+
reset() {
|
|
53
|
+
stats.reset();
|
|
54
|
+
arrivals.length = 0;
|
|
55
|
+
pending = '';
|
|
56
|
+
calls = 0;
|
|
57
|
+
invalid = 0;
|
|
58
|
+
},
|
|
59
|
+
/** Render one frame as text */
|
|
60
|
+
frame(title, now = Date.now()) {
|
|
61
|
+
var _a, _b;
|
|
62
|
+
while (arrivals.length && arrivals[0] < now - window)
|
|
63
|
+
arrivals.shift();
|
|
64
|
+
const sort = (_a = options.sort) !== null && _a !== void 0 ? _a : 'p95';
|
|
65
|
+
const all = stats.all();
|
|
66
|
+
const labels = Object.keys(all).sort((a, b) => all[b][sort] - all[a][sort])
|
|
67
|
+
.slice(0, Math.max(1, (_b = options.top) !== null && _b !== void 0 ? _b : 15));
|
|
68
|
+
const rate = arrivals.length / (window / 1000);
|
|
69
|
+
const rateText = options.showRate === false ? '' : ` | ${rate.toFixed(1)} calls/s (last ${window / 1000}s)`;
|
|
70
|
+
const head = `${title} | ${calls.toLocaleString('en-US')} calls${rateText} | ${new Date(now).toISOString().slice(11, 19)}`
|
|
71
|
+
+ (invalid ? ` | ${invalid} invalid lines` : '');
|
|
72
|
+
if (labels.length === 0)
|
|
73
|
+
return `${head}\n\nwaiting for data...`;
|
|
74
|
+
const cols = [
|
|
75
|
+
['calls', s => String(s.count)], ['errors', s => String(s.errors)], ['p50', s => s.p50.toFixed(2)],
|
|
76
|
+
['p95', s => s.p95.toFixed(2)], ['p99', s => s.p99.toFixed(2)], ['max', s => s.max.toFixed(2)], ['total', s => s.total.toFixed(0)],
|
|
77
|
+
];
|
|
78
|
+
const rows = labels.map(l => [l, ...cols.map(([, f]) => f(all[l]))]);
|
|
79
|
+
const header = ['label', ...cols.map(([n]) => (n === sort ? `${n}▼` : n))];
|
|
80
|
+
const widths = header.map((h, i) => Math.max(h.length, ...rows.map(r => r[i].length)));
|
|
81
|
+
const fmt = (cells) => cells.map((c, i) => (i === 0 ? c.padEnd(widths[i]) : c.padStart(widths[i]))).join(' ');
|
|
82
|
+
const footer = options.showRate === false ? 'times in ms' : 'times in ms - Ctrl+C to exit';
|
|
83
|
+
return [head, '', fmt(header), widths.map(w => '-'.repeat(w)).join(' '), ...rows.map(fmt), '', footer].join('\n');
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/watch.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import { OptimizedPerformanceMonitor, TrackingModes } from './core/optimized-performance-monitor';
|
|
2
|
-
import { ITracePerfConfig } from './types';
|
|
2
|
+
import { ITracePerfConfig, TrackOptions } from './types';
|
|
3
3
|
declare const tracePerf: OptimizedPerformanceMonitor;
|
|
4
4
|
export default tracePerf;
|
|
5
|
-
export declare function createTracePerf(config?:
|
|
5
|
+
export declare function createTracePerf(config?: ITracePerfConfig): OptimizedPerformanceMonitor;
|
|
6
|
+
/**
|
|
7
|
+
* Method decorator bound to the default instance, see `OptimizedPerformanceMonitor.traced`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function traced(options?: TrackOptions): import("./core").TracedDecorator;
|
|
6
10
|
export * from './types';
|
|
7
11
|
export * from './core';
|
|
12
|
+
export * from './integrations';
|
|
13
|
+
export * from './instrument';
|
|
14
|
+
export * from './drivers';
|
|
15
|
+
export * from './auto';
|
|
8
16
|
export { OptimizedPerformanceMonitor };
|
|
9
17
|
export { TrackingModes as TrackingMode };
|
package/dist/index.js
CHANGED
|
@@ -10,59 +10,56 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
10
10
|
if (k2 === undefined) k2 = k;
|
|
11
11
|
o[k2] = m[k];
|
|
12
12
|
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
13
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
36
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
15
|
};
|
|
38
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
17
|
exports.TrackingMode = exports.OptimizedPerformanceMonitor = void 0;
|
|
40
18
|
exports.createTracePerf = createTracePerf;
|
|
19
|
+
exports.traced = traced;
|
|
41
20
|
// Import optimized performance monitor from core
|
|
42
21
|
const optimized_performance_monitor_1 = require("./core/optimized-performance-monitor");
|
|
43
22
|
Object.defineProperty(exports, "OptimizedPerformanceMonitor", { enumerable: true, get: function () { return optimized_performance_monitor_1.OptimizedPerformanceMonitor; } });
|
|
44
23
|
Object.defineProperty(exports, "TrackingMode", { enumerable: true, get: function () { return optimized_performance_monitor_1.TrackingModes; } });
|
|
45
|
-
|
|
46
|
-
//
|
|
47
|
-
|
|
24
|
+
// Create singleton instance, shared by the CommonJS and ESM builds of this
|
|
25
|
+
// major version (so `--require traceperf/auto` and `import tp from
|
|
26
|
+
// 'traceperf'` see the same instance and the same call trees)
|
|
27
|
+
const DEFAULT_KEY = Symbol.for('traceperf.default.v1');
|
|
28
|
+
const shared = globalThis;
|
|
29
|
+
const tracePerf = shared[DEFAULT_KEY] || (shared[DEFAULT_KEY] = new optimized_performance_monitor_1.OptimizedPerformanceMonitor());
|
|
48
30
|
// Export the singleton instance as the default export
|
|
49
31
|
exports.default = tracePerf;
|
|
50
32
|
// Export a function to create a new tracePerf instance
|
|
51
33
|
function createTracePerf(config = {}) {
|
|
52
34
|
return new optimized_performance_monitor_1.OptimizedPerformanceMonitor(config);
|
|
53
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Method decorator bound to the default instance, see `OptimizedPerformanceMonitor.traced`.
|
|
38
|
+
*/
|
|
39
|
+
function traced(options = {}) {
|
|
40
|
+
// Call the prototype method: in CommonJS this function is also installed
|
|
41
|
+
// as tracePerf.traced, so tracePerf.traced(...) would recurse.
|
|
42
|
+
return optimized_performance_monitor_1.OptimizedPerformanceMonitor.prototype.traced.call(tracePerf, options);
|
|
43
|
+
}
|
|
54
44
|
// Export types and classes for advanced usage
|
|
55
45
|
__exportStar(require("./types"), exports);
|
|
56
46
|
__exportStar(require("./core"), exports);
|
|
57
|
-
|
|
47
|
+
__exportStar(require("./integrations"), exports);
|
|
48
|
+
__exportStar(require("./instrument"), exports);
|
|
49
|
+
__exportStar(require("./drivers"), exports);
|
|
50
|
+
__exportStar(require("./auto"), exports);
|
|
51
|
+
// <cjs-compat>
|
|
52
|
+
// CommonJS compatibility: make `require('traceperf')` return the singleton
|
|
53
|
+
// itself (so `require('traceperf').track()` works) while still exposing every
|
|
54
|
+
// named export declared in the type definitions. Stripped from the ESM build.
|
|
58
55
|
if (typeof module !== 'undefined' && module.exports) {
|
|
59
|
-
module.exports = Object.assign(tracePerf, {
|
|
56
|
+
module.exports = Object.assign(tracePerf, module.exports, {
|
|
60
57
|
default: tracePerf,
|
|
61
58
|
createTracePerf,
|
|
59
|
+
traced,
|
|
62
60
|
OptimizedPerformanceMonitor: optimized_performance_monitor_1.OptimizedPerformanceMonitor,
|
|
63
61
|
TrackingMode: optimized_performance_monitor_1.TrackingModes,
|
|
64
|
-
// Re-export types
|
|
65
|
-
...typesExports
|
|
66
62
|
});
|
|
67
63
|
}
|
|
64
|
+
// </cjs-compat>
|
|
68
65
|
//# sourceMappingURL=index.js.map
|