apitally 0.18.1 → 0.19.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 (179) hide show
  1. package/dist/adonisjs/configure.cjs +2 -2
  2. package/dist/adonisjs/configure.cjs.map +1 -1
  3. package/dist/adonisjs/configure.js.map +1 -1
  4. package/dist/adonisjs/index.cjs +2 -2
  5. package/dist/adonisjs/index.cjs.map +1 -1
  6. package/dist/adonisjs/index.d.cts +2 -2
  7. package/dist/adonisjs/index.d.ts +2 -2
  8. package/dist/adonisjs/index.js.map +1 -1
  9. package/dist/adonisjs/middleware.cjs +104 -84
  10. package/dist/adonisjs/middleware.cjs.map +1 -1
  11. package/dist/adonisjs/middleware.d.cts +2 -2
  12. package/dist/adonisjs/middleware.d.ts +2 -2
  13. package/dist/adonisjs/middleware.js +103 -83
  14. package/dist/adonisjs/middleware.js.map +1 -1
  15. package/dist/adonisjs/provider.cjs +4750 -60
  16. package/dist/adonisjs/provider.cjs.map +1 -1
  17. package/dist/adonisjs/provider.d.cts +7 -4
  18. package/dist/adonisjs/provider.d.ts +7 -4
  19. package/dist/adonisjs/provider.js +4728 -15
  20. package/dist/adonisjs/provider.js.map +1 -1
  21. package/dist/common/client.cjs +62 -40
  22. package/dist/common/client.cjs.map +1 -1
  23. package/dist/common/client.d.cts +2 -2
  24. package/dist/common/client.d.ts +2 -2
  25. package/dist/common/client.js +31 -9
  26. package/dist/common/client.js.map +1 -1
  27. package/dist/common/consumerRegistry.d.cts +2 -2
  28. package/dist/common/consumerRegistry.d.ts +2 -2
  29. package/dist/common/headers.cjs.map +1 -1
  30. package/dist/common/headers.d.cts +1 -1
  31. package/dist/common/headers.d.ts +1 -1
  32. package/dist/common/headers.js.map +1 -1
  33. package/dist/common/logging.cjs +3 -2
  34. package/dist/common/logging.cjs.map +1 -1
  35. package/dist/common/logging.d.cts +1 -1
  36. package/dist/common/logging.d.ts +1 -1
  37. package/dist/common/logging.js +3 -2
  38. package/dist/common/logging.js.map +1 -1
  39. package/dist/common/packageVersions.cjs +2 -2
  40. package/dist/common/packageVersions.cjs.map +1 -1
  41. package/dist/common/packageVersions.js.map +1 -1
  42. package/dist/common/requestCounter.d.cts +2 -2
  43. package/dist/common/requestCounter.d.ts +2 -2
  44. package/dist/common/requestLogger.cjs +54 -33
  45. package/dist/common/requestLogger.cjs.map +1 -1
  46. package/dist/common/requestLogger.d.cts +11 -4
  47. package/dist/common/requestLogger.d.ts +11 -4
  48. package/dist/common/requestLogger.js +27 -6
  49. package/dist/common/requestLogger.js.map +1 -1
  50. package/dist/common/serverErrorCounter.cjs +3 -2
  51. package/dist/common/serverErrorCounter.cjs.map +1 -1
  52. package/dist/common/serverErrorCounter.d.cts +2 -2
  53. package/dist/common/serverErrorCounter.d.ts +2 -2
  54. package/dist/common/serverErrorCounter.js +1 -0
  55. package/dist/common/serverErrorCounter.js.map +1 -1
  56. package/dist/common/tempGzipFile.cjs +15 -14
  57. package/dist/common/tempGzipFile.cjs.map +1 -1
  58. package/dist/common/tempGzipFile.d.cts +1 -1
  59. package/dist/common/tempGzipFile.d.ts +1 -1
  60. package/dist/common/tempGzipFile.js +3 -2
  61. package/dist/common/tempGzipFile.js.map +1 -1
  62. package/dist/common/types.d.cts +2 -2
  63. package/dist/common/types.d.ts +2 -2
  64. package/dist/common/validationErrorCounter.cjs +2 -2
  65. package/dist/common/validationErrorCounter.cjs.map +1 -1
  66. package/dist/common/validationErrorCounter.d.cts +2 -2
  67. package/dist/common/validationErrorCounter.d.ts +2 -2
  68. package/dist/common/validationErrorCounter.js.map +1 -1
  69. package/dist/express/index.cjs +4979 -167
  70. package/dist/express/index.cjs.map +1 -1
  71. package/dist/express/index.d.cts +2 -2
  72. package/dist/express/index.d.ts +2 -2
  73. package/dist/express/index.js +4951 -118
  74. package/dist/express/index.js.map +1 -1
  75. package/dist/express/middleware.cjs +4979 -167
  76. package/dist/express/middleware.cjs.map +1 -1
  77. package/dist/express/middleware.d.cts +2 -2
  78. package/dist/express/middleware.d.ts +2 -2
  79. package/dist/express/middleware.js +4951 -118
  80. package/dist/express/middleware.js.map +1 -1
  81. package/dist/fastify/index.cjs +4908 -70
  82. package/dist/fastify/index.cjs.map +1 -1
  83. package/dist/fastify/index.d.cts +3 -2
  84. package/dist/fastify/index.d.ts +3 -2
  85. package/dist/fastify/index.js +4881 -22
  86. package/dist/fastify/index.js.map +1 -1
  87. package/dist/fastify/plugin.cjs +4908 -70
  88. package/dist/fastify/plugin.cjs.map +1 -1
  89. package/dist/fastify/plugin.d.cts +8 -3
  90. package/dist/fastify/plugin.d.ts +8 -3
  91. package/dist/fastify/plugin.js +4881 -22
  92. package/dist/fastify/plugin.js.map +1 -1
  93. package/dist/h3/index.cjs +219 -50
  94. package/dist/h3/index.cjs.map +1 -1
  95. package/dist/h3/index.d.cts +2 -2
  96. package/dist/h3/index.d.ts +2 -2
  97. package/dist/h3/index.js +184 -15
  98. package/dist/h3/index.js.map +1 -1
  99. package/dist/h3/plugin.cjs +219 -50
  100. package/dist/h3/plugin.cjs.map +1 -1
  101. package/dist/h3/plugin.d.cts +6 -4
  102. package/dist/h3/plugin.d.ts +6 -4
  103. package/dist/h3/plugin.js +184 -15
  104. package/dist/h3/plugin.js.map +1 -1
  105. package/dist/h3/utils.cjs +2 -2
  106. package/dist/h3/utils.cjs.map +1 -1
  107. package/dist/h3/utils.js.map +1 -1
  108. package/dist/hono/index.cjs +278 -110
  109. package/dist/hono/index.cjs.map +1 -1
  110. package/dist/hono/index.d.cts +2 -2
  111. package/dist/hono/index.d.ts +2 -2
  112. package/dist/hono/index.js +244 -76
  113. package/dist/hono/index.js.map +1 -1
  114. package/dist/hono/middleware.cjs +278 -110
  115. package/dist/hono/middleware.cjs.map +1 -1
  116. package/dist/hono/middleware.d.cts +2 -2
  117. package/dist/hono/middleware.d.ts +2 -2
  118. package/dist/hono/middleware.js +244 -76
  119. package/dist/hono/middleware.js.map +1 -1
  120. package/dist/hono/utils.cjs +2 -2
  121. package/dist/hono/utils.cjs.map +1 -1
  122. package/dist/hono/utils.d.cts +2 -2
  123. package/dist/hono/utils.d.ts +2 -2
  124. package/dist/hono/utils.js.map +1 -1
  125. package/dist/koa/index.cjs +275 -105
  126. package/dist/koa/index.cjs.map +1 -1
  127. package/dist/koa/index.d.cts +2 -2
  128. package/dist/koa/index.d.ts +2 -2
  129. package/dist/koa/index.js +239 -69
  130. package/dist/koa/index.js.map +1 -1
  131. package/dist/koa/middleware.cjs +273 -105
  132. package/dist/koa/middleware.cjs.map +1 -1
  133. package/dist/koa/middleware.d.cts +2 -2
  134. package/dist/koa/middleware.d.ts +2 -2
  135. package/dist/koa/middleware.js +239 -69
  136. package/dist/koa/middleware.js.map +1 -1
  137. package/dist/loggers/console.cjs +69 -0
  138. package/dist/loggers/console.cjs.map +1 -0
  139. package/dist/loggers/console.d.cts +9 -0
  140. package/dist/loggers/console.d.ts +9 -0
  141. package/dist/loggers/console.js +46 -0
  142. package/dist/loggers/console.js.map +1 -0
  143. package/dist/loggers/index.cjs +4824 -0
  144. package/dist/loggers/index.cjs.map +1 -0
  145. package/dist/loggers/index.d.cts +9 -0
  146. package/dist/loggers/index.d.ts +9 -0
  147. package/dist/loggers/index.js +4813 -0
  148. package/dist/loggers/index.js.map +1 -0
  149. package/dist/loggers/nestjs.cjs +135 -0
  150. package/dist/loggers/nestjs.cjs.map +1 -0
  151. package/dist/loggers/nestjs.d.cts +9 -0
  152. package/dist/loggers/nestjs.d.ts +9 -0
  153. package/dist/loggers/nestjs.js +100 -0
  154. package/dist/loggers/nestjs.js.map +1 -0
  155. package/dist/loggers/pino.cjs +4656 -0
  156. package/dist/loggers/pino.cjs.map +1 -0
  157. package/dist/loggers/pino.d.cts +9 -0
  158. package/dist/loggers/pino.d.ts +9 -0
  159. package/dist/loggers/pino.js +4648 -0
  160. package/dist/loggers/pino.js.map +1 -0
  161. package/dist/loggers/utils.cjs +66 -0
  162. package/dist/loggers/utils.cjs.map +1 -0
  163. package/dist/loggers/utils.d.cts +6 -0
  164. package/dist/loggers/utils.d.ts +6 -0
  165. package/dist/loggers/utils.js +42 -0
  166. package/dist/loggers/utils.js.map +1 -0
  167. package/dist/loggers/winston.cjs +135 -0
  168. package/dist/loggers/winston.cjs.map +1 -0
  169. package/dist/loggers/winston.d.cts +9 -0
  170. package/dist/loggers/winston.d.ts +9 -0
  171. package/dist/loggers/winston.js +100 -0
  172. package/dist/loggers/winston.js.map +1 -0
  173. package/dist/nestjs/index.cjs +5340 -450
  174. package/dist/nestjs/index.cjs.map +1 -1
  175. package/dist/nestjs/index.d.cts +2 -2
  176. package/dist/nestjs/index.d.ts +2 -2
  177. package/dist/nestjs/index.js +5293 -405
  178. package/dist/nestjs/index.js.map +1 -1
  179. package/package.json +4 -3
