apitally 0.18.1 → 0.20.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.
- package/README.md +71 -44
- package/dist/adonisjs/configure.cjs +2 -2
- package/dist/adonisjs/configure.cjs.map +1 -1
- package/dist/adonisjs/configure.js.map +1 -1
- package/dist/adonisjs/index.cjs +2 -2
- package/dist/adonisjs/index.cjs.map +1 -1
- package/dist/adonisjs/index.d.cts +2 -2
- package/dist/adonisjs/index.d.ts +2 -2
- package/dist/adonisjs/index.js.map +1 -1
- package/dist/adonisjs/middleware.cjs +107 -84
- package/dist/adonisjs/middleware.cjs.map +1 -1
- package/dist/adonisjs/middleware.d.cts +2 -2
- package/dist/adonisjs/middleware.d.ts +2 -2
- package/dist/adonisjs/middleware.js +106 -83
- package/dist/adonisjs/middleware.js.map +1 -1
- package/dist/adonisjs/provider.cjs +4765 -62
- package/dist/adonisjs/provider.cjs.map +1 -1
- package/dist/adonisjs/provider.d.cts +7 -4
- package/dist/adonisjs/provider.d.ts +7 -4
- package/dist/adonisjs/provider.js +4743 -17
- package/dist/adonisjs/provider.js.map +1 -1
- package/dist/common/client.cjs +64 -42
- package/dist/common/client.cjs.map +1 -1
- package/dist/common/client.d.cts +2 -2
- package/dist/common/client.d.ts +2 -2
- package/dist/common/client.js +33 -11
- package/dist/common/client.js.map +1 -1
- package/dist/common/consumerRegistry.d.cts +2 -2
- package/dist/common/consumerRegistry.d.ts +2 -2
- package/dist/common/headers.cjs.map +1 -1
- package/dist/common/headers.d.cts +1 -1
- package/dist/common/headers.d.ts +1 -1
- package/dist/common/headers.js.map +1 -1
- package/dist/common/logging.cjs +3 -2
- package/dist/common/logging.cjs.map +1 -1
- package/dist/common/logging.d.cts +1 -1
- package/dist/common/logging.d.ts +1 -1
- package/dist/common/logging.js +3 -2
- package/dist/common/logging.js.map +1 -1
- package/dist/common/packageVersions.cjs +2 -2
- package/dist/common/packageVersions.cjs.map +1 -1
- package/dist/common/packageVersions.js.map +1 -1
- package/dist/common/requestCounter.d.cts +2 -2
- package/dist/common/requestCounter.d.ts +2 -2
- package/dist/common/requestLogger.cjs +57 -33
- package/dist/common/requestLogger.cjs.map +1 -1
- package/dist/common/requestLogger.d.cts +12 -5
- package/dist/common/requestLogger.d.ts +12 -5
- package/dist/common/requestLogger.js +30 -6
- package/dist/common/requestLogger.js.map +1 -1
- package/dist/common/response.cjs +12 -6
- package/dist/common/response.cjs.map +1 -1
- package/dist/common/response.d.cts +3 -3
- package/dist/common/response.d.ts +3 -3
- package/dist/common/response.js +12 -6
- package/dist/common/response.js.map +1 -1
- package/dist/common/serverErrorCounter.cjs +3 -2
- package/dist/common/serverErrorCounter.cjs.map +1 -1
- package/dist/common/serverErrorCounter.d.cts +2 -2
- package/dist/common/serverErrorCounter.d.ts +2 -2
- package/dist/common/serverErrorCounter.js +1 -0
- package/dist/common/serverErrorCounter.js.map +1 -1
- package/dist/common/tempGzipFile.cjs +15 -14
- package/dist/common/tempGzipFile.cjs.map +1 -1
- package/dist/common/tempGzipFile.d.cts +1 -1
- package/dist/common/tempGzipFile.d.ts +1 -1
- package/dist/common/tempGzipFile.js +3 -2
- package/dist/common/tempGzipFile.js.map +1 -1
- package/dist/common/types.d.cts +2 -2
- package/dist/common/types.d.ts +2 -2
- package/dist/common/validationErrorCounter.cjs +4 -4
- package/dist/common/validationErrorCounter.cjs.map +1 -1
- package/dist/common/validationErrorCounter.d.cts +2 -2
- package/dist/common/validationErrorCounter.d.ts +2 -2
- package/dist/common/validationErrorCounter.js +2 -2
- package/dist/common/validationErrorCounter.js.map +1 -1
- package/dist/elysia/index.cjs +1582 -0
- package/dist/elysia/index.cjs.map +1 -0
- package/dist/elysia/index.d.cts +9 -0
- package/dist/elysia/index.d.ts +9 -0
- package/dist/elysia/index.js +1552 -0
- package/dist/elysia/index.js.map +1 -0
- package/dist/elysia/plugin.cjs +1576 -0
- package/dist/elysia/plugin.cjs.map +1 -0
- package/dist/elysia/plugin.d.cts +53 -0
- package/dist/elysia/plugin.d.ts +53 -0
- package/dist/elysia/plugin.js +1552 -0
- package/dist/elysia/plugin.js.map +1 -0
- package/dist/elysia/utils.cjs +98 -0
- package/dist/elysia/utils.cjs.map +1 -0
- package/dist/elysia/utils.d.cts +12 -0
- package/dist/elysia/utils.d.ts +12 -0
- package/dist/elysia/utils.js +78 -0
- package/dist/elysia/utils.js.map +1 -0
- package/dist/express/index.cjs +4997 -169
- package/dist/express/index.cjs.map +1 -1
- package/dist/express/index.d.cts +2 -2
- package/dist/express/index.d.ts +2 -2
- package/dist/express/index.js +4969 -120
- package/dist/express/index.js.map +1 -1
- package/dist/express/middleware.cjs +4997 -169
- package/dist/express/middleware.cjs.map +1 -1
- package/dist/express/middleware.d.cts +2 -2
- package/dist/express/middleware.d.ts +2 -2
- package/dist/express/middleware.js +4969 -120
- package/dist/express/middleware.js.map +1 -1
- package/dist/fastify/index.cjs +4926 -72
- package/dist/fastify/index.cjs.map +1 -1
- package/dist/fastify/index.d.cts +3 -2
- package/dist/fastify/index.d.ts +3 -2
- package/dist/fastify/index.js +4899 -24
- package/dist/fastify/index.js.map +1 -1
- package/dist/fastify/plugin.cjs +4926 -72
- package/dist/fastify/plugin.cjs.map +1 -1
- package/dist/fastify/plugin.d.cts +8 -3
- package/dist/fastify/plugin.d.ts +8 -3
- package/dist/fastify/plugin.js +4899 -24
- package/dist/fastify/plugin.js.map +1 -1
- package/dist/h3/index.cjs +235 -57
- package/dist/h3/index.cjs.map +1 -1
- package/dist/h3/index.d.cts +2 -2
- package/dist/h3/index.d.ts +2 -2
- package/dist/h3/index.js +200 -22
- package/dist/h3/index.js.map +1 -1
- package/dist/h3/plugin.cjs +235 -57
- package/dist/h3/plugin.cjs.map +1 -1
- package/dist/h3/plugin.d.cts +6 -4
- package/dist/h3/plugin.d.ts +6 -4
- package/dist/h3/plugin.js +200 -22
- package/dist/h3/plugin.js.map +1 -1
- package/dist/h3/utils.cjs +2 -2
- package/dist/h3/utils.cjs.map +1 -1
- package/dist/h3/utils.js.map +1 -1
- package/dist/hono/index.cjs +295 -118
- package/dist/hono/index.cjs.map +1 -1
- package/dist/hono/index.d.cts +2 -2
- package/dist/hono/index.d.ts +2 -2
- package/dist/hono/index.js +261 -84
- package/dist/hono/index.js.map +1 -1
- package/dist/hono/middleware.cjs +295 -118
- package/dist/hono/middleware.cjs.map +1 -1
- package/dist/hono/middleware.d.cts +2 -2
- package/dist/hono/middleware.d.ts +2 -2
- package/dist/hono/middleware.js +261 -84
- package/dist/hono/middleware.js.map +1 -1
- package/dist/hono/utils.cjs +2 -2
- package/dist/hono/utils.cjs.map +1 -1
- package/dist/hono/utils.d.cts +2 -2
- package/dist/hono/utils.d.ts +2 -2
- package/dist/hono/utils.js.map +1 -1
- package/dist/koa/index.cjs +280 -107
- package/dist/koa/index.cjs.map +1 -1
- package/dist/koa/index.d.cts +2 -2
- package/dist/koa/index.d.ts +2 -2
- package/dist/koa/index.js +244 -71
- package/dist/koa/index.js.map +1 -1
- package/dist/koa/middleware.cjs +278 -107
- package/dist/koa/middleware.cjs.map +1 -1
- package/dist/koa/middleware.d.cts +2 -2
- package/dist/koa/middleware.d.ts +2 -2
- package/dist/koa/middleware.js +244 -71
- package/dist/koa/middleware.js.map +1 -1
- package/dist/loggers/console.cjs +69 -0
- package/dist/loggers/console.cjs.map +1 -0
- package/dist/loggers/console.d.cts +9 -0
- package/dist/loggers/console.d.ts +9 -0
- package/dist/loggers/console.js +46 -0
- package/dist/loggers/console.js.map +1 -0
- package/dist/loggers/index.cjs +4837 -0
- package/dist/loggers/index.cjs.map +1 -0
- package/dist/loggers/index.d.cts +9 -0
- package/dist/loggers/index.d.ts +9 -0
- package/dist/loggers/index.js +4826 -0
- package/dist/loggers/index.js.map +1 -0
- package/dist/loggers/nestjs.cjs +135 -0
- package/dist/loggers/nestjs.cjs.map +1 -0
- package/dist/loggers/nestjs.d.cts +9 -0
- package/dist/loggers/nestjs.d.ts +9 -0
- package/dist/loggers/nestjs.js +100 -0
- package/dist/loggers/nestjs.js.map +1 -0
- package/dist/loggers/pino.cjs +4669 -0
- package/dist/loggers/pino.cjs.map +1 -0
- package/dist/loggers/pino.d.cts +9 -0
- package/dist/loggers/pino.d.ts +9 -0
- package/dist/loggers/pino.js +4661 -0
- package/dist/loggers/pino.js.map +1 -0
- package/dist/loggers/utils.cjs +66 -0
- package/dist/loggers/utils.cjs.map +1 -0
- package/dist/loggers/utils.d.cts +6 -0
- package/dist/loggers/utils.d.ts +6 -0
- package/dist/loggers/utils.js +42 -0
- package/dist/loggers/utils.js.map +1 -0
- package/dist/loggers/winston.cjs +135 -0
- package/dist/loggers/winston.cjs.map +1 -0
- package/dist/loggers/winston.d.cts +9 -0
- package/dist/loggers/winston.d.ts +9 -0
- package/dist/loggers/winston.js +100 -0
- package/dist/loggers/winston.js.map +1 -0
- package/dist/nestjs/index.cjs +5448 -542
- package/dist/nestjs/index.cjs.map +1 -1
- package/dist/nestjs/index.d.cts +2 -2
- package/dist/nestjs/index.d.ts +2 -2
- package/dist/nestjs/index.js +5364 -460
- package/dist/nestjs/index.js.map +1 -1
- package/package.json +26 -4
package/dist/koa/middleware.cjs
CHANGED
|
@@ -37,10 +37,11 @@ __export(middleware_exports, {
|
|
|
37
37
|
useApitally: () => useApitally
|
|
38
38
|
});
|
|
39
39
|
module.exports = __toCommonJS(middleware_exports);
|
|
40
|
+
var import_node_async_hooks = require("async_hooks");
|
|
40
41
|
|
|
41
42
|
// src/common/client.ts
|
|
42
|
-
var import_crypto5 = require("crypto");
|
|
43
43
|
var import_fetch_retry = __toESM(require("fetch-retry"), 1);
|
|
44
|
+
var import_node_crypto5 = require("crypto");
|
|
44
45
|
|
|
45
46
|
// src/common/consumerRegistry.ts
|
|
46
47
|
var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
|
|
@@ -100,7 +101,7 @@ var ConsumerRegistry = _ConsumerRegistry;
|
|
|
100
101
|
|
|
101
102
|
// src/common/logging.ts
|
|
102
103
|
var import_winston = require("winston");
|
|
103
|
-
|
|
104
|
+
function getLogger() {
|
|
104
105
|
return (0, import_winston.createLogger)({
|
|
105
106
|
level: process.env.APITALLY_DEBUG ? "debug" : "warn",
|
|
106
107
|
format: import_winston.format.combine(import_winston.format.colorize(), import_winston.format.timestamp(), import_winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
|
|
@@ -108,7 +109,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
|
|
|
108
109
|
new import_winston.transports.Console()
|
|
109
110
|
]
|
|
110
111
|
});
|
|
111
|
-
}
|
|
112
|
+
}
|
|
113
|
+
__name(getLogger, "getLogger");
|
|
112
114
|
|
|
113
115
|
// src/common/paramValidation.ts
|
|
114
116
|
function isValidClientId(clientId) {
|
|
@@ -210,11 +212,11 @@ var RequestCounter = _RequestCounter;
|
|
|
210
212
|
|
|
211
213
|
// src/common/requestLogger.ts
|
|
212
214
|
var import_async_lock = __toESM(require("async-lock"), 1);
|
|
213
|
-
var
|
|
214
|
-
var
|
|
215
|
-
var
|
|
216
|
-
var
|
|
217
|
-
var
|
|
215
|
+
var import_node_buffer2 = require("buffer");
|
|
216
|
+
var import_node_crypto3 = require("crypto");
|
|
217
|
+
var import_node_fs2 = require("fs");
|
|
218
|
+
var import_node_os2 = require("os");
|
|
219
|
+
var import_node_path2 = require("path");
|
|
218
220
|
|
|
219
221
|
// src/common/sentry.ts
|
|
220
222
|
var sentry;
|
|
@@ -233,7 +235,7 @@ function getSentryEventId() {
|
|
|
233
235
|
__name(getSentryEventId, "getSentryEventId");
|
|
234
236
|
|
|
235
237
|
// src/common/serverErrorCounter.ts
|
|
236
|
-
var
|
|
238
|
+
var import_node_crypto = require("crypto");
|
|
237
239
|
var MAX_MSG_LENGTH = 2048;
|
|
238
240
|
var MAX_STACKTRACE_LENGTH = 65536;
|
|
239
241
|
var _ServerErrorCounter = class _ServerErrorCounter {
|
|
@@ -275,6 +277,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
|
|
|
275
277
|
});
|
|
276
278
|
this.errorCounts.clear();
|
|
277
279
|
this.errorDetails.clear();
|
|
280
|
+
this.sentryEventIds.clear();
|
|
278
281
|
return data;
|
|
279
282
|
}
|
|
280
283
|
getKey(serverError) {
|
|
@@ -286,7 +289,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
|
|
|
286
289
|
serverError.msg.trim(),
|
|
287
290
|
serverError.traceback.trim()
|
|
288
291
|
].join("|");
|
|
289
|
-
return (0,
|
|
292
|
+
return (0, import_node_crypto.createHash)("md5").update(hashInput).digest("hex");
|
|
290
293
|
}
|
|
291
294
|
};
|
|
292
295
|
__name(_ServerErrorCounter, "ServerErrorCounter");
|
|
@@ -319,12 +322,13 @@ function truncateExceptionStackTrace(stack) {
|
|
|
319
322
|
__name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
|
|
320
323
|
|
|
321
324
|
// src/common/tempGzipFile.ts
|
|
322
|
-
var
|
|
323
|
-
var
|
|
324
|
-
var
|
|
325
|
-
var
|
|
326
|
-
var
|
|
327
|
-
var
|
|
325
|
+
var import_node_buffer = require("buffer");
|
|
326
|
+
var import_node_crypto2 = require("crypto");
|
|
327
|
+
var import_node_fs = require("fs");
|
|
328
|
+
var import_promises = require("fs/promises");
|
|
329
|
+
var import_node_os = require("os");
|
|
330
|
+
var import_node_path = require("path");
|
|
331
|
+
var import_node_zlib = require("zlib");
|
|
328
332
|
var _TempGzipFile = class _TempGzipFile {
|
|
329
333
|
uuid;
|
|
330
334
|
filePath;
|
|
@@ -333,9 +337,9 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
333
337
|
readyPromise;
|
|
334
338
|
closedPromise;
|
|
335
339
|
constructor() {
|
|
336
|
-
this.uuid = (0,
|
|
337
|
-
this.filePath = (0,
|
|
338
|
-
this.writeStream = (0,
|
|
340
|
+
this.uuid = (0, import_node_crypto2.randomUUID)();
|
|
341
|
+
this.filePath = (0, import_node_path.join)((0, import_node_os.tmpdir)(), `apitally-${this.uuid}.gz`);
|
|
342
|
+
this.writeStream = (0, import_node_fs.createWriteStream)(this.filePath);
|
|
339
343
|
this.readyPromise = new Promise((resolve, reject) => {
|
|
340
344
|
this.writeStream.once("ready", resolve);
|
|
341
345
|
this.writeStream.once("error", reject);
|
|
@@ -344,7 +348,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
344
348
|
this.writeStream.once("close", resolve);
|
|
345
349
|
this.writeStream.once("error", reject);
|
|
346
350
|
});
|
|
347
|
-
this.gzip = (0,
|
|
351
|
+
this.gzip = (0, import_node_zlib.createGzip)();
|
|
348
352
|
this.gzip.pipe(this.writeStream);
|
|
349
353
|
}
|
|
350
354
|
get size() {
|
|
@@ -353,9 +357,9 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
353
357
|
async writeLine(data) {
|
|
354
358
|
await this.readyPromise;
|
|
355
359
|
return new Promise((resolve, reject) => {
|
|
356
|
-
this.gzip.write(
|
|
360
|
+
this.gzip.write(import_node_buffer.Buffer.concat([
|
|
357
361
|
data,
|
|
358
|
-
|
|
362
|
+
import_node_buffer.Buffer.from("\n")
|
|
359
363
|
]), (error) => {
|
|
360
364
|
if (error) {
|
|
361
365
|
reject(error);
|
|
@@ -367,7 +371,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
367
371
|
}
|
|
368
372
|
async getContent() {
|
|
369
373
|
return new Promise((resolve, reject) => {
|
|
370
|
-
(0,
|
|
374
|
+
(0, import_node_fs.readFile)(this.filePath, (error, data) => {
|
|
371
375
|
if (error) {
|
|
372
376
|
reject(error);
|
|
373
377
|
} else {
|
|
@@ -386,7 +390,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
386
390
|
}
|
|
387
391
|
async delete() {
|
|
388
392
|
await this.close();
|
|
389
|
-
(0,
|
|
393
|
+
await (0, import_promises.unlink)(this.filePath);
|
|
390
394
|
}
|
|
391
395
|
};
|
|
392
396
|
__name(_TempGzipFile, "TempGzipFile");
|
|
@@ -397,8 +401,9 @@ var MAX_BODY_SIZE = 5e4;
|
|
|
397
401
|
var MAX_FILE_SIZE = 1e6;
|
|
398
402
|
var MAX_FILES = 50;
|
|
399
403
|
var MAX_PENDING_WRITES = 100;
|
|
400
|
-
var
|
|
401
|
-
var
|
|
404
|
+
var MAX_LOG_MSG_LENGTH = 2048;
|
|
405
|
+
var BODY_TOO_LARGE = import_node_buffer2.Buffer.from("<body too large>");
|
|
406
|
+
var BODY_MASKED = import_node_buffer2.Buffer.from("<masked>");
|
|
402
407
|
var MASKED = "******";
|
|
403
408
|
var ALLOWED_CONTENT_TYPES = [
|
|
404
409
|
"application/json",
|
|
@@ -453,6 +458,7 @@ var DEFAULT_CONFIG = {
|
|
|
453
458
|
logResponseHeaders: true,
|
|
454
459
|
logResponseBody: false,
|
|
455
460
|
logException: true,
|
|
461
|
+
captureLogs: false,
|
|
456
462
|
maskQueryParams: [],
|
|
457
463
|
maskHeaders: [],
|
|
458
464
|
maskBodyFields: [],
|
|
@@ -595,7 +601,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
595
601
|
try {
|
|
596
602
|
const parsedBody = JSON.parse(bodyData.toString());
|
|
597
603
|
const maskedBody = this.maskBody(parsedBody);
|
|
598
|
-
item[key].body =
|
|
604
|
+
item[key].body = import_node_buffer2.Buffer.from(JSON.stringify(maskedBody));
|
|
599
605
|
} catch {
|
|
600
606
|
}
|
|
601
607
|
}
|
|
@@ -607,7 +613,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
607
613
|
item.request.url = url.toString();
|
|
608
614
|
return item;
|
|
609
615
|
}
|
|
610
|
-
logRequest(request, response, error) {
|
|
616
|
+
logRequest(request, response, error, logs) {
|
|
611
617
|
var _a2, _b, _c;
|
|
612
618
|
if (!this.enabled || this.suspendUntil !== null) return;
|
|
613
619
|
const url = new URL(request.url);
|
|
@@ -629,7 +635,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
629
635
|
response.size = void 0;
|
|
630
636
|
}
|
|
631
637
|
const item = {
|
|
632
|
-
uuid: (0,
|
|
638
|
+
uuid: (0, import_node_crypto3.randomUUID)(),
|
|
633
639
|
request,
|
|
634
640
|
response,
|
|
635
641
|
exception: error && this.config.logException ? {
|
|
@@ -639,6 +645,14 @@ var _RequestLogger = class _RequestLogger {
|
|
|
639
645
|
sentryEventId: getSentryEventId()
|
|
640
646
|
} : void 0
|
|
641
647
|
};
|
|
648
|
+
if (logs && logs.length > 0) {
|
|
649
|
+
item.logs = logs.map((log) => ({
|
|
650
|
+
timestamp: log.timestamp,
|
|
651
|
+
logger: log.logger,
|
|
652
|
+
level: log.level,
|
|
653
|
+
message: truncateLogMessage(log.message)
|
|
654
|
+
}));
|
|
655
|
+
}
|
|
642
656
|
this.pendingWrites.push(item);
|
|
643
657
|
if (this.pendingWrites.length > MAX_PENDING_WRITES) {
|
|
644
658
|
this.pendingWrites.shift();
|
|
@@ -660,7 +674,8 @@ var _RequestLogger = class _RequestLogger {
|
|
|
660
674
|
uuid: item.uuid,
|
|
661
675
|
request: skipEmptyValues(item.request),
|
|
662
676
|
response: skipEmptyValues(item.response),
|
|
663
|
-
exception: item.exception
|
|
677
|
+
exception: item.exception,
|
|
678
|
+
logs: item.logs
|
|
664
679
|
};
|
|
665
680
|
[
|
|
666
681
|
finalItem.request.body,
|
|
@@ -672,7 +687,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
672
687
|
};
|
|
673
688
|
}
|
|
674
689
|
});
|
|
675
|
-
await this.currentFile.writeLine(
|
|
690
|
+
await this.currentFile.writeLine(import_node_buffer2.Buffer.from(JSON.stringify(finalItem)));
|
|
676
691
|
}
|
|
677
692
|
}
|
|
678
693
|
});
|
|
@@ -724,6 +739,9 @@ var _RequestLogger = class _RequestLogger {
|
|
|
724
739
|
__name(_RequestLogger, "RequestLogger");
|
|
725
740
|
var RequestLogger = _RequestLogger;
|
|
726
741
|
function convertHeaders(headers) {
|
|
742
|
+
if (!headers) {
|
|
743
|
+
return [];
|
|
744
|
+
}
|
|
727
745
|
if (headers instanceof Headers) {
|
|
728
746
|
return Array.from(headers.entries());
|
|
729
747
|
}
|
|
@@ -753,13 +771,13 @@ function convertBody(body, contentType) {
|
|
|
753
771
|
try {
|
|
754
772
|
if (contentType.startsWith("application/json")) {
|
|
755
773
|
if (isValidJsonString(body)) {
|
|
756
|
-
return
|
|
774
|
+
return import_node_buffer2.Buffer.from(body);
|
|
757
775
|
} else {
|
|
758
|
-
return
|
|
776
|
+
return import_node_buffer2.Buffer.from(JSON.stringify(body));
|
|
759
777
|
}
|
|
760
778
|
}
|
|
761
779
|
if (contentType.startsWith("text/") && typeof body === "string") {
|
|
762
|
-
return
|
|
780
|
+
return import_node_buffer2.Buffer.from(body);
|
|
763
781
|
}
|
|
764
782
|
} catch (error) {
|
|
765
783
|
return;
|
|
@@ -787,18 +805,26 @@ __name(matchPatterns, "matchPatterns");
|
|
|
787
805
|
function skipEmptyValues(data) {
|
|
788
806
|
return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
|
|
789
807
|
if (v == null || Number.isNaN(v)) return false;
|
|
790
|
-
if (Array.isArray(v) ||
|
|
808
|
+
if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
|
|
791
809
|
return v.length > 0;
|
|
792
810
|
}
|
|
793
811
|
return true;
|
|
794
812
|
}));
|
|
795
813
|
}
|
|
796
814
|
__name(skipEmptyValues, "skipEmptyValues");
|
|
815
|
+
function truncateLogMessage(msg) {
|
|
816
|
+
if (msg.length > MAX_LOG_MSG_LENGTH) {
|
|
817
|
+
const suffix = "... (truncated)";
|
|
818
|
+
return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
|
|
819
|
+
}
|
|
820
|
+
return msg;
|
|
821
|
+
}
|
|
822
|
+
__name(truncateLogMessage, "truncateLogMessage");
|
|
797
823
|
function checkWritableFs() {
|
|
798
824
|
try {
|
|
799
|
-
const testPath = (0,
|
|
800
|
-
(0,
|
|
801
|
-
(0,
|
|
825
|
+
const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
|
|
826
|
+
(0, import_node_fs2.writeFileSync)(testPath, "test");
|
|
827
|
+
(0, import_node_fs2.unlinkSync)(testPath);
|
|
802
828
|
return true;
|
|
803
829
|
} catch (error) {
|
|
804
830
|
return false;
|
|
@@ -807,7 +833,7 @@ function checkWritableFs() {
|
|
|
807
833
|
__name(checkWritableFs, "checkWritableFs");
|
|
808
834
|
|
|
809
835
|
// src/common/validationErrorCounter.ts
|
|
810
|
-
var
|
|
836
|
+
var import_node_crypto4 = require("crypto");
|
|
811
837
|
var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
812
838
|
errorCounts;
|
|
813
839
|
errorDetails;
|
|
@@ -831,7 +857,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
831
857
|
consumer: validationError.consumer || null,
|
|
832
858
|
method: validationError.method,
|
|
833
859
|
path: validationError.path,
|
|
834
|
-
loc: validationError.loc.split("."),
|
|
860
|
+
loc: validationError.loc.split(".").filter(Boolean),
|
|
835
861
|
msg: validationError.msg,
|
|
836
862
|
type: validationError.type,
|
|
837
863
|
error_count: count
|
|
@@ -847,11 +873,11 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
847
873
|
validationError.consumer || "",
|
|
848
874
|
validationError.method.toUpperCase(),
|
|
849
875
|
validationError.path,
|
|
850
|
-
validationError.loc,
|
|
876
|
+
validationError.loc.split(".").filter(Boolean),
|
|
851
877
|
validationError.msg.trim(),
|
|
852
878
|
validationError.type
|
|
853
879
|
].join("|");
|
|
854
|
-
return (0,
|
|
880
|
+
return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
|
|
855
881
|
}
|
|
856
882
|
};
|
|
857
883
|
__name(_ValidationErrorCounter, "ValidationErrorCounter");
|
|
@@ -902,7 +928,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
902
928
|
_ApitallyClient.instance = this;
|
|
903
929
|
this.clientId = clientId;
|
|
904
930
|
this.env = env;
|
|
905
|
-
this.instanceUuid = (0,
|
|
931
|
+
this.instanceUuid = (0, import_node_crypto5.randomUUID)();
|
|
906
932
|
this.syncDataQueue = [];
|
|
907
933
|
this.requestCounter = new RequestCounter();
|
|
908
934
|
this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
|
|
@@ -1008,7 +1034,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
1008
1034
|
this.logger.debug("Sending startup data to Apitally Hub");
|
|
1009
1035
|
const payload = {
|
|
1010
1036
|
instance_uuid: this.instanceUuid,
|
|
1011
|
-
message_uuid: (0,
|
|
1037
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
1012
1038
|
...this.startupData
|
|
1013
1039
|
};
|
|
1014
1040
|
try {
|
|
@@ -1030,7 +1056,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
1030
1056
|
const newPayload = {
|
|
1031
1057
|
timestamp: Date.now() / 1e3,
|
|
1032
1058
|
instance_uuid: this.instanceUuid,
|
|
1033
|
-
message_uuid: (0,
|
|
1059
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
1034
1060
|
requests: this.requestCounter.getAndResetRequests(),
|
|
1035
1061
|
validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
|
|
1036
1062
|
server_errors: this.serverErrorCounter.getAndResetServerErrors(),
|
|
@@ -1133,7 +1159,7 @@ __publicField(_ApitallyClient, "instance");
|
|
|
1133
1159
|
var ApitallyClient = _ApitallyClient;
|
|
1134
1160
|
|
|
1135
1161
|
// src/common/packageVersions.ts
|
|
1136
|
-
var
|
|
1162
|
+
var import_node_module = require("module");
|
|
1137
1163
|
var import_meta = {};
|
|
1138
1164
|
function getPackageVersion(name) {
|
|
1139
1165
|
const packageJsonPath = `${name}/package.json`;
|
|
@@ -1141,7 +1167,7 @@ function getPackageVersion(name) {
|
|
|
1141
1167
|
return require(packageJsonPath).version || null;
|
|
1142
1168
|
} catch (error) {
|
|
1143
1169
|
try {
|
|
1144
|
-
const _require = (0,
|
|
1170
|
+
const _require = (0, import_node_module.createRequire)(import_meta.url);
|
|
1145
1171
|
return _require(packageJsonPath).version || null;
|
|
1146
1172
|
} catch (error2) {
|
|
1147
1173
|
return null;
|
|
@@ -1150,6 +1176,143 @@ function getPackageVersion(name) {
|
|
|
1150
1176
|
}
|
|
1151
1177
|
__name(getPackageVersion, "getPackageVersion");
|
|
1152
1178
|
|
|
1179
|
+
// src/loggers/console.ts
|
|
1180
|
+
var import_node_util = require("util");
|
|
1181
|
+
var MAX_BUFFER_SIZE = 1e3;
|
|
1182
|
+
var isPatched = false;
|
|
1183
|
+
var globalLogsContext;
|
|
1184
|
+
function patchConsole(logsContext) {
|
|
1185
|
+
globalLogsContext = logsContext;
|
|
1186
|
+
if (isPatched) {
|
|
1187
|
+
return;
|
|
1188
|
+
}
|
|
1189
|
+
const logMethods = [
|
|
1190
|
+
"log",
|
|
1191
|
+
"warn",
|
|
1192
|
+
"error",
|
|
1193
|
+
"info",
|
|
1194
|
+
"debug"
|
|
1195
|
+
];
|
|
1196
|
+
logMethods.forEach((method) => {
|
|
1197
|
+
const originalMethod = console[method];
|
|
1198
|
+
console[method] = function(...args) {
|
|
1199
|
+
captureLog(method, args);
|
|
1200
|
+
return originalMethod.apply(console, args);
|
|
1201
|
+
};
|
|
1202
|
+
});
|
|
1203
|
+
isPatched = true;
|
|
1204
|
+
}
|
|
1205
|
+
__name(patchConsole, "patchConsole");
|
|
1206
|
+
function captureLog(level, args) {
|
|
1207
|
+
const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
|
|
1208
|
+
if (logs && logs.length < MAX_BUFFER_SIZE) {
|
|
1209
|
+
logs.push({
|
|
1210
|
+
timestamp: Date.now() / 1e3,
|
|
1211
|
+
logger: "console",
|
|
1212
|
+
level,
|
|
1213
|
+
message: (0, import_node_util.format)(...args)
|
|
1214
|
+
});
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
__name(captureLog, "captureLog");
|
|
1218
|
+
|
|
1219
|
+
// src/loggers/utils.ts
|
|
1220
|
+
var import_node_util2 = require("util");
|
|
1221
|
+
function formatMessage(message, ...args) {
|
|
1222
|
+
return [
|
|
1223
|
+
message,
|
|
1224
|
+
...args
|
|
1225
|
+
].map(formatArg).filter((arg) => arg !== "").join("\n");
|
|
1226
|
+
}
|
|
1227
|
+
__name(formatMessage, "formatMessage");
|
|
1228
|
+
function removeKeys(obj, keys) {
|
|
1229
|
+
return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
|
|
1230
|
+
}
|
|
1231
|
+
__name(removeKeys, "removeKeys");
|
|
1232
|
+
function formatArg(arg) {
|
|
1233
|
+
if (typeof arg === "string") {
|
|
1234
|
+
return arg.trim();
|
|
1235
|
+
}
|
|
1236
|
+
if (arg instanceof Error) {
|
|
1237
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1238
|
+
}
|
|
1239
|
+
if (arg === void 0 || arg === null || isEmptyObject(arg)) {
|
|
1240
|
+
return "";
|
|
1241
|
+
}
|
|
1242
|
+
try {
|
|
1243
|
+
return JSON.stringify(arg);
|
|
1244
|
+
} catch {
|
|
1245
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
__name(formatArg, "formatArg");
|
|
1249
|
+
function isEmptyObject(obj) {
|
|
1250
|
+
return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
|
|
1251
|
+
}
|
|
1252
|
+
__name(isEmptyObject, "isEmptyObject");
|
|
1253
|
+
|
|
1254
|
+
// src/loggers/pino.ts
|
|
1255
|
+
var originalStreamSym = Symbol.for("apitally.originalStream");
|
|
1256
|
+
|
|
1257
|
+
// src/loggers/winston.ts
|
|
1258
|
+
var MAX_BUFFER_SIZE2 = 1e3;
|
|
1259
|
+
var isPatched2 = false;
|
|
1260
|
+
var globalLogsContext2;
|
|
1261
|
+
async function patchWinston(logsContext) {
|
|
1262
|
+
var _a2, _b;
|
|
1263
|
+
globalLogsContext2 = logsContext;
|
|
1264
|
+
if (isPatched2) {
|
|
1265
|
+
return;
|
|
1266
|
+
}
|
|
1267
|
+
try {
|
|
1268
|
+
const loggerModule = await import("winston/lib/winston/logger.js");
|
|
1269
|
+
if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
|
|
1270
|
+
const originalWrite = loggerModule.default.prototype.write;
|
|
1271
|
+
loggerModule.default.prototype.write = function(info) {
|
|
1272
|
+
captureLog2(info);
|
|
1273
|
+
return originalWrite.call(this, info);
|
|
1274
|
+
};
|
|
1275
|
+
}
|
|
1276
|
+
} catch {
|
|
1277
|
+
}
|
|
1278
|
+
isPatched2 = true;
|
|
1279
|
+
}
|
|
1280
|
+
__name(patchWinston, "patchWinston");
|
|
1281
|
+
function captureLog2(info) {
|
|
1282
|
+
const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
|
|
1283
|
+
if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
|
|
1284
|
+
return;
|
|
1285
|
+
}
|
|
1286
|
+
try {
|
|
1287
|
+
const rest = removeKeys(info, [
|
|
1288
|
+
"timestamp",
|
|
1289
|
+
"level",
|
|
1290
|
+
"message",
|
|
1291
|
+
"splat"
|
|
1292
|
+
]);
|
|
1293
|
+
const formattedMessage = formatMessage(info.message, rest);
|
|
1294
|
+
if (formattedMessage) {
|
|
1295
|
+
logs.push({
|
|
1296
|
+
timestamp: parseTimestamp(info.timestamp),
|
|
1297
|
+
level: info.level || "info",
|
|
1298
|
+
message: formattedMessage.trim()
|
|
1299
|
+
});
|
|
1300
|
+
}
|
|
1301
|
+
} catch (e) {
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
__name(captureLog2, "captureLog");
|
|
1305
|
+
function parseTimestamp(timestamp) {
|
|
1306
|
+
if (timestamp) {
|
|
1307
|
+
const ts = new Date(timestamp).getTime();
|
|
1308
|
+
if (!isNaN(ts)) {
|
|
1309
|
+
return ts / 1e3;
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
return Date.now() / 1e3;
|
|
1313
|
+
}
|
|
1314
|
+
__name(parseTimestamp, "parseTimestamp");
|
|
1315
|
+
|
|
1153
1316
|
// src/koa/middleware.ts
|
|
1154
1317
|
function useApitally(app, config) {
|
|
1155
1318
|
const client = new ApitallyClient(config);
|
|
@@ -1167,77 +1330,85 @@ function useApitally(app, config) {
|
|
|
1167
1330
|
}
|
|
1168
1331
|
__name(useApitally, "useApitally");
|
|
1169
1332
|
function getMiddleware(client) {
|
|
1333
|
+
const logsContext = new import_node_async_hooks.AsyncLocalStorage();
|
|
1334
|
+
if (client.requestLogger.config.captureLogs) {
|
|
1335
|
+
patchConsole(logsContext);
|
|
1336
|
+
patchWinston(logsContext);
|
|
1337
|
+
}
|
|
1170
1338
|
return async (ctx, next) => {
|
|
1171
|
-
var _a2;
|
|
1172
1339
|
if (!client.isEnabled() || ctx.request.method.toUpperCase() === "OPTIONS") {
|
|
1173
1340
|
await next();
|
|
1174
1341
|
return;
|
|
1175
1342
|
}
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
if (path && statusCode === 500 && error instanceof Error) {
|
|
1186
|
-
serverError = error;
|
|
1187
|
-
client.serverErrorCounter.addServerError({
|
|
1188
|
-
consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
|
|
1189
|
-
method: ctx.request.method,
|
|
1190
|
-
path,
|
|
1191
|
-
type: error.name,
|
|
1192
|
-
msg: error.message,
|
|
1193
|
-
traceback: error.stack || ""
|
|
1194
|
-
});
|
|
1195
|
-
}
|
|
1196
|
-
throw error;
|
|
1197
|
-
} finally {
|
|
1198
|
-
const responseTime = performance.now() - startTime;
|
|
1199
|
-
const consumer = getConsumer(ctx);
|
|
1200
|
-
client.consumerRegistry.addOrUpdateConsumer(consumer);
|
|
1201
|
-
if (!path) {
|
|
1343
|
+
await logsContext.run([], async () => {
|
|
1344
|
+
var _a2;
|
|
1345
|
+
let path;
|
|
1346
|
+
let statusCode;
|
|
1347
|
+
let serverError;
|
|
1348
|
+
const startTime = performance.now();
|
|
1349
|
+
try {
|
|
1350
|
+
await next();
|
|
1351
|
+
} catch (error) {
|
|
1202
1352
|
path = getPath(ctx);
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
client.
|
|
1207
|
-
consumer:
|
|
1353
|
+
statusCode = error.statusCode || error.status || 500;
|
|
1354
|
+
if (path && statusCode === 500 && error instanceof Error) {
|
|
1355
|
+
serverError = error;
|
|
1356
|
+
client.serverErrorCounter.addServerError({
|
|
1357
|
+
consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
|
|
1208
1358
|
method: ctx.request.method,
|
|
1209
1359
|
path,
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
responseSize: ctx.response.length
|
|
1214
|
-
});
|
|
1215
|
-
} catch (error) {
|
|
1216
|
-
client.logger.error("Error while logging request in Apitally middleware.", {
|
|
1217
|
-
context: ctx,
|
|
1218
|
-
error
|
|
1360
|
+
type: error.name,
|
|
1361
|
+
msg: error.message,
|
|
1362
|
+
traceback: error.stack || ""
|
|
1219
1363
|
});
|
|
1220
1364
|
}
|
|
1365
|
+
throw error;
|
|
1366
|
+
} finally {
|
|
1367
|
+
const responseTime = performance.now() - startTime;
|
|
1368
|
+
const consumer = getConsumer(ctx);
|
|
1369
|
+
client.consumerRegistry.addOrUpdateConsumer(consumer);
|
|
1370
|
+
if (!path) {
|
|
1371
|
+
path = getPath(ctx);
|
|
1372
|
+
}
|
|
1373
|
+
if (path) {
|
|
1374
|
+
try {
|
|
1375
|
+
client.requestCounter.addRequest({
|
|
1376
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1377
|
+
method: ctx.request.method,
|
|
1378
|
+
path,
|
|
1379
|
+
statusCode: statusCode || ctx.response.status,
|
|
1380
|
+
responseTime,
|
|
1381
|
+
requestSize: ctx.request.length,
|
|
1382
|
+
responseSize: ctx.response.length
|
|
1383
|
+
});
|
|
1384
|
+
} catch (error) {
|
|
1385
|
+
client.logger.error("Error while logging request in Apitally middleware.", {
|
|
1386
|
+
context: ctx,
|
|
1387
|
+
error
|
|
1388
|
+
});
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
if (client.requestLogger.enabled) {
|
|
1392
|
+
const logs = logsContext.getStore();
|
|
1393
|
+
client.requestLogger.logRequest({
|
|
1394
|
+
timestamp: Date.now() / 1e3,
|
|
1395
|
+
method: ctx.request.method,
|
|
1396
|
+
path,
|
|
1397
|
+
url: ctx.request.href,
|
|
1398
|
+
headers: convertHeaders(ctx.request.headers),
|
|
1399
|
+
size: ctx.request.length,
|
|
1400
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1401
|
+
body: convertBody(ctx.request.body, ctx.request.get("content-type"))
|
|
1402
|
+
}, {
|
|
1403
|
+
statusCode: statusCode || ctx.response.status,
|
|
1404
|
+
responseTime: responseTime / 1e3,
|
|
1405
|
+
headers: convertHeaders(ctx.response.headers),
|
|
1406
|
+
size: ctx.response.length,
|
|
1407
|
+
body: convertBody(ctx.response.body, ctx.response.get("content-type"))
|
|
1408
|
+
}, serverError, logs);
|
|
1409
|
+
}
|
|
1221
1410
|
}
|
|
1222
|
-
|
|
1223
|
-
client.requestLogger.logRequest({
|
|
1224
|
-
timestamp: Date.now() / 1e3,
|
|
1225
|
-
method: ctx.request.method,
|
|
1226
|
-
path,
|
|
1227
|
-
url: ctx.request.href,
|
|
1228
|
-
headers: convertHeaders(ctx.request.headers),
|
|
1229
|
-
size: ctx.request.length,
|
|
1230
|
-
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1231
|
-
body: convertBody(ctx.request.body, ctx.request.get("content-type"))
|
|
1232
|
-
}, {
|
|
1233
|
-
statusCode: statusCode || ctx.response.status,
|
|
1234
|
-
responseTime: responseTime / 1e3,
|
|
1235
|
-
headers: convertHeaders(ctx.response.headers),
|
|
1236
|
-
size: ctx.response.length,
|
|
1237
|
-
body: convertBody(ctx.response.body, ctx.response.get("content-type"))
|
|
1238
|
-
}, serverError);
|
|
1239
|
-
}
|
|
1240
|
-
}
|
|
1411
|
+
});
|
|
1241
1412
|
};
|
|
1242
1413
|
}
|
|
1243
1414
|
__name(getMiddleware, "getMiddleware");
|