apitally 0.18.0 → 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 +5341 -451
  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 +5294 -406
  178. package/dist/nestjs/index.js.map +1 -1
  179. package/package.json +4 -3
@@ -9,9 +9,12 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
9
9
  });
10
10
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
11
11
 
12
+ // src/koa/middleware.ts
13
+ import { AsyncLocalStorage } from "async_hooks";
14
+
12
15
  // src/common/client.ts
13
- import { randomUUID as randomUUID3 } from "crypto";
14
16
  import fetchRetry from "fetch-retry";
17
+ import { randomUUID as randomUUID3 } from "crypto";
15
18
 
16
19
  // src/common/consumerRegistry.ts
17
20
  var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
@@ -71,7 +74,7 @@ var ConsumerRegistry = _ConsumerRegistry;
71
74
 
72
75
  // src/common/logging.ts
73
76
  import { createLogger, format, transports } from "winston";
74
- var getLogger = /* @__PURE__ */ __name(() => {
77
+ function getLogger() {
75
78
  return createLogger({
76
79
  level: process.env.APITALLY_DEBUG ? "debug" : "warn",
77
80
  format: format.combine(format.colorize(), format.timestamp(), format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
@@ -79,7 +82,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
79
82
  new transports.Console()
80
83
  ]
81
84
  });
82
- }, "getLogger");
85
+ }
86
+ __name(getLogger, "getLogger");
83
87
 
84
88
  // src/common/paramValidation.ts
85
89
  function isValidClientId(clientId) {
@@ -183,7 +187,7 @@ var RequestCounter = _RequestCounter;
183
187
  import AsyncLock from "async-lock";
184
188
  import { Buffer as Buffer3 } from "buffer";
185
189
  import { randomUUID as randomUUID2 } from "crypto";
186
- import { unlinkSync as unlinkSync2, writeFileSync } from "fs";
190
+ import { unlinkSync, writeFileSync } from "fs";
187
191
  import { tmpdir as tmpdir2 } from "os";
188
192
  import { join as join2 } from "path";
189
193
 
@@ -246,6 +250,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
246
250
  });
247
251
  this.errorCounts.clear();
248
252
  this.errorDetails.clear();
253
+ this.sentryEventIds.clear();
249
254
  return data;
250
255
  }
251
256
  getKey(serverError) {
@@ -292,7 +297,8 @@ __name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
292
297
  // src/common/tempGzipFile.ts
293
298
  import { Buffer as Buffer2 } from "buffer";
294
299
  import { randomUUID } from "crypto";
295
- import { createWriteStream, readFile, unlinkSync } from "fs";
300
+ import { createWriteStream, readFile } from "fs";
301
+ import { unlink } from "fs/promises";
296
302
  import { tmpdir } from "os";
297
303
  import { join } from "path";
298
304
  import { createGzip } from "zlib";
@@ -357,7 +363,7 @@ var _TempGzipFile = class _TempGzipFile {
357
363
  }
358
364
  async delete() {
359
365
  await this.close();
360
- unlinkSync(this.filePath);
366
+ await unlink(this.filePath);
361
367
  }
362
368
  };
363
369
  __name(_TempGzipFile, "TempGzipFile");
@@ -368,6 +374,7 @@ var MAX_BODY_SIZE = 5e4;
368
374
  var MAX_FILE_SIZE = 1e6;
369
375
  var MAX_FILES = 50;
370
376
  var MAX_PENDING_WRITES = 100;
377
+ var MAX_LOG_MSG_LENGTH = 2048;
371
378
  var BODY_TOO_LARGE = Buffer3.from("<body too large>");
372
379
  var BODY_MASKED = Buffer3.from("<masked>");
373
380
  var MASKED = "******";
