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,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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
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 './config';
2
- export * from './logger';
1
+ export * from './options.js';
2
+ import type { TracePerfConfig } from './options.js';
3
3
  /**
4
- * Interface for TracePerf configuration
4
+ * @deprecated Use `TracePerfConfig`.
5
5
  */
6
- export interface ITracePerfConfig {
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;
@@ -1,3 +1,2 @@
1
- export * from './config';
2
- export * from './logger';
1
+ export * from './options.js';
3
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=options.js.map
@@ -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?: Partial<ITracePerfConfig>): OptimizedPerformanceMonitor;
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
- const typesExports = __importStar(require("./types"));
46
- // Create singleton instance
47
- const tracePerf = new optimized_performance_monitor_1.OptimizedPerformanceMonitor();
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
- // Add CommonJS compatibility
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