package/dist/h3/plugin.js CHANGED
@@ -11,11 +11,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
11
11
 
12
12
  // src/h3/plugin.ts
13
13
  import { definePlugin, onError, onRequest, onResponse } from "h3";
14
+ import { AsyncLocalStorage } from "async_hooks";
14
15
  import { performance } from "perf_hooks";
15
16
 
16
17
  // src/common/client.ts
17
- import { randomUUID as randomUUID3 } from "crypto";
18
18
  import fetchRetry from "fetch-retry";
19
+ import { randomUUID as randomUUID3 } from "crypto";
19
20
 
20
21
  // src/common/consumerRegistry.ts
21
22
  var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
@@ -75,7 +76,7 @@ var ConsumerRegistry = _ConsumerRegistry;
75
76
 
76
77
  // src/common/logging.ts
77
78
  import { createLogger, format, transports } from "winston";
78
- var getLogger = /* @__PURE__ */ __name(() => {
79
+ function getLogger() {
79
80
  return createLogger({
80
81
  level: process.env.APITALLY_DEBUG ? "debug" : "warn",
81
82
  format: format.combine(format.colorize(), format.timestamp(), format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
@@ -83,7 +84,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
83
84
  new transports.Console()
84
85
  ]
85
86
  });
86
- }, "getLogger");
87
+ }
88
+ __name(getLogger, "getLogger");
87
89
 
