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,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Plain-English explanations of finished trees: what made a call slow.
|
|
4
|
+
*
|
|
5
|
+
* const findings = explain(roots);
|
|
6
|
+
* console.log(formatFindings(findings));
|
|
7
|
+
*
|
|
8
|
+
* Works on records from onComplete / a trace recorder, or on files via
|
|
9
|
+
* `traceperf explain <file>`. Every finding is a heuristic with the numbers
|
|
10
|
+
* that triggered it, so it can be checked against the tree.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.explain = explain;
|
|
14
|
+
exports.formatFindings = formatFindings;
|
|
15
|
+
const fmt = (ms) => (ms >= 1000 ? `${(ms / 1000).toFixed(2)} s` : `${ms.toFixed(ms < 10 ? 1 : 0)} ms`);
|
|
16
|
+
const pct = (part, whole) => `${Math.round((part / Math.max(whole, 1e-9)) * 100)}%`;
|
|
17
|
+
function syncOf(node) {
|
|
18
|
+
if (typeof node.syncDuration === 'number')
|
|
19
|
+
return node.syncDuration;
|
|
20
|
+
return node.async ? 0 : node.duration;
|
|
21
|
+
}
|
|
22
|
+
/** Deepest records whose synchronous part is long: the code that actually blocked */
|
|
23
|
+
function collectBlockers(node, rootIndex, threshold, out) {
|
|
24
|
+
let childBlocked = 0;
|
|
25
|
+
for (const child of node.children) {
|
|
26
|
+
if (collectBlockers(child, rootIndex, threshold, out))
|
|
27
|
+
childBlocked += syncOf(child);
|
|
28
|
+
}
|
|
29
|
+
const sync = syncOf(node);
|
|
30
|
+
// Attribute to this node only the blocking its blocking children do not explain
|
|
31
|
+
if (sync >= threshold && sync - childBlocked >= threshold) {
|
|
32
|
+
out.push({ label: node.label, root: rootIndex, start: node.startTime, end: node.startTime + sync });
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
return childBlocked > 0;
|
|
36
|
+
}
|
|
37
|
+
function overlap(aStart, aEnd, bStart, bEnd) {
|
|
38
|
+
return Math.max(0, Math.min(aEnd, bEnd) - Math.max(aStart, bStart));
|
|
39
|
+
}
|
|
40
|
+
function walk(node, visit) {
|
|
41
|
+
visit(node);
|
|
42
|
+
node.children.forEach(c => walk(c, visit));
|
|
43
|
+
}
|
|
44
|
+
function explain(roots, options = {}) {
|
|
45
|
+
var _a, _b, _c, _d, _e;
|
|
46
|
+
const blockingMs = (_a = options.blockingMs) !== null && _a !== void 0 ? _a : 10;
|
|
47
|
+
const minMs = (_b = options.minMs) !== null && _b !== void 0 ? _b : 5;
|
|
48
|
+
const dominantShare = (_c = options.dominantShare) !== null && _c !== void 0 ? _c : 0.6;
|
|
49
|
+
const repeatCount = (_d = options.repeatCount) !== null && _d !== void 0 ? _d : 5;
|
|
50
|
+
const findings = [];
|
|
51
|
+
const blockers = [];
|
|
52
|
+
roots.forEach((root, i) => collectBlockers(root, i, blockingMs, blockers));
|
|
53
|
+
roots.forEach((root, i) => {
|
|
54
|
+
var _a;
|
|
55
|
+
const rootLabel = root.label;
|
|
56
|
+
const rootEnd = root.startTime + root.duration;
|
|
57
|
+
// 1. Delayed by blocking code in other top-level calls
|
|
58
|
+
const byLabel = new Map();
|
|
59
|
+
for (const b of blockers) {
|
|
60
|
+
if (b.root === i)
|
|
61
|
+
continue;
|
|
62
|
+
const ms = overlap(root.startTime, rootEnd, b.start, b.end);
|
|
63
|
+
if (ms <= 0)
|
|
64
|
+
continue;
|
|
65
|
+
const entry = (_a = byLabel.get(b.label)) !== null && _a !== void 0 ? _a : { ms: 0, roots: new Set() };
|
|
66
|
+
entry.ms += ms;
|
|
67
|
+
entry.roots.add(roots[b.root].label);
|
|
68
|
+
byLabel.set(b.label, entry);
|
|
69
|
+
}
|
|
70
|
+
let blockedTotal = 0;
|
|
71
|
+
byLabel.forEach(({ ms, roots: from }, label) => {
|
|
72
|
+
blockedTotal += ms;
|
|
73
|
+
if (ms < minMs)
|
|
74
|
+
return;
|
|
75
|
+
const where = [...from].slice(0, 3).join(', ') + (from.size > 3 ? ` and ${from.size - 3} more` : '');
|
|
76
|
+
findings.push({
|
|
77
|
+
kind: 'blocked',
|
|
78
|
+
root: rootLabel,
|
|
79
|
+
ms,
|
|
80
|
+
message: `${rootLabel} waited ~${fmt(ms)} (${pct(ms, root.duration)} of its ${fmt(root.duration)}) while ${label} in ${where} blocked the event loop`,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
// 2. Blocking code inside this call
|
|
84
|
+
for (const b of blockers) {
|
|
85
|
+
if (b.root !== i)
|
|
86
|
+
continue;
|
|
87
|
+
const ms = b.end - b.start;
|
|
88
|
+
if (ms < minMs)
|
|
89
|
+
continue;
|
|
90
|
+
findings.push({
|
|
91
|
+
kind: 'blocking',
|
|
92
|
+
root: rootLabel,
|
|
93
|
+
ms,
|
|
94
|
+
message: `${b.label} ran ${fmt(ms)} of synchronous code, blocking everything else in the process for that long`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
walk(root, node => {
|
|
98
|
+
var _a;
|
|
99
|
+
const kids = node.children;
|
|
100
|
+
if (kids.length === 0)
|
|
101
|
+
return;
|
|
102
|
+
// 3. Awaited one after another although they could overlap
|
|
103
|
+
const asyncKids = kids.filter(k => k.async && k.duration >= 1).sort((a, b) => a.startTime - b.startTime);
|
|
104
|
+
let run = [];
|
|
105
|
+
const flush = () => {
|
|
106
|
+
if (run.length >= 2) {
|
|
107
|
+
const total = run.reduce((s, k) => s + k.duration, 0);
|
|
108
|
+
const saving = total - Math.max(...run.map(k => k.duration));
|
|
109
|
+
if (saving >= minMs) {
|
|
110
|
+
const names = run.map(k => k.label);
|
|
111
|
+
const shown = names.length > 4 ? `${names.slice(0, 4).join(', ')}, ...` : names.join(', ');
|
|
112
|
+
findings.push({
|
|
113
|
+
kind: 'sequential',
|
|
114
|
+
root: rootLabel,
|
|
115
|
+
ms: saving,
|
|
116
|
+
message: `${node.label} awaited ${run.length} calls one after another (${shown}: ${fmt(total)}); if they are independent, Promise.all could save up to ~${fmt(saving)}`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
run = [];
|
|
121
|
+
};
|
|
122
|
+
for (const k of asyncKids) {
|
|
123
|
+
const prev = run[run.length - 1];
|
|
124
|
+
// "One after another": starts after the previous one ended (small gap allowed)
|
|
125
|
+
if (prev && k.startTime >= prev.startTime + prev.duration - 0.05)
|
|
126
|
+
run.push(k);
|
|
127
|
+
else {
|
|
128
|
+
flush();
|
|
129
|
+
run = [k];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
flush();
|
|
133
|
+
// 4. Same call repeated many times (N+1 queries)
|
|
134
|
+
const counts = new Map();
|
|
135
|
+
for (const k of kids) {
|
|
136
|
+
const c = (_a = counts.get(k.label)) !== null && _a !== void 0 ? _a : { n: 0, ms: 0 };
|
|
137
|
+
c.n++;
|
|
138
|
+
c.ms += k.duration;
|
|
139
|
+
counts.set(k.label, c);
|
|
140
|
+
}
|
|
141
|
+
counts.forEach(({ n, ms }, label) => {
|
|
142
|
+
if (n >= repeatCount && ms >= minMs) {
|
|
143
|
+
findings.push({
|
|
144
|
+
kind: 'repeated',
|
|
145
|
+
root: rootLabel,
|
|
146
|
+
ms,
|
|
147
|
+
message: `${node.label} called ${label} ${n} times (${fmt(ms)} total); batching them into one call may help (N+1 pattern)`,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
// 5. One child dominates the top-level call
|
|
153
|
+
for (const k of root.children) {
|
|
154
|
+
if (k.duration >= minMs && k.duration >= dominantShare * root.duration) {
|
|
155
|
+
const waited = blockers
|
|
156
|
+
.filter(b => b.root !== i)
|
|
157
|
+
.reduce((sum, b) => sum + overlap(k.startTime, k.startTime + k.duration, b.start, b.end), 0);
|
|
158
|
+
const note = waited >= minMs && waited >= 0.3 * k.duration
|
|
159
|
+
? `, but ~${fmt(waited)} of that was waiting for blocking code elsewhere`
|
|
160
|
+
: '';
|
|
161
|
+
findings.push({
|
|
162
|
+
kind: 'dominant',
|
|
163
|
+
root: rootLabel,
|
|
164
|
+
ms: k.duration - waited,
|
|
165
|
+
message: `${k.label} took ${pct(k.duration, root.duration)} of ${rootLabel} (${fmt(k.duration)} of ${fmt(root.duration)})${note}`,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Large own time not explained by children or blocking
|
|
170
|
+
const own = root.selfDuration - blockedTotal;
|
|
171
|
+
if (root.children.length > 0 && own >= minMs && own >= dominantShare * root.duration) {
|
|
172
|
+
findings.push({
|
|
173
|
+
kind: 'dominant',
|
|
174
|
+
root: rootLabel,
|
|
175
|
+
ms: own,
|
|
176
|
+
message: `${pct(own, root.duration)} of ${rootLabel} (${fmt(own)}) is outside any tracked call; track the code inside it to see where`,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// 6. Failures
|
|
180
|
+
walk(root, node => {
|
|
181
|
+
if (node.error === undefined || node.error === null)
|
|
182
|
+
return;
|
|
183
|
+
// Report each error once, at the deepest record that has it
|
|
184
|
+
if (node.children.some(c => c.error !== undefined && c.error !== null))
|
|
185
|
+
return;
|
|
186
|
+
const msg = node.error instanceof Error ? node.error.message : String(node.error);
|
|
187
|
+
findings.push({
|
|
188
|
+
kind: 'error',
|
|
189
|
+
root: rootLabel,
|
|
190
|
+
ms: node.duration,
|
|
191
|
+
message: `${node === root ? node.label : `${node.label} in ${rootLabel}`} failed after ${fmt(node.duration)}: ${msg}`,
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
// Same finding for many identical roots (e.g. 1000 requests): keep the largest, count the rest
|
|
196
|
+
// Blocking by the same function is grouped across top-level calls too
|
|
197
|
+
const grouped = new Map();
|
|
198
|
+
for (const f of findings) {
|
|
199
|
+
const scope = f.kind === 'blocking' ? '' : f.root;
|
|
200
|
+
const key = `${f.kind}|${scope}|${f.message.replace(/[0-9.]+ ?(ms|s|%)/g, '')}`;
|
|
201
|
+
const g = grouped.get(key);
|
|
202
|
+
if (!g)
|
|
203
|
+
grouped.set(key, { ...f, times: 1, roots: new Set([f.root]) });
|
|
204
|
+
else {
|
|
205
|
+
g.times++;
|
|
206
|
+
g.roots.add(f.root);
|
|
207
|
+
if (f.ms > g.ms)
|
|
208
|
+
Object.assign(g, { ms: f.ms, message: f.message });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const order = { error: 0, blocked: 1, blocking: 2, repeated: 3, sequential: 4, dominant: 5 };
|
|
212
|
+
return [...grouped.values()]
|
|
213
|
+
.sort((a, b) => b.ms * b.times - a.ms * a.times || order[a.kind] - order[b.kind])
|
|
214
|
+
.slice(0, (_e = options.max) !== null && _e !== void 0 ? _e : 20)
|
|
215
|
+
.map(({ times, roots: seenIn, ...f }) => {
|
|
216
|
+
const where = [...seenIn];
|
|
217
|
+
const label = where.length > 3 ? `${where.slice(0, 3).join(', ')} and ${where.length - 3} more` : where.join(', ');
|
|
218
|
+
if (f.kind === 'blocking') {
|
|
219
|
+
const self = where.length === 1 && where[0] === f.message.split(' ran ')[0];
|
|
220
|
+
const count = times > where.length ? `${times} times` : '';
|
|
221
|
+
const note = self ? count : [`in ${label}`, count].filter(Boolean).join(', ');
|
|
222
|
+
return { ...f, message: note ? `${f.message} (${note})` : f.message };
|
|
223
|
+
}
|
|
224
|
+
return times > 1 ? { ...f, message: `${f.message} (seen ${times} times, worst shown)` } : f;
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
const ICON = {
|
|
228
|
+
error: '✖', blocked: '⏳', blocking: '🔥', repeated: '🔁', sequential: '⇉', dominant: '●',
|
|
229
|
+
};
|
|
230
|
+
/** Render findings as text, one per line */
|
|
231
|
+
function formatFindings(findings) {
|
|
232
|
+
if (findings.length === 0)
|
|
233
|
+
return 'No issues found: nothing blocked, repeated, or ran sequentially in a way worth changing.';
|
|
234
|
+
return findings.map(f => `${ICON[f.kind]} ${f.message}`).join('\n');
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=explain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/core/explain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exporters: get traceperf data out of the process.
|
|
3
|
+
*
|
|
4
|
+
* - Chrome Trace Event / Perfetto JSON (open in chrome://tracing,
|
|
5
|
+
* https://ui.perfetto.dev or the DevTools Performance panel)
|
|
6
|
+
* - OpenTelemetry spans (bring your own @opentelemetry/api)
|
|
7
|
+
* - JSON lines
|
|
8
|
+
*/
|
|
9
|
+
import { ExecutionRecord, TracePerfPlugin } from './records';
|
|
10
|
+
/** A single Trace Event Format "complete" event */
|
|
11
|
+
export interface ChromeTraceEvent {
|
|
12
|
+
name: string;
|
|
13
|
+
cat: string;
|
|
14
|
+
ph: 'X' | 'M';
|
|
15
|
+
ts: number;
|
|
16
|
+
dur?: number;
|
|
17
|
+
pid: number;
|
|
18
|
+
tid: number;
|
|
19
|
+
args?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/** Trace Event Format document */
|
|
22
|
+
export interface ChromeTrace {
|
|
23
|
+
traceEvents: ChromeTraceEvent[];
|
|
24
|
+
displayTimeUnit: 'ms';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Convert finished execution trees to Trace Event Format.
|
|
28
|
+
*
|
|
29
|
+
* Complete ("X") events must nest strictly within a thread, so calls that
|
|
30
|
+
* overlap without nesting (concurrent async work) are placed on extra lanes.
|
|
31
|
+
*/
|
|
32
|
+
export declare function toChromeTrace(roots: ExecutionRecord[]): ChromeTrace;
|
|
33
|
+
/** Collects finished trees in memory; `stop()` returns a Chrome trace */
|
|
34
|
+
export interface TraceRecorder extends TracePerfPlugin {
|
|
35
|
+
/** Trees recorded so far */
|
|
36
|
+
readonly roots: ExecutionRecord[];
|
|
37
|
+
/** Stop recording and return the trace (also unsubscribes, when attached via startTrace) */
|
|
38
|
+
stop(): ChromeTrace;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a plugin that records finished trees for a Chrome/Perfetto trace.
|
|
42
|
+
* Keeps at most `maxRoots` top-level calls (oldest dropped first).
|
|
43
|
+
*/
|
|
44
|
+
export declare function createTraceRecorder(options?: {
|
|
45
|
+
maxRoots?: number;
|
|
46
|
+
onStop?: () => void;
|
|
47
|
+
}): TraceRecorder;
|
|
48
|
+
/**
|
|
49
|
+
* Minimal structural types for the parts of @opentelemetry/api used here,
|
|
50
|
+
* so traceperf needs no dependency on it.
|
|
51
|
+
*/
|
|
52
|
+
export interface OtelSpanLike {
|
|
53
|
+
setAttribute(key: string, value: string | number | boolean): unknown;
|
|
54
|
+
recordException(exception: unknown): unknown;
|
|
55
|
+
setStatus(status: {
|
|
56
|
+
code: number;
|
|
57
|
+
message?: string;
|
|
58
|
+
}): unknown;
|
|
59
|
+
end(endTime?: number): unknown;
|
|
60
|
+
updateName?(name: string): unknown;
|
|
61
|
+
}
|
|
62
|
+
export interface OtelTracerLike {
|
|
63
|
+
startSpan(name: string, options?: {
|
|
64
|
+
startTime?: number;
|
|
65
|
+
}, context?: unknown): OtelSpanLike;
|
|
66
|
+
}
|
|
67
|
+
export interface OtelApiLike {
|
|
68
|
+
trace: {
|
|
69
|
+
getTracer(name: string, version?: string): OtelTracerLike;
|
|
70
|
+
setSpan(context: unknown, span: OtelSpanLike): unknown;
|
|
71
|
+
};
|
|
72
|
+
context: {
|
|
73
|
+
active(): unknown;
|
|
74
|
+
/** Needed for live mode */
|
|
75
|
+
with?<R>(context: unknown, fn: () => R): R;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export interface OpenTelemetryExporterOptions {
|
|
79
|
+
/** Tracer name (default "traceperf") */
|
|
80
|
+
tracerName?: string;
|
|
81
|
+
/** Use this tracer instead of api.trace.getTracer() */
|
|
82
|
+
tracer?: OtelTracerLike;
|
|
83
|
+
/**
|
|
84
|
+
* Live mode: open each span when the call starts and make it the active
|
|
85
|
+
* OpenTelemetry context while the call runs, so spans created by other
|
|
86
|
+
* instrumentation (HTTP clients, database drivers) nest under it.
|
|
87
|
+
* Requires a context manager to be registered (as any OTel SDK setup does).
|
|
88
|
+
*/
|
|
89
|
+
live?: boolean;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Export tracked calls as OpenTelemetry spans.
|
|
93
|
+
*
|
|
94
|
+
* import * as otel from '@opentelemetry/api';
|
|
95
|
+
* tp.use(openTelemetryExporter(otel)); // spans created when the tree finishes
|
|
96
|
+
* tp.use(openTelemetryExporter(otel, { live: true })); // spans active while the call runs
|
|
97
|
+
*
|
|
98
|
+
* Default mode creates spans when the top-level call finishes, with the
|
|
99
|
+
* real start/end times, parented to the OpenTelemetry context that was
|
|
100
|
+
* active when the call started. Live mode opens each span when the call
|
|
101
|
+
* starts and makes it the active context, so other instrumentation's spans
|
|
102
|
+
* become its children.
|
|
103
|
+
*/
|
|
104
|
+
export declare function openTelemetryExporter(api: OtelApiLike, options?: OpenTelemetryExporterOptions): TracePerfPlugin;
|
|
105
|
+
/** JSON-serialisable view of a record (errors become messages) */
|
|
106
|
+
export declare function recordToJSON(record: ExecutionRecord): Record<string, unknown>;
|
|
107
|
+
/**
|
|
108
|
+
* Write one JSON line per finished top-level call (the whole tree).
|
|
109
|
+
* Defaults to stdout in Node and console.log elsewhere.
|
|
110
|
+
*/
|
|
111
|
+
export declare function jsonLinesExporter(write?: (line: string) => void): TracePerfPlugin;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toChromeTrace = toChromeTrace;
|
|
4
|
+
exports.createTraceRecorder = createTraceRecorder;
|
|
5
|
+
exports.openTelemetryExporter = openTelemetryExporter;
|
|
6
|
+
exports.recordToJSON = recordToJSON;
|
|
7
|
+
exports.jsonLinesExporter = jsonLinesExporter;
|
|
8
|
+
/**
|
|
9
|
+
* Exporters: get traceperf data out of the process.
|
|
10
|
+
*
|
|
11
|
+
* - Chrome Trace Event / Perfetto JSON (open in chrome://tracing,
|
|
12
|
+
* https://ui.perfetto.dev or the DevTools Performance panel)
|
|
13
|
+
* - OpenTelemetry spans (bring your own @opentelemetry/api)
|
|
14
|
+
* - JSON lines
|
|
15
|
+
*/
|
|
16
|
+
const records_1 = require("./records");
|
|
17
|
+
/**
|
|
18
|
+
* Convert finished execution trees to Trace Event Format.
|
|
19
|
+
*
|
|
20
|
+
* Complete ("X") events must nest strictly within a thread, so calls that
|
|
21
|
+
* overlap without nesting (concurrent async work) are placed on extra lanes.
|
|
22
|
+
*/
|
|
23
|
+
function toChromeTrace(roots) {
|
|
24
|
+
const events = [];
|
|
25
|
+
// For each lane, the stack of end times of open events
|
|
26
|
+
const lanes = [];
|
|
27
|
+
const fits = (lane, start, end) => {
|
|
28
|
+
while (lane.length > 0 && lane[lane.length - 1] <= start)
|
|
29
|
+
lane.pop();
|
|
30
|
+
return lane.length === 0 || end <= lane[lane.length - 1];
|
|
31
|
+
};
|
|
32
|
+
const place = (record, preferred) => {
|
|
33
|
+
const candidates = [preferred, ...lanes.map((_, i) => i).filter(i => i !== preferred)];
|
|
34
|
+
for (const i of candidates) {
|
|
35
|
+
if (lanes[i] && fits(lanes[i], record.startTime, record.endTime)) {
|
|
36
|
+
lanes[i].push(record.endTime);
|
|
37
|
+
return i;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
lanes.push([record.endTime]);
|
|
41
|
+
return lanes.length - 1;
|
|
42
|
+
};
|
|
43
|
+
const all = [];
|
|
44
|
+
const sortedRoots = roots.slice().sort((a, b) => a.startTime - b.startTime);
|
|
45
|
+
const visit = (record, parentLane) => {
|
|
46
|
+
all.push({ record, parentLane });
|
|
47
|
+
};
|
|
48
|
+
sortedRoots.forEach(root => (0, records_1.walkRecords)(root, r => visit(r, 0)));
|
|
49
|
+
// Events must be placed in start order (parents before children on ties)
|
|
50
|
+
all.sort((a, b) => a.record.startTime - b.record.startTime || b.record.duration - a.record.duration);
|
|
51
|
+
const laneOf = new Map();
|
|
52
|
+
for (const { record } of all) {
|
|
53
|
+
const preferred = record.parentId !== null && laneOf.has(record.parentId) ? laneOf.get(record.parentId) : 0;
|
|
54
|
+
const lane = place(record, preferred);
|
|
55
|
+
laneOf.set(record.id, lane);
|
|
56
|
+
const args = { selfMs: record.selfDuration, syncMs: record.syncDuration };
|
|
57
|
+
if (record.memoryDelta !== undefined)
|
|
58
|
+
args.memoryDeltaBytes = record.memoryDelta;
|
|
59
|
+
if (record.args && record.args.length)
|
|
60
|
+
args.args = record.args;
|
|
61
|
+
if (record.error !== undefined && record.error !== null) {
|
|
62
|
+
args.error = record.error instanceof Error ? record.error.message : String(record.error);
|
|
63
|
+
}
|
|
64
|
+
events.push({
|
|
65
|
+
name: record.label,
|
|
66
|
+
cat: 'traceperf',
|
|
67
|
+
ph: 'X',
|
|
68
|
+
ts: Math.round(record.startTime * 1000),
|
|
69
|
+
dur: Math.max(0, Math.round(record.duration * 1000)),
|
|
70
|
+
pid: 1,
|
|
71
|
+
tid: lane + 1,
|
|
72
|
+
args,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const meta = [
|
|
76
|
+
{ name: 'process_name', cat: '__metadata', ph: 'M', ts: 0, pid: 1, tid: 0, args: { name: 'traceperf' } },
|
|
77
|
+
...lanes.map((_, i) => ({
|
|
78
|
+
name: 'thread_name', cat: '__metadata', ph: 'M', ts: 0, pid: 1, tid: i + 1,
|
|
79
|
+
args: { name: i === 0 ? 'main' : `concurrent ${i}` },
|
|
80
|
+
})),
|
|
81
|
+
];
|
|
82
|
+
return { traceEvents: [...meta, ...events], displayTimeUnit: 'ms' };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Create a plugin that records finished trees for a Chrome/Perfetto trace.
|
|
86
|
+
* Keeps at most `maxRoots` top-level calls (oldest dropped first).
|
|
87
|
+
*/
|
|
88
|
+
function createTraceRecorder(options = {}) {
|
|
89
|
+
var _a;
|
|
90
|
+
const maxRoots = Math.max(1, (_a = options.maxRoots) !== null && _a !== void 0 ? _a : 10000);
|
|
91
|
+
const roots = [];
|
|
92
|
+
let stopped = false;
|
|
93
|
+
return {
|
|
94
|
+
name: 'chrome-trace',
|
|
95
|
+
roots,
|
|
96
|
+
onComplete(root) {
|
|
97
|
+
if (stopped)
|
|
98
|
+
return;
|
|
99
|
+
roots.push(root);
|
|
100
|
+
if (roots.length > maxRoots)
|
|
101
|
+
roots.shift();
|
|
102
|
+
},
|
|
103
|
+
stop() {
|
|
104
|
+
if (!stopped) {
|
|
105
|
+
stopped = true;
|
|
106
|
+
if (options.onStop)
|
|
107
|
+
options.onStop();
|
|
108
|
+
}
|
|
109
|
+
return toChromeTrace(roots);
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/** OpenTelemetry status code for errors (SpanStatusCode.ERROR) */
|
|
114
|
+
const OTEL_STATUS_ERROR = 2;
|
|
115
|
+
function decorateSpan(span, record) {
|
|
116
|
+
span.setAttribute('traceperf.self_ms', record.selfDuration);
|
|
117
|
+
span.setAttribute('traceperf.sync_ms', record.syncDuration);
|
|
118
|
+
span.setAttribute('traceperf.async', record.async);
|
|
119
|
+
if (record.memoryDelta !== undefined)
|
|
120
|
+
span.setAttribute('traceperf.memory_delta_bytes', record.memoryDelta);
|
|
121
|
+
if (record.args && record.args.length)
|
|
122
|
+
span.setAttribute('traceperf.args', record.args.join(', '));
|
|
123
|
+
if (record.error !== undefined && record.error !== null) {
|
|
124
|
+
span.recordException(record.error);
|
|
125
|
+
span.setStatus({
|
|
126
|
+
code: OTEL_STATUS_ERROR,
|
|
127
|
+
message: record.error instanceof Error ? record.error.message : String(record.error),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Export tracked calls as OpenTelemetry spans.
|
|
133
|
+
*
|
|
134
|
+
* import * as otel from '@opentelemetry/api';
|
|
135
|
+
* tp.use(openTelemetryExporter(otel)); // spans created when the tree finishes
|
|
136
|
+
* tp.use(openTelemetryExporter(otel, { live: true })); // spans active while the call runs
|
|
137
|
+
*
|
|
138
|
+
* Default mode creates spans when the top-level call finishes, with the
|
|
139
|
+
* real start/end times, parented to the OpenTelemetry context that was
|
|
140
|
+
* active when the call started. Live mode opens each span when the call
|
|
141
|
+
* starts and makes it the active context, so other instrumentation's spans
|
|
142
|
+
* become its children.
|
|
143
|
+
*/
|
|
144
|
+
function openTelemetryExporter(api, options = {}) {
|
|
145
|
+
var _a, _b;
|
|
146
|
+
const tracer = (_a = options.tracer) !== null && _a !== void 0 ? _a : api.trace.getTracer((_b = options.tracerName) !== null && _b !== void 0 ? _b : 'traceperf');
|
|
147
|
+
if (options.live) {
|
|
148
|
+
if (typeof api.context.with !== 'function') {
|
|
149
|
+
throw new Error('openTelemetryExporter: live mode needs api.context.with (pass @opentelemetry/api)');
|
|
150
|
+
}
|
|
151
|
+
const spans = new Map();
|
|
152
|
+
return {
|
|
153
|
+
name: 'opentelemetry-live',
|
|
154
|
+
onStart(execution) {
|
|
155
|
+
// Inside a tracked parent, wrap() has made the parent span active
|
|
156
|
+
spans.set(execution.id, tracer.startSpan(execution.label, { startTime: execution.startEpochMs }, api.context.active()));
|
|
157
|
+
},
|
|
158
|
+
wrap(execution, run) {
|
|
159
|
+
const span = spans.get(execution.id);
|
|
160
|
+
if (!span)
|
|
161
|
+
return run();
|
|
162
|
+
return api.context.with(api.trace.setSpan(api.context.active(), span), run);
|
|
163
|
+
},
|
|
164
|
+
onComplete(root) {
|
|
165
|
+
(0, records_1.walkRecords)(root, record => {
|
|
166
|
+
const span = spans.get(record.id);
|
|
167
|
+
if (!span)
|
|
168
|
+
return;
|
|
169
|
+
spans.delete(record.id);
|
|
170
|
+
if (span.updateName)
|
|
171
|
+
span.updateName(record.label);
|
|
172
|
+
decorateSpan(span, record);
|
|
173
|
+
span.end(record.startEpochMs + record.duration);
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const startContexts = new Map();
|
|
179
|
+
return {
|
|
180
|
+
name: 'opentelemetry',
|
|
181
|
+
onStart(execution) {
|
|
182
|
+
if (execution.parentId === null)
|
|
183
|
+
startContexts.set(execution.id, api.context.active());
|
|
184
|
+
},
|
|
185
|
+
onComplete(root) {
|
|
186
|
+
var _a;
|
|
187
|
+
const parentContext = (_a = startContexts.get(root.id)) !== null && _a !== void 0 ? _a : api.context.active();
|
|
188
|
+
startContexts.delete(root.id);
|
|
189
|
+
const emit = (record, ctx) => {
|
|
190
|
+
const span = tracer.startSpan(record.label, { startTime: record.startEpochMs }, ctx);
|
|
191
|
+
decorateSpan(span, record);
|
|
192
|
+
const childCtx = api.trace.setSpan(ctx, span);
|
|
193
|
+
record.children.forEach(child => emit(child, childCtx));
|
|
194
|
+
span.end(record.startEpochMs + record.duration);
|
|
195
|
+
};
|
|
196
|
+
emit(root, parentContext);
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/** JSON-serialisable view of a record (errors become messages) */
|
|
201
|
+
function recordToJSON(record) {
|
|
202
|
+
return {
|
|
203
|
+
label: record.label,
|
|
204
|
+
start: new Date(record.startEpochMs).toISOString(),
|
|
205
|
+
durationMs: record.duration,
|
|
206
|
+
selfMs: record.selfDuration,
|
|
207
|
+
syncMs: record.syncDuration,
|
|
208
|
+
async: record.async,
|
|
209
|
+
...(record.memoryDelta !== undefined ? { memoryDeltaBytes: record.memoryDelta } : {}),
|
|
210
|
+
...(record.args && record.args.length ? { args: record.args } : {}),
|
|
211
|
+
...(record.error !== undefined && record.error !== null
|
|
212
|
+
? { error: record.error instanceof Error ? record.error.message : String(record.error) }
|
|
213
|
+
: {}),
|
|
214
|
+
children: record.children.map(recordToJSON),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Write one JSON line per finished top-level call (the whole tree).
|
|
219
|
+
* Defaults to stdout in Node and console.log elsewhere.
|
|
220
|
+
*/
|
|
221
|
+
function jsonLinesExporter(write) {
|
|
222
|
+
const out = write !== null && write !== void 0 ? write : ((line) => {
|
|
223
|
+
const proc = typeof process !== 'undefined' ? process : undefined;
|
|
224
|
+
if (proc && proc.stdout && typeof proc.stdout.write === 'function')
|
|
225
|
+
proc.stdout.write(line + '\n');
|
|
226
|
+
else
|
|
227
|
+
console.log(line);
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
name: 'json-lines',
|
|
231
|
+
onComplete(root) {
|
|
232
|
+
out(JSON.stringify(recordToJSON(root)));
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=exporters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exporters.js","sourceRoot":"","sources":["../../src/core/exporters.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
export * from './config';
|
|
2
|
-
export * from './constants';
|
|
3
|
-
export * from './logger';
|
|
4
1
|
export * from './optimized-performance-monitor';
|
|
2
|
+
export * from './records';
|
|
3
|
+
export * from './stats';
|
|
4
|
+
export * from './exporters';
|
|
5
|
+
export * from './event-loop';
|
|
6
|
+
export * from './timeline';
|
|
7
|
+
export * from './prometheus';
|
|
8
|
+
export * from './allocations';
|
|
9
|
+
export * from './explain';
|
|
10
|
+
export * from './cpu-profile';
|
package/dist/core/index.js
CHANGED
|
@@ -14,8 +14,14 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./config"), exports);
|
|
18
|
-
__exportStar(require("./constants"), exports);
|
|
19
|
-
__exportStar(require("./logger"), exports);
|
|
20
17
|
__exportStar(require("./optimized-performance-monitor"), exports);
|
|
18
|
+
__exportStar(require("./records"), exports);
|
|
19
|
+
__exportStar(require("./stats"), exports);
|
|
20
|
+
__exportStar(require("./exporters"), exports);
|
|
21
|
+
__exportStar(require("./event-loop"), exports);
|
|
22
|
+
__exportStar(require("./timeline"), exports);
|
|
23
|
+
__exportStar(require("./prometheus"), exports);
|
|
24
|
+
__exportStar(require("./allocations"), exports);
|
|
25
|
+
__exportStar(require("./explain"), exports);
|
|
26
|
+
__exportStar(require("./cpu-profile"), exports);
|
|
21
27
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kEAAgD;AAChD,4CAA0B;AAC1B,0CAAwB;AACxB,8CAA4B;AAC5B,+CAA6B;AAC7B,6CAA2B;AAC3B,+CAA6B;AAC7B,gDAA8B;AAC9B,4CAA0B;AAC1B,gDAA8B"}
|