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