88
90
  // src/common/paramValidation.ts
89
91
  function isValidClientId(clientId) {
@@ -187,7 +189,7 @@ var RequestCounter = _RequestCounter;
187
189
  import AsyncLock from "async-lock";
188
190
  import { Buffer as Buffer3 } from "buffer";
189
191
  import { randomUUID as randomUUID2 } from "crypto";
190
- import { unlinkSync as unlinkSync2, writeFileSync } from "fs";
192
+ import { unlinkSync, writeFileSync } from "fs";
191
193
  import { tmpdir as tmpdir2 } from "os";
192
194
  import { join as join2 } from "path";
193
195
 
@@ -250,6 +252,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
250
252
  });
251
253
  this.errorCounts.clear();
252
254
  this.errorDetails.clear();
255
+ this.sentryEventIds.clear();
253
256
  return data;
254
257
  }
255
258
  getKey(serverError) {
@@ -296,7 +299,8 @@ __name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
296
299
  // src/common/tempGzipFile.ts
297
300
  import { Buffer as Buffer2 } from "buffer";
298
301
  import { randomUUID } from "crypto";
299
- import { createWriteStream, readFile, unlinkSync } from "fs";
302
+ import { createWriteStream, readFile } from "fs";
303
+ import { unlink } from "fs/promises";
300
304
  import { tmpdir } from "os";
301
305
  import { join } from "path";
302
306
  import { createGzip } from "zlib";
@@ -361,7 +365,7 @@ var _TempGzipFile = class _TempGzipFile {
361
365
  }
362
366
  async delete() {
363
367
  await this.close();
364
- unlinkSync(this.filePath);
368
+ await unlink(this.filePath);
365
369
  }
366
370
  };
