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