@@ -424,6 +431,7 @@ var DEFAULT_CONFIG = {
424
431
  logResponseHeaders: true,
425
432
  logResponseBody: false,
426
433
  logException: true,
434
+ captureLogs: false,
427
435
  maskQueryParams: [],
428
436
  maskHeaders: [],
429
437
  maskBodyFields: [],
@@ -578,7 +586,7 @@ var _RequestLogger = class _RequestLogger {
578
586
  item.request.url = url.toString();
579
587
  return item;
580
588
  }
581
- logRequest(request, response, error) {
589
+ logRequest(request, response, error, logs) {
582
590
  var _a2, _b, _c;
583
591
  if (!this.enabled || this.suspendUntil !== null) return;
584
592
  const url = new URL(request.url);
@@ -610,6 +618,14 @@ var _RequestLogger = class _RequestLogger {
610
618
  sentryEventId: getSentryEventId()
611
619
  } : void 0
612
620
  };
621
+ if (logs && logs.length > 0) {
622
+ item.logs = logs.map((log) => ({
623
+ timestamp: log.timestamp,
624
+ logger: log.logger,
625
+ level: log.level,
626
+ message: truncateLogMessage(log.message)
627
+ }));
628
+ }
613
629
  this.pendingWrites.push(item);
614
630
  if (this.pendingWrites.length > MAX_PENDING_WRITES) {
615
631
  this.pendingWrites.shift();
@@ -631,7 +647,8 @@ var _RequestLogger = class _RequestLogger {
631
647
  uuid: item.uuid,
632
648
  request: skipEmptyValues(item.request),
633
649
  response: skipEmptyValues(item.response),
634
- exception: item.exception
650
+ exception: item.exception,
651
+ logs: item.logs
635
652
  };
636
653
  [
637
654
  finalItem.request.body,
@@ -765,11 +782,19 @@ function skipEmptyValues(data) {
765
782
  }));
766
783
  }
767
784
  __name(skipEmptyValues, "skipEmptyValues");
785
+ function truncateLogMessage(msg) {
786
+ if (msg.length > MAX_LOG_MSG_LENGTH) {
787
+ const suffix = "... (truncated)";
788
+ return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
789
+ }
790
+ return msg;
791
+ }
792
+ __name(truncateLogMessage, "truncateLogMessage");
768
793
  function checkWritableFs() {
769
794
  try {
770
795
  const testPath = join2(tmpdir2(), `apitally-${randomUUID2()}`);
771
796
  writeFileSync(testPath, "test");
772
- unlinkSync2(testPath);
797
+ unlinkSync(testPath);
773
798
  return true;
774
799
  } catch (error) {
775
800
  return false;
@@ -1120,6 +1145,143 @@ function getPackageVersion(name) {
1120
1145
  }
1121
1146
  __name(getPackageVersion, "getPackageVersion");
1122
1147
 
1148
+ // src/loggers/console.ts
1149
+ import { format as format2 } from "util";
1150
+ var MAX_BUFFER_SIZE = 1e3;
1151
+ var isPatched = false;
1152
+ var globalLogsContext;
1153
+ function patchConsole(logsContext) {
1154
+ globalLogsContext = logsContext;
1155
+ if (isPatched) {
1156
+ return;
1157
+ }
1158
+ const logMethods = [
1159
+ "log",
1160
+ "warn",
1161
+ "error",
1162
+ "info",
1163
+ "debug"
1164
+ ];
1165
+ logMethods.forEach((method) => {
1166
+ const originalMethod = console[method];
1167
+ console[method] = function(...args) {
1168
+ captureLog(method, args);
1169
+ return originalMethod.apply(console, args);
1170
+ };
1171
+ });
1172
+ isPatched = true;
1173
+ }
1174
+ __name(patchConsole, "patchConsole");
1175
+ function captureLog(level, args) {
1176
+ const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
1177
+ if (logs && logs.length < MAX_BUFFER_SIZE) {
1178
+ logs.push({
1179
+ timestamp: Date.now() / 1e3,
1180
+ logger: "console",
1181
+ level,
1182
+ message: format2(...args)
1183
+ });
1184
+ }
1185
+ }
1186
+ __name(captureLog, "captureLog");
1187
+
1188
+ // src/loggers/utils.ts
1189
+ import { format as format3 } from "util";
1190
+ function formatMessage(message, ...args) {
1191
+ return [
1192
+ message,
1193
+ ...args
1194
+ ].map(formatArg).filter((arg) => arg !== "").join("\n");
1195
+ }
1196
+ __name(formatMessage, "formatMessage");
1197
+ function removeKeys(obj, keys) {
1198
+ return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
1199
+ }
1200
+ __name(removeKeys, "removeKeys");
1201
+ function formatArg(arg) {
1202
+ if (typeof arg === "string") {
1203
+ return arg.trim();
1204
+ }
1205
+ if (arg instanceof Error) {
1206
+ return format3(arg).trim();
1207
+ }
1208
+ if (arg === void 0 || arg === null || isEmptyObject(arg)) {
1209
+ return "";
1210
+ }
1211
+ try {
1212
+ return JSON.stringify(arg);
1213
+ } catch {
1214
+ return format3(arg).trim();
1215
+ }
1216
+ }
1217
+ __name(formatArg, "formatArg");
1218
+ function isEmptyObject(obj) {
1219
+ return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
1220
+ }
1221
+ __name(isEmptyObject, "isEmptyObject");
1222
+
1223
+ // src/loggers/pino.ts
1224
+ var originalStreamSym = Symbol.for("apitally.originalStream");
1225
+
1226
+ // src/loggers/winston.ts
1227
+ var MAX_BUFFER_SIZE2 = 1e3;
1228
+ var isPatched2 = false;
1229
+ var globalLogsContext2;
1230
+ async function patchWinston(logsContext) {
1231
+ var _a2, _b;
1232
+ globalLogsContext2 = logsContext;
1233
+ if (isPatched2) {
1234
+ return;
1235
+ }
1236
+ try {
1237
+ const loggerModule = await import("winston/lib/winston/logger.js");
1238
+ if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
1239
+ const originalWrite = loggerModule.default.prototype.write;
1240
+ loggerModule.default.prototype.write = function(info) {
1241
+ captureLog2(info);
1242
+ return originalWrite.call(this, info);
1243
+ };
1244
+ }
1245
+ } catch {
1246
+ }
1247
+ isPatched2 = true;
1248
+ }
1249
+ __name(patchWinston, "patchWinston");
1250
+ function captureLog2(info) {
1251
+ const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
1252
+ if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
1253
+ return;
1254
+ }
1255
+ try {
1256
+ const rest = removeKeys(info, [
1257
+ "timestamp",
1258
+ "level",
1259
+ "message",
1260
+ "splat"
1261
+ ]);
1262
+ const formattedMessage = formatMessage(info.message, rest);
1263
+ if (formattedMessage) {
1264
+ logs.push({
1265
+ timestamp: parseTimestamp(info.timestamp),
1266
+ level: info.level || "info",
1267
+ message: formattedMessage.trim()
1268
+ });
1269
+ }
1270
+ } catch (e) {
1271
+ }
1272
+ }
1273
+ __name(captureLog2, "captureLog");
1274
+ function parseTimestamp(timestamp) {
1275
+ if (timestamp) {
1276
+ const ts = new Date(timestamp).getTime();
1277
+ if (!isNaN(ts)) {
1278
+ return ts / 1e3;
1279
+ }
1280
+ }
1281
+ return Date.now() / 1e3;
1282
+ }
1283
+ __name(parseTimestamp, "parseTimestamp");
1284
+
1123
1285
  // src/koa/middleware.ts
1124
1286
  function useApitally(app, config) {
1125
1287
  const client = new ApitallyClient(config);
@@ -1137,77 +1299,85 @@ function useApitally(app, config) {
1137
1299
  }
1138
1300
  __name(useApitally, "useApitally");
1139
1301
  function getMiddleware(client) {
1302
+ const logsContext = new AsyncLocalStorage();
1303
+ if (client.requestLogger.config.captureLogs) {
1304
+ patchConsole(logsContext);
1305
+ patchWinston(logsContext);
1306
+ }
1140
1307
  return async (ctx, next) => {
1141
- var _a2;
1142
1308
  if (!client.isEnabled() || ctx.request.method.toUpperCase() === "OPTIONS") {
1143
1309
  await next();
1144
1310
  return;
1145
1311
  }
1146
- let path;
1147
- let statusCode;
1148
- let serverError;
1149
- const startTime = performance.now();
1150
- try {
1151
- await next();
1152
- } catch (error) {
1153
- path = getPath(ctx);
1154
- statusCode = error.statusCode || error.status || 500;
1155
- if (path && statusCode === 500 && error instanceof Error) {
1156
- serverError = error;
1157
- client.serverErrorCounter.addServerError({
1158
- consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
1159
- method: ctx.request.method,
1160
- path,
1161
- type: error.name,
1162
- msg: error.message,
1163
- traceback: error.stack || ""
1164
- });
1165
- }
1166
- throw error;
1167
- } finally {
1168
- const responseTime = performance.now() - startTime;
1169
- const consumer = getConsumer(ctx);
1170
- client.consumerRegistry.addOrUpdateConsumer(consumer);
1171
- if (!path) {
1312
+ await logsContext.run([], async () => {
1313
+ var _a2;
1314
+ let path;
1315
+ let statusCode;
1316
+ let serverError;
1317
+ const startTime = performance.now();
1318
+ try {
1319
+ await next();
1320
+ } catch (error) {
1172
1321
  path = getPath(ctx);
1173
- }
1174
- if (path) {
1175
- try {
1176
- client.requestCounter.addRequest({
1177
- consumer: consumer == null ? void 0 : consumer.identifier,
1322
+ statusCode = error.statusCode || error.status || 500;
1323
+ if (path && statusCode === 500 && error instanceof Error) {
1324
+ serverError = error;
1325
+ client.serverErrorCounter.addServerError({
1326
+ consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
1178
1327
  method: ctx.request.method,
1179
1328
  path,
1180
- statusCode: statusCode || ctx.response.status,
1181
- responseTime,
1182
- requestSize: ctx.request.length,
1183
- responseSize: ctx.response.length
1184
- });
1185
- } catch (error) {
1186
- client.logger.error("Error while logging request in Apitally middleware.", {
1187
- context: ctx,
1188
- error
1329
+ type: error.name,
1330
+ msg: error.message,
1331
+ traceback: error.stack || ""
1189
1332
  });
1190
1333
  }
1334
+ throw error;
1335
+ } finally {
1336
+ const responseTime = performance.now() - startTime;
1337
+ const consumer = getConsumer(ctx);
1338
+ client.consumerRegistry.addOrUpdateConsumer(consumer);
1339
+ if (!path) {
1340
+ path = getPath(ctx);
1341
+ }
1342
+ if (path) {
1343
+ try {
1344
+ client.requestCounter.addRequest({
1345
+ consumer: consumer == null ? void 0 : consumer.identifier,
1346
+ method: ctx.request.method,
1347
+ path,
1348
+ statusCode: statusCode || ctx.response.status,
1349
+ responseTime,
1350
+ requestSize: ctx.request.length,
1351
+ responseSize: ctx.response.length
1352
+ });
1353
+ } catch (error) {
1354
+ client.logger.error("Error while logging request in Apitally middleware.", {
1355
+ context: ctx,
1356
+ error
1357
+ });
1358
+ }
1359
+ }
1360
+ if (client.requestLogger.enabled) {
1361
+ const logs = logsContext.getStore();
1362
+ client.requestLogger.logRequest({
1363
+ timestamp: Date.now() / 1e3,
1364
+ method: ctx.request.method,
1365
+ path,
1366
+ url: ctx.request.href,
1367
+ headers: convertHeaders(ctx.request.headers),
1368
+ size: ctx.request.length,
1369
+ consumer: consumer == null ? void 0 : consumer.identifier,
1370
+ body: convertBody(ctx.request.body, ctx.request.get("content-type"))
1371
+ }, {
1372
+ statusCode: statusCode || ctx.response.status,
1373
+ responseTime: responseTime / 1e3,
1374
+ headers: convertHeaders(ctx.response.headers),
1375
+ size: ctx.response.length,
1376
+ body: convertBody(ctx.response.body, ctx.response.get("content-type"))
1377
+ }, serverError, logs);
1378
+ }
1191
1379
  }
1192
- if (client.requestLogger.enabled) {
1193
- client.requestLogger.logRequest({
1194
- timestamp: Date.now() / 1e3,
1195
- method: ctx.request.method,
1196
- path,
1197
- url: ctx.request.href,
1198
- headers: convertHeaders(ctx.request.headers),
1199
- size: ctx.request.length,
1200
- consumer: consumer == null ? void 0 : consumer.identifier,
1201
- body: convertBody(ctx.request.body, ctx.request.get("content-type"))
1202
- }, {
1203
- statusCode: statusCode || ctx.response.status,
1204
- responseTime: responseTime / 1e3,
1205
- headers: convertHeaders(ctx.response.headers),
1206
- size: ctx.response.length,
1207
- body: convertBody(ctx.response.body, ctx.response.get("content-type"))
1208
- }, serverError);
1209
- }
1210
- }
1380
+ });
1211
1381
  };
1212
1382
  }
1213
1383
  __name(getMiddleware, "getMiddleware");