367
371
  __name(_TempGzipFile, "TempGzipFile");
@@ -372,6 +376,7 @@ var MAX_BODY_SIZE = 5e4;
372
376
  var MAX_FILE_SIZE = 1e6;
373
377
  var MAX_FILES = 50;
374
378
  var MAX_PENDING_WRITES = 100;
379
+ var MAX_LOG_MSG_LENGTH = 2048;
375
380
  var BODY_TOO_LARGE = Buffer3.from("<body too large>");
376
381
  var BODY_MASKED = Buffer3.from("<masked>");
377
382
  var MASKED = "******";
@@ -428,6 +433,7 @@ var DEFAULT_CONFIG = {
428
433
  logResponseHeaders: true,
429
434
  logResponseBody: false,
430
435
  logException: true,
436
+ captureLogs: false,
431
437
  maskQueryParams: [],
432
438
  maskHeaders: [],
433
439
  maskBodyFields: [],
@@ -582,7 +588,7 @@ var _RequestLogger = class _RequestLogger {
582
588
  item.request.url = url.toString();
583
589
  return item;
584
590
  }
585
- logRequest(request, response, error) {
591
+ logRequest(request, response, error, logs) {
586
592
  var _a2, _b, _c;
587
593
  if (!this.enabled || this.suspendUntil !== null) return;
588
594
  const url = new URL(request.url);
@@ -614,6 +620,14 @@ var _RequestLogger = class _RequestLogger {
614
620
  sentryEventId: getSentryEventId()
615
621
  } : void 0
616
622
  };
623
+ if (logs && logs.length > 0) {
624
+ item.logs = logs.map((log) => ({
625
+ timestamp: log.timestamp,
626
+ logger: log.logger,
627
+ level: log.level,
628
+ message: truncateLogMessage(log.message)
629
+ }));
630
+ }
617
631
  this.pendingWrites.push(item);
618
632
  if (this.pendingWrites.length > MAX_PENDING_WRITES) {
619
633
  this.pendingWrites.shift();
@@ -635,7 +649,8 @@ var _RequestLogger = class _RequestLogger {
635
649
  uuid: item.uuid,
636
650
  request: skipEmptyValues(item.request),
637
651
  response: skipEmptyValues(item.response),
638
- exception: item.exception
652
+ exception: item.exception,
653
+ logs: item.logs
639
654
  };
640
655
  [
641
656
  finalItem.request.body,
@@ -737,11 +752,19 @@ function skipEmptyValues(data) {
737
752
  }));
738
753
  }
739
754
  __name(skipEmptyValues, "skipEmptyValues");
755
+ function truncateLogMessage(msg) {
756
+ if (msg.length > MAX_LOG_MSG_LENGTH) {
757
+ const suffix = "... (truncated)";
758
+ return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
759
+ }
760
+ return msg;
761
+ }
762
+ __name(truncateLogMessage, "truncateLogMessage");
740
763
  function checkWritableFs() {
741
764
  try {
742
765
  const testPath = join2(tmpdir2(), `apitally-${randomUUID2()}`);
743
766
  writeFileSync(testPath, "test");
744
- unlinkSync2(testPath);
767
+ unlinkSync(testPath);
745
768
  return true;
746
769
  } catch (error) {
747
770
  return false;
@@ -1156,6 +1179,143 @@ async function teeResponse(response) {
1156
1179
  }
1157
1180
  __name(teeResponse, "teeResponse");
1158
1181
 
1182
+ // src/loggers/console.ts
1183
+ import { format as format2 } from "util";
1184
+ var MAX_BUFFER_SIZE = 1e3;
1185
+ var isPatched = false;
1186
+ var globalLogsContext;
1187
+ function patchConsole(logsContext) {
1188
+ globalLogsContext = logsContext;
1189
+ if (isPatched) {
1190
+ return;
1191
+ }
1192
+ const logMethods = [
1193
+ "log",
1194
+ "warn",
1195
+ "error",
1196
+ "info",
1197
+ "debug"
1198
+ ];
1199
+ logMethods.forEach((method) => {
1200
+ const originalMethod = console[method];
1201
+ console[method] = function(...args) {
1202
+ captureLog(method, args);
1203
+ return originalMethod.apply(console, args);
1204
+ };
1205
+ });
1206
+ isPatched = true;
1207
+ }
1208
+ __name(patchConsole, "patchConsole");
1209
+ function captureLog(level, args) {
1210
+ const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
1211
+ if (logs && logs.length < MAX_BUFFER_SIZE) {
1212
+ logs.push({
1213
+ timestamp: Date.now() / 1e3,
1214
+ logger: "console",
1215
+ level,
1216
+ message: format2(...args)
1217
+ });
1218
+ }
1219
+ }
1220
+ __name(captureLog, "captureLog");
1221
+
1222
+ // src/loggers/utils.ts
1223
+ import { format as format3 } from "util";
1224
+ function formatMessage(message, ...args) {
1225
+ return [
1226
+ message,
1227
+ ...args
1228
+ ].map(formatArg).filter((arg) => arg !== "").join("\n");
1229
+ }
1230
+ __name(formatMessage, "formatMessage");
1231
+ function removeKeys(obj, keys) {
1232
+ return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
1233
+ }
1234
+ __name(removeKeys, "removeKeys");
1235
+ function formatArg(arg) {
1236
+ if (typeof arg === "string") {
1237
+ return arg.trim();
1238
+ }
1239
+ if (arg instanceof Error) {
1240
+ return format3(arg).trim();
1241
+ }
1242
+ if (arg === void 0 || arg === null || isEmptyObject(arg)) {
1243
+ return "";
1244
+ }
1245
+ try {
1246
+ return JSON.stringify(arg);
1247
+ } catch {
1248
+ return format3(arg).trim();
1249
+ }
1250
+ }
1251
+ __name(formatArg, "formatArg");
1252
+ function isEmptyObject(obj) {
1253
+ return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
1254
+ }
1255
+ __name(isEmptyObject, "isEmptyObject");
1256
+
1257
+ // src/loggers/pino.ts
1258
+ var originalStreamSym = Symbol.for("apitally.originalStream");
1259
+
1260
+ // src/loggers/winston.ts
1261
+ var MAX_BUFFER_SIZE2 = 1e3;
1262
+ var isPatched2 = false;
1263
+ var globalLogsContext2;
1264
+ async function patchWinston(logsContext) {
1265
+ var _a2, _b;
1266
+ globalLogsContext2 = logsContext;
1267
+ if (isPatched2) {
1268
+ return;
1269
+ }
1270
+ try {
1271
+ const loggerModule = await import("winston/lib/winston/logger.js");
1272
+ if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
1273
+ const originalWrite = loggerModule.default.prototype.write;
1274
+ loggerModule.default.prototype.write = function(info) {
1275
+ captureLog2(info);
1276
+ return originalWrite.call(this, info);
1277
+ };
1278
+ }
1279
+ } catch {
1280
+ }
1281
+ isPatched2 = true;
1282
+ }
1283
+ __name(patchWinston, "patchWinston");
1284
+ function captureLog2(info) {
1285
+ const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
1286
+ if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
1287
+ return;
1288
+ }
1289
+ try {
1290
+ const rest = removeKeys(info, [
1291
+ "timestamp",
1292
+ "level",
1293
+ "message",
1294
+ "splat"
1295
+ ]);
1296
+ const formattedMessage = formatMessage(info.message, rest);
1297
+ if (formattedMessage) {
1298
+ logs.push({
1299
+ timestamp: parseTimestamp(info.timestamp),
1300
+ level: info.level || "info",
1301
+ message: formattedMessage.trim()
1302
+ });
1303
+ }
1304
+ } catch (e) {
1305
+ }
1306
+ }
1307
+ __name(captureLog2, "captureLog");
1308
+ function parseTimestamp(timestamp) {
1309
+ if (timestamp) {
1310
+ const ts = new Date(timestamp).getTime();
1311
+ if (!isNaN(ts)) {
1312
+ return ts / 1e3;
1313
+ }
1314
+ }
1315
+ return Date.now() / 1e3;
1316
+ }
1317
+ __name(parseTimestamp, "parseTimestamp");
1318
+
1159
1319
  // src/common/packageVersions.ts
1160
1320
  import { createRequire } from "module";
1161
1321
  function getPackageVersion(name) {
@@ -1223,11 +1383,14 @@ function getAppInfo(h3, appVersion) {
1223
1383
  __name(getAppInfo, "getAppInfo");
1224
1384
 
1225
1385
  // src/h3/plugin.ts
1386
+ var REQUEST_TIMESTAMP_SYMBOL = Symbol("apitally.requestTimestamp");
1387
+ var REQUEST_BODY_SYMBOL = Symbol("apitally.requestBody");
1226
1388
  var jsonHeaders = new Headers({
1227
1389
  "content-type": "application/json;charset=UTF-8"
1228
1390
  });
1229
1391
  var apitallyPlugin = definePlugin((app, config) => {
1230
1392
  const client = new ApitallyClient(config);
1393
+ const logsContext = new AsyncLocalStorage();
1231
1394
  const setStartupData = /* @__PURE__ */ __name((attempt = 1) => {
1232
1395
  const appInfo = getAppInfo(app, config.appVersion);
1233
1396
  if (appInfo.paths.length > 0 || attempt >= 10) {
@@ -1237,12 +1400,16 @@ var apitallyPlugin = definePlugin((app, config) => {
1237
1400
  }
1238
1401
  }, "setStartupData");
1239
1402
  setTimeout(() => setStartupData(), 500);
1403
+ if (client.requestLogger.config.captureLogs) {
1404
+ patchConsole(logsContext);
1405
+ patchWinston(logsContext);
1406
+ }
1240
1407
  const handleResponse = /* @__PURE__ */ __name(async (event, response, error) => {
1241
1408
  var _a2, _b;
1242
1409
  if (event.req.method.toUpperCase() === "OPTIONS") {
1243
1410
  return response;
1244
1411
  }
1245
- const startTime = event.context._apitallyRequestTimestamp;
1412
+ const startTime = event.context[REQUEST_TIMESTAMP_SYMBOL];
1246
1413
  const responseTime = startTime ? performance.now() - startTime : 0;
1247
1414
  const path = (_a2 = event.context.matchedRoute) == null ? void 0 : _a2.route;
1248
1415
  const statusCode = (response == null ? void 0 : response.status) || (error == null ? void 0 : error.status) || 500;
@@ -1297,33 +1464,35 @@ var apitallyPlugin = definePlugin((app, config) => {
1297
1464
  } else if (error && client.requestLogger.config.logResponseBody) {
1298
1465
  responseBody = Buffer.from(JSON.stringify(error.toJSON()));
1299
1466
  }
1467
+ const logs = logsContext.getStore();
1300
1468
  client.requestLogger.logRequest({
1301
1469
  timestamp: (Date.now() - responseTime) / 1e3,
1302
1470
  method: event.req.method,
1303
1471
  path,
1304
1472
  url: event.req.url,
1305
1473
  headers: convertHeaders(Object.fromEntries(event.req.headers.entries())),
1306
- size: Number(requestSize),
1474
+ size: requestSize,
1307
1475
  consumer: consumer == null ? void 0 : consumer.identifier,
1308
- body: event.context._apitallyRequestBody
1476
+ body: event.context[REQUEST_BODY_SYMBOL]
1309
1477
  }, {
1310
1478
  statusCode,
1311
1479
  responseTime: responseTime / 1e3,
1312
1480
  headers: convertHeaders(Object.fromEntries(responseHeaders.entries())),
1313
1481
  size: responseSize,
1314
1482
  body: responseBody
1315
- });
1483
+ }, (error == null ? void 0 : error.cause) instanceof Error ? error.cause : void 0, logs);
1316
1484
  }
1317
1485
  return newResponse;
1318
1486
  }, "handleResponse");
1319
1487
  app.use(onRequest(async (event) => {
1320
- event.context._apitallyRequestTimestamp = performance.now();
1488
+ logsContext.enterWith([]);
1489
+ event.context[REQUEST_TIMESTAMP_SYMBOL] = performance.now();
1321
1490
  const requestContentType = event.req.headers.get("content-type");
1322
1491
  const requestSize = parseContentLength(event.req.headers.get("content-length")) ?? 0;
1323
1492
  if (client.requestLogger.enabled && client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType) && requestSize <= client.requestLogger.maxBodySize) {
1324
1493
  const clonedRequest = event.req.clone();
1325
1494
  const requestBody = Buffer.from(await clonedRequest.arrayBuffer());
1326
- event.context._apitallyRequestBody = requestBody;
1495
+ event.context[REQUEST_BODY_SYMBOL] = requestBody;
1327
1496
  }
1328
1497
  })).use(onResponse((response, event) => {
1329
1498
  if (client.isEnabled()) {