@abyss-project/monitor 1.0.57 → 1.0.59
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/dist/frameworks/express/decorators.d.ts +1 -0
- package/dist/frameworks/express/decorators.js +7 -1
- package/dist/frameworks/express/metadata.d.ts +1 -0
- package/dist/frameworks/express/metadata.js +2 -1
- package/dist/middlewares/request-tracker.middleware.d.ts +6 -1
- package/dist/middlewares/request-tracker.middleware.js +7 -3
- package/dist/utils/graceful-shutdown.utils.js +4 -0
- package/dist/utils/killable-route.utils.d.ts +3 -0
- package/dist/utils/killable-route.utils.js +26 -0
- package/dist/utils/request-tracker.utils.d.ts +4 -2
- package/dist/utils/request-tracker.utils.js +20 -5
- package/package.json +1 -1
|
@@ -49,4 +49,5 @@ export declare function Middlewares(middlewares: Middleware[]): any;
|
|
|
49
49
|
export declare function Body(schema: Joi.Schema, options?: ValidationOptions): any;
|
|
50
50
|
export declare function Params(schema: Joi.Schema, options?: ValidationOptions): any;
|
|
51
51
|
export declare function Query(schema: Joi.Schema, options?: ValidationOptions): any;
|
|
52
|
+
export declare function Killable(): any;
|
|
52
53
|
export {};
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.Query = exports.Params = exports.Body = exports.Middlewares = exports.Middleware = exports.Controller = exports.Patch = exports.Delete = exports.Put = exports.Post = exports.Get = void 0;
|
|
6
|
+
exports.Killable = exports.Query = exports.Params = exports.Body = exports.Middlewares = exports.Middleware = exports.Controller = exports.Patch = exports.Delete = exports.Put = exports.Post = exports.Get = void 0;
|
|
7
7
|
const types_1 = require("../../types");
|
|
8
8
|
const _1 = require(".");
|
|
9
9
|
const joi_to_swagger_1 = __importDefault(require("joi-to-swagger"));
|
|
@@ -161,3 +161,9 @@ function Query(schema, options) {
|
|
|
161
161
|
};
|
|
162
162
|
}
|
|
163
163
|
exports.Query = Query;
|
|
164
|
+
function Killable() {
|
|
165
|
+
return function (target, propertyKey, descriptor) {
|
|
166
|
+
Reflect.defineMetadata(_1.KILLABLE_WATERMARK, true, target, propertyKey);
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
exports.Killable = Killable;
|
|
@@ -7,3 +7,4 @@ export declare const ROUTE_WATERMARK = "__route__";
|
|
|
7
7
|
export declare const DOCS_WATERMARK = "__docs__";
|
|
8
8
|
export declare const MIDDLEWARE_WATERMARK = "__middleware__";
|
|
9
9
|
export declare const MIDDLEWARE_HOOK_WATERMARK = "__middleware_hook__";
|
|
10
|
+
export declare const KILLABLE_WATERMARK = "__killable__";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MIDDLEWARE_HOOK_WATERMARK = exports.MIDDLEWARE_WATERMARK = exports.DOCS_WATERMARK = exports.ROUTE_WATERMARK = exports.OPTIONS_WATERMARK = exports.METHOD_WATERMARK = exports.PATH_WATERMARK = exports.MASKED_WATERMARK = exports.CONTROLLER_WATERMARK = void 0;
|
|
3
|
+
exports.KILLABLE_WATERMARK = exports.MIDDLEWARE_HOOK_WATERMARK = exports.MIDDLEWARE_WATERMARK = exports.DOCS_WATERMARK = exports.ROUTE_WATERMARK = exports.OPTIONS_WATERMARK = exports.METHOD_WATERMARK = exports.PATH_WATERMARK = exports.MASKED_WATERMARK = exports.CONTROLLER_WATERMARK = void 0;
|
|
4
4
|
exports.CONTROLLER_WATERMARK = '__controller__';
|
|
5
5
|
exports.MASKED_WATERMARK = '__masked__';
|
|
6
6
|
exports.PATH_WATERMARK = '__path__';
|
|
@@ -10,3 +10,4 @@ exports.ROUTE_WATERMARK = '__route__';
|
|
|
10
10
|
exports.DOCS_WATERMARK = '__docs__';
|
|
11
11
|
exports.MIDDLEWARE_WATERMARK = '__middleware__';
|
|
12
12
|
exports.MIDDLEWARE_HOOK_WATERMARK = '__middleware_hook__';
|
|
13
|
+
exports.KILLABLE_WATERMARK = '__killable__';
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import { Request, Response, NextFunction } from 'express-serve-static-core';
|
|
2
2
|
import { Logger } from '../models/logger.model';
|
|
3
|
-
export
|
|
3
|
+
export type IsKillableFn = (req: Request) => boolean;
|
|
4
|
+
export interface RequestTrackerOptions {
|
|
5
|
+
logger?: Logger;
|
|
6
|
+
isKillable?: IsKillableFn;
|
|
7
|
+
}
|
|
8
|
+
export declare const createRequestTrackerMiddleware: (options?: RequestTrackerOptions) => (req: Request, res: Response, next: NextFunction) => void;
|
|
@@ -3,8 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createRequestTrackerMiddleware = void 0;
|
|
4
4
|
const request_tracker_utils_1 = require("../utils/request-tracker.utils");
|
|
5
5
|
const graceful_shutdown_types_1 = require("../types/graceful-shutdown.types");
|
|
6
|
-
const
|
|
6
|
+
const killable_route_utils_1 = require("../utils/killable-route.utils");
|
|
7
|
+
const createRequestTrackerMiddleware = (options) => {
|
|
8
|
+
const { logger, isKillable } = options || {};
|
|
7
9
|
return (req, res, next) => {
|
|
10
|
+
const requestIsKillable = isKillable ? isKillable(req) : (0, killable_route_utils_1.isRouteKillable)(req);
|
|
11
|
+
logger === null || logger === void 0 ? void 0 : logger.info(`Incoming request ${req.method} ${req.url} killable: ${requestIsKillable}`);
|
|
8
12
|
if ((0, request_tracker_utils_1.getIsShuttingDown)()) {
|
|
9
13
|
res.status(503).json({
|
|
10
14
|
errorCode: graceful_shutdown_types_1.GracefulShutdownErrorCode.SERVICE_UNAVAILABLE,
|
|
@@ -12,13 +16,13 @@ const createRequestTrackerMiddleware = (logger) => {
|
|
|
12
16
|
});
|
|
13
17
|
return;
|
|
14
18
|
}
|
|
15
|
-
(0, request_tracker_utils_1.incrementActiveRequests)();
|
|
19
|
+
(0, request_tracker_utils_1.incrementActiveRequests)(requestIsKillable);
|
|
16
20
|
let cleaned = false;
|
|
17
21
|
const cleanup = () => {
|
|
18
22
|
if (cleaned)
|
|
19
23
|
return;
|
|
20
24
|
cleaned = true;
|
|
21
|
-
(0, request_tracker_utils_1.decrementActiveRequests)();
|
|
25
|
+
(0, request_tracker_utils_1.decrementActiveRequests)(requestIsKillable);
|
|
22
26
|
};
|
|
23
27
|
res.on('finish', cleanup);
|
|
24
28
|
res.on('close', cleanup);
|
|
@@ -29,9 +29,13 @@ const setupGracefulShutdown = (config) => {
|
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
31
|
(0, request_tracker_utils_1.setIsShuttingDown)(true);
|
|
32
|
+
const totalRequests = (0, request_tracker_utils_1.getTotalRequestsCount)();
|
|
33
|
+
const killableRequests = (0, request_tracker_utils_1.getKillableRequestsCount)();
|
|
32
34
|
logger.log(`Received ${signal}, starting graceful shutdown...`, {
|
|
33
35
|
data: {
|
|
34
36
|
activeRequests: (0, request_tracker_utils_1.getActiveRequestsCount)(),
|
|
37
|
+
killableRequests,
|
|
38
|
+
totalRequests,
|
|
35
39
|
},
|
|
36
40
|
});
|
|
37
41
|
const forceShutdownTimer = setTimeout(() => {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isRouteKillable = void 0;
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
const metadata_1 = require("../frameworks/express/metadata");
|
|
6
|
+
const isRouteKillable = (req) => {
|
|
7
|
+
const route = req.route;
|
|
8
|
+
if (!route || !route.stack || route.stack.length === 0) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
for (const layer of route.stack) {
|
|
12
|
+
const handler = layer.handle;
|
|
13
|
+
if (!handler)
|
|
14
|
+
continue;
|
|
15
|
+
const prototype = Object.getPrototypeOf(handler);
|
|
16
|
+
if (prototype && prototype.constructor) {
|
|
17
|
+
const propertyKey = handler.name;
|
|
18
|
+
const isKillable = Reflect.getMetadata(metadata_1.KILLABLE_WATERMARK, prototype.constructor.prototype, propertyKey);
|
|
19
|
+
if (isKillable) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
};
|
|
26
|
+
exports.isRouteKillable = isRouteKillable;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Logger } from '../models/logger.model';
|
|
2
2
|
export declare const getActiveRequestsCount: () => number;
|
|
3
|
+
export declare const getKillableRequestsCount: () => number;
|
|
4
|
+
export declare const getTotalRequestsCount: () => number;
|
|
3
5
|
export declare const getIsShuttingDown: () => boolean;
|
|
4
6
|
export declare const setIsShuttingDown: (value: boolean) => void;
|
|
5
|
-
export declare const incrementActiveRequests: () => void;
|
|
6
|
-
export declare const decrementActiveRequests: () => void;
|
|
7
|
+
export declare const incrementActiveRequests: (isKillable?: boolean) => void;
|
|
8
|
+
export declare const decrementActiveRequests: (isKillable?: boolean) => void;
|
|
7
9
|
export declare const waitForActiveRequests: (timeout?: number, checkInterval?: number, logger?: Logger) => Promise<void>;
|
|
@@ -1,23 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.waitForActiveRequests = exports.decrementActiveRequests = exports.incrementActiveRequests = exports.setIsShuttingDown = exports.getIsShuttingDown = exports.getActiveRequestsCount = void 0;
|
|
3
|
+
exports.waitForActiveRequests = exports.decrementActiveRequests = exports.incrementActiveRequests = exports.setIsShuttingDown = exports.getIsShuttingDown = exports.getTotalRequestsCount = exports.getKillableRequestsCount = exports.getActiveRequestsCount = void 0;
|
|
4
4
|
const graceful_shutdown_types_1 = require("../types/graceful-shutdown.types");
|
|
5
5
|
let activeRequests = 0;
|
|
6
|
+
let killableRequests = 0;
|
|
6
7
|
let isShuttingDown = false;
|
|
7
8
|
const getActiveRequestsCount = () => activeRequests;
|
|
8
9
|
exports.getActiveRequestsCount = getActiveRequestsCount;
|
|
10
|
+
const getKillableRequestsCount = () => killableRequests;
|
|
11
|
+
exports.getKillableRequestsCount = getKillableRequestsCount;
|
|
12
|
+
const getTotalRequestsCount = () => activeRequests + killableRequests;
|
|
13
|
+
exports.getTotalRequestsCount = getTotalRequestsCount;
|
|
9
14
|
const getIsShuttingDown = () => isShuttingDown;
|
|
10
15
|
exports.getIsShuttingDown = getIsShuttingDown;
|
|
11
16
|
const setIsShuttingDown = (value) => {
|
|
12
17
|
isShuttingDown = value;
|
|
13
18
|
};
|
|
14
19
|
exports.setIsShuttingDown = setIsShuttingDown;
|
|
15
|
-
const incrementActiveRequests = () => {
|
|
16
|
-
|
|
20
|
+
const incrementActiveRequests = (isKillable = false) => {
|
|
21
|
+
if (isKillable) {
|
|
22
|
+
killableRequests++;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
activeRequests++;
|
|
26
|
+
}
|
|
17
27
|
};
|
|
18
28
|
exports.incrementActiveRequests = incrementActiveRequests;
|
|
19
|
-
const decrementActiveRequests = () => {
|
|
20
|
-
|
|
29
|
+
const decrementActiveRequests = (isKillable = false) => {
|
|
30
|
+
if (isKillable) {
|
|
31
|
+
killableRequests--;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
activeRequests--;
|
|
35
|
+
}
|
|
21
36
|
};
|
|
22
37
|
exports.decrementActiveRequests = decrementActiveRequests;
|
|
23
38
|
const waitForActiveRequests = async (timeout = 30000, checkInterval = 100, logger) => {
|