@mondart/nestjs-common-module-health-check 3.3.5 → 3.3.7
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 +24 -0
- package/dist/health-check-options.interface.d.ts +9 -0
- package/dist/health-check-options.interface.d.ts.map +1 -1
- package/dist/health-check.controller.d.ts +33 -4
- package/dist/health-check.controller.d.ts.map +1 -1
- package/dist/health-check.controller.js +86 -20
- package/dist/health-check.controller.js.map +1 -1
- package/package.json +7 -6
package/README.md
CHANGED
|
@@ -40,6 +40,30 @@ aggregate check (`/health-check/ready`) only pings the resources you
|
|
|
40
40
|
configured. TypeORM is the one indicator that's on by default; see below to
|
|
41
41
|
turn it off.
|
|
42
42
|
|
|
43
|
+
Use `readiness` to keep a configured dependency available through its
|
|
44
|
+
diagnostic endpoint without allowing that dependency to remove the application
|
|
45
|
+
from HTTP traffic. Omitted flags preserve the existing aggregate behavior:
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
HealthCheckModule.register({
|
|
49
|
+
database: true,
|
|
50
|
+
redis: { host: 'localhost', port: 6379 },
|
|
51
|
+
bull: { host: 'localhost', port: 6379 },
|
|
52
|
+
kafka: { clientId: 'my-service', brokers: ['localhost:9092'] },
|
|
53
|
+
http: { docsUrl: 'https://my-service/docs' },
|
|
54
|
+
readiness: {
|
|
55
|
+
database: true,
|
|
56
|
+
redis: true,
|
|
57
|
+
bull: false,
|
|
58
|
+
kafka: false,
|
|
59
|
+
http: false,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Use `/live` for container restart decisions and `/ready` for load-balancer
|
|
65
|
+
traffic decisions.
|
|
66
|
+
|
|
43
67
|
## Endpoints
|
|
44
68
|
|
|
45
69
|
| Route | Behaviour |
|
|
@@ -2,8 +2,16 @@ import { ModuleMetadata, Type } from '@nestjs/common';
|
|
|
2
2
|
import { SASLOptions } from 'kafkajs';
|
|
3
3
|
import tls from 'tls';
|
|
4
4
|
export declare const HEALTH_CHECK_MODULE_OPTIONS = "HEALTH_CHECK_MODULE_OPTIONS";
|
|
5
|
+
export interface HealthCheckReadinessOptions {
|
|
6
|
+
database?: boolean;
|
|
7
|
+
http?: boolean;
|
|
8
|
+
redis?: boolean;
|
|
9
|
+
bull?: boolean;
|
|
10
|
+
kafka?: boolean;
|
|
11
|
+
}
|
|
5
12
|
export interface HealthCheckModuleOptions {
|
|
6
13
|
messagePattern?: string;
|
|
14
|
+
redisTimeoutMs?: number;
|
|
7
15
|
http?: {
|
|
8
16
|
docsUrl: string;
|
|
9
17
|
};
|
|
@@ -30,6 +38,7 @@ export interface HealthCheckModuleOptions {
|
|
|
30
38
|
ssl?: tls.ConnectionOptions;
|
|
31
39
|
};
|
|
32
40
|
database?: boolean;
|
|
41
|
+
readiness?: HealthCheckReadinessOptions;
|
|
33
42
|
}
|
|
34
43
|
export interface HealthCheckModuleFactory {
|
|
35
44
|
createModuleOptions: () => Promise<HealthCheckModuleOptions> | HealthCheckModuleOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check-options.interface.d.ts","sourceRoot":"","sources":["../src/health-check-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AAEzE,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;IACF,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC;KAC7B,CAAC;IAEF,QAAQ,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"health-check-options.interface.d.ts","sourceRoot":"","sources":["../src/health-check-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AAEzE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;IACF,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC;KAC7B,CAAC;IAEF,QAAQ,CAAC,EAAE,OAAO,CAAC;IAKnB,SAAS,CAAC,EAAE,2BAA2B,CAAC;CACzC;AAED,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,EAAE,MACnB,OAAO,CAAC,wBAAwB,CAAC,GAAG,wBAAwB,CAAC;CAChE;AAED,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,cAAc,EACd,SAAS,CACV;IACC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,CACX,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,wBAAwB,CAAC,GAAG,wBAAwB,CAAC;CACnE"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { Type } from '@nestjs/common';
|
|
1
|
+
import { Type, OnModuleDestroy } from '@nestjs/common';
|
|
2
2
|
import { HealthCheckService, HttpHealthIndicator, MicroserviceHealthIndicator, TypeOrmHealthIndicator } from '@nestjs/terminus';
|
|
3
3
|
import { HealthCheckModuleOptions } from './health-check-options.interface';
|
|
4
|
-
export declare class HealthCheckController {
|
|
4
|
+
export declare class HealthCheckController implements OnModuleDestroy {
|
|
5
5
|
private health;
|
|
6
6
|
private http;
|
|
7
7
|
private db;
|
|
8
8
|
private microservice;
|
|
9
9
|
private options;
|
|
10
|
+
private readonly redisClients;
|
|
11
|
+
private readonly redisProbes;
|
|
10
12
|
constructor(health: HealthCheckService, http: HttpHealthIndicator, db: TypeOrmHealthIndicator, microservice: MicroserviceHealthIndicator, options: HealthCheckModuleOptions);
|
|
11
13
|
checkAll(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>>>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>>>>>;
|
|
12
14
|
checkLive(): {
|
|
@@ -15,11 +17,38 @@ export declare class HealthCheckController {
|
|
|
15
17
|
checkReady(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>>>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>>>>>;
|
|
16
18
|
checkHttp(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & import("@nestjs/terminus").HealthIndicatorResult<"app-docs">, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & import("@nestjs/terminus").HealthIndicatorResult<"app-docs">>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & import("@nestjs/terminus").HealthIndicatorResult<"app-docs">>>>;
|
|
17
19
|
checkTypeOrm(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & import("@nestjs/terminus").HealthIndicatorResult<"typeorm">, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & import("@nestjs/terminus").HealthIndicatorResult<"typeorm">>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & import("@nestjs/terminus").HealthIndicatorResult<"typeorm">>>>;
|
|
18
|
-
checkRedis(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> &
|
|
19
|
-
|
|
20
|
+
checkRedis(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & {
|
|
21
|
+
[key: string]: {
|
|
22
|
+
status: "up";
|
|
23
|
+
};
|
|
24
|
+
}, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & {
|
|
25
|
+
[key: string]: {
|
|
26
|
+
status: "up";
|
|
27
|
+
};
|
|
28
|
+
}>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & {
|
|
29
|
+
[key: string]: {
|
|
30
|
+
status: "up";
|
|
31
|
+
};
|
|
32
|
+
}>>>;
|
|
33
|
+
checkBull(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & {
|
|
34
|
+
[key: string]: {
|
|
35
|
+
status: "up";
|
|
36
|
+
};
|
|
37
|
+
}, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & {
|
|
38
|
+
[key: string]: {
|
|
39
|
+
status: "up";
|
|
40
|
+
};
|
|
41
|
+
}>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & {
|
|
42
|
+
[key: string]: {
|
|
43
|
+
status: "up";
|
|
44
|
+
};
|
|
45
|
+
}>>>;
|
|
20
46
|
checkKafka(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & import("@nestjs/terminus").HealthIndicatorResult<string>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & import("@nestjs/terminus").HealthIndicatorResult<string>>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & import("@nestjs/terminus").HealthIndicatorResult<string>>>>;
|
|
47
|
+
onModuleDestroy(): void;
|
|
21
48
|
private pingRedis;
|
|
49
|
+
private runRedisProbe;
|
|
22
50
|
private pingKafka;
|
|
51
|
+
private isReadinessIndicatorEnabled;
|
|
23
52
|
}
|
|
24
53
|
export declare function createHealthCheckController(messagePattern?: string): Type<HealthCheckController>;
|
|
25
54
|
//# sourceMappingURL=health-check.controller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check.controller.d.ts","sourceRoot":"","sources":["../src/health-check.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,IAAI,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"health-check.controller.d.ts","sourceRoot":"","sources":["../src/health-check.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,IAAI,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGhF,OAAO,EAGL,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,wBAAwB,EACzB,MAAM,kCAAkC,CAAC;AAY1C,qBAIa,qBAAsB,YAAW,eAAe;IAOzD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,OAAO;IAXjB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;gBAEM,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,mBAAmB,EACzB,EAAE,EAAE,sBAAsB,EAC1B,YAAY,EAAE,2BAA2B,EAEzC,OAAO,EAAE,wBAAwB;IAU3C,QAAQ;IAqCR,SAAS;;;IAST,UAAU;IAWV,SAAS;IAQT,YAAY;IAOZ,UAAU;;oBA1F2B,IAAI;;;;oBAAJ,IAAI;;;;oBAAJ,IAAI;;;IAmGzC,SAAS;;oBAnG4B,IAAI;;;;oBAAJ,IAAI;;;;oBAAJ,IAAI;;;IA0GzC,UAAU;IAIV,eAAe,IAAI,IAAI;IAKvB,OAAO,CAAC,SAAS;YAUH,aAAa;IAiE3B,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,2BAA2B;CAKpC;AAQD,wBAAgB,2BAA2B,CACzC,cAAc,CAAC,EAAE,MAAM,GACtB,IAAI,CAAC,qBAAqB,CAAC,CAqB7B"}
|
|
@@ -11,10 +11,14 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
12
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
13
|
};
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
14
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
18
|
exports.HealthCheckController = void 0;
|
|
16
19
|
exports.createHealthCheckController = createHealthCheckController;
|
|
17
20
|
const common_1 = require("@nestjs/common");
|
|
21
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
18
22
|
const microservices_1 = require("@nestjs/microservices");
|
|
19
23
|
const terminus_1 = require("@nestjs/terminus");
|
|
20
24
|
const health_check_options_interface_1 = require("./health-check-options.interface");
|
|
@@ -28,22 +32,25 @@ let HealthCheckController = class HealthCheckController {
|
|
|
28
32
|
this.db = db;
|
|
29
33
|
this.microservice = microservice;
|
|
30
34
|
this.options = options;
|
|
35
|
+
this.redisClients = new Map();
|
|
36
|
+
this.redisProbes = new Map();
|
|
31
37
|
}
|
|
32
38
|
checkAll() {
|
|
33
39
|
const indicators = [];
|
|
34
|
-
if (this.options.database !== false
|
|
40
|
+
if (this.options.database !== false &&
|
|
41
|
+
this.isReadinessIndicatorEnabled('database')) {
|
|
35
42
|
indicators.push(() => this.db.pingCheck('typeorm'));
|
|
36
43
|
}
|
|
37
|
-
if (this.options.http) {
|
|
44
|
+
if (this.options.http && this.isReadinessIndicatorEnabled('http')) {
|
|
38
45
|
indicators.push(() => this.http.pingCheck('app-docs', this.options.http.docsUrl));
|
|
39
46
|
}
|
|
40
|
-
if (this.options.redis) {
|
|
47
|
+
if (this.options.redis && this.isReadinessIndicatorEnabled('redis')) {
|
|
41
48
|
indicators.push(() => this.pingRedis('redis', this.options.redis));
|
|
42
49
|
}
|
|
43
|
-
if (this.options.bull) {
|
|
50
|
+
if (this.options.bull && this.isReadinessIndicatorEnabled('bull')) {
|
|
44
51
|
indicators.push(() => this.pingRedis('bull', this.options.bull));
|
|
45
52
|
}
|
|
46
|
-
if (this.options.kafka) {
|
|
53
|
+
if (this.options.kafka && this.isReadinessIndicatorEnabled('kafka')) {
|
|
47
54
|
indicators.push(() => this.pingKafka());
|
|
48
55
|
}
|
|
49
56
|
return this.health.check(indicators);
|
|
@@ -75,23 +82,79 @@ let HealthCheckController = class HealthCheckController {
|
|
|
75
82
|
checkKafka() {
|
|
76
83
|
return this.health.check([() => this.pingKafka()]);
|
|
77
84
|
}
|
|
85
|
+
onModuleDestroy() {
|
|
86
|
+
for (const client of this.redisClients.values())
|
|
87
|
+
client.disconnect();
|
|
88
|
+
this.redisClients.clear();
|
|
89
|
+
}
|
|
78
90
|
pingRedis(name, options) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
username: options?.username,
|
|
85
|
-
password: options?.password,
|
|
86
|
-
db: options?.database,
|
|
87
|
-
tls: options?.tls
|
|
88
|
-
? {
|
|
89
|
-
host: options.host,
|
|
90
|
-
port: options.port,
|
|
91
|
-
}
|
|
92
|
-
: undefined,
|
|
93
|
-
},
|
|
91
|
+
const existing = this.redisProbes.get(name);
|
|
92
|
+
if (existing)
|
|
93
|
+
return existing;
|
|
94
|
+
const probe = this.runRedisProbe(name, options).finally(() => {
|
|
95
|
+
this.redisProbes.delete(name);
|
|
94
96
|
});
|
|
97
|
+
this.redisProbes.set(name, probe);
|
|
98
|
+
return probe;
|
|
99
|
+
}
|
|
100
|
+
async runRedisProbe(name, options) {
|
|
101
|
+
if (!options) {
|
|
102
|
+
throw new terminus_1.HealthCheckError('Redis health check failed', {
|
|
103
|
+
[name]: {
|
|
104
|
+
status: 'down',
|
|
105
|
+
message: 'Redis health check is not configured',
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const configuredTimeout = this.options.redisTimeoutMs;
|
|
110
|
+
const timeoutMs = Number.isFinite(configuredTimeout) && configuredTimeout > 0
|
|
111
|
+
? configuredTimeout
|
|
112
|
+
: 2000;
|
|
113
|
+
let client = this.redisClients.get(name);
|
|
114
|
+
if (!client) {
|
|
115
|
+
client = new ioredis_1.default({
|
|
116
|
+
host: options.host,
|
|
117
|
+
port: options.port,
|
|
118
|
+
username: options.username,
|
|
119
|
+
password: options.password,
|
|
120
|
+
db: options.database,
|
|
121
|
+
tls: options.tls ? {} : undefined,
|
|
122
|
+
connectTimeout: timeoutMs,
|
|
123
|
+
commandTimeout: timeoutMs,
|
|
124
|
+
maxRetriesPerRequest: 0,
|
|
125
|
+
enableOfflineQueue: false,
|
|
126
|
+
lazyConnect: true,
|
|
127
|
+
});
|
|
128
|
+
client.on('error', () => undefined);
|
|
129
|
+
this.redisClients.set(name, client);
|
|
130
|
+
}
|
|
131
|
+
let timer;
|
|
132
|
+
try {
|
|
133
|
+
await Promise.race([
|
|
134
|
+
(async () => {
|
|
135
|
+
if (client.status === 'wait')
|
|
136
|
+
await client.connect();
|
|
137
|
+
if ((await client.ping()) !== 'PONG')
|
|
138
|
+
throw new Error('Unexpected reply');
|
|
139
|
+
})(),
|
|
140
|
+
new Promise((_, reject) => {
|
|
141
|
+
timer = setTimeout(() => reject(new Error('Probe timeout')), timeoutMs);
|
|
142
|
+
}),
|
|
143
|
+
]);
|
|
144
|
+
return { [name]: { status: 'up' } };
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
client.disconnect();
|
|
148
|
+
if (this.redisClients.get(name) === client)
|
|
149
|
+
this.redisClients.delete(name);
|
|
150
|
+
throw new terminus_1.HealthCheckError('Redis health check failed', {
|
|
151
|
+
[name]: { status: 'down', message: 'Redis PING failed or timed out' },
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
if (timer)
|
|
156
|
+
clearTimeout(timer);
|
|
157
|
+
}
|
|
95
158
|
}
|
|
96
159
|
pingKafka() {
|
|
97
160
|
return this.microservice.pingCheck('kafka', {
|
|
@@ -107,6 +170,9 @@ let HealthCheckController = class HealthCheckController {
|
|
|
107
170
|
},
|
|
108
171
|
});
|
|
109
172
|
}
|
|
173
|
+
isReadinessIndicatorEnabled(indicator) {
|
|
174
|
+
return this.options.readiness?.[indicator] !== false;
|
|
175
|
+
}
|
|
110
176
|
};
|
|
111
177
|
exports.HealthCheckController = HealthCheckController;
|
|
112
178
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check.controller.js","sourceRoot":"","sources":["../src/health-check.controller.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"health-check.controller.js","sourceRoot":"","sources":["../src/health-check.controller.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mondart/nestjs-common-module-health-check",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.7",
|
|
4
4
|
"description": "Health check module for NestJS.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Mondart"
|
|
@@ -17,16 +17,17 @@
|
|
|
17
17
|
"build": "tsc -p tsconfig.json"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@mondart/nestjs-common-module-bottleneck": "3.2.
|
|
21
|
-
"@mondart/nestjs-common-module-caching": "3.2.
|
|
22
|
-
"@mondart/nestjs-common-module-core": "3.2.
|
|
23
|
-
"@mondart/nestjs-common-module-iam": "3.2.
|
|
20
|
+
"@mondart/nestjs-common-module-bottleneck": "3.2.12",
|
|
21
|
+
"@mondart/nestjs-common-module-caching": "3.2.4",
|
|
22
|
+
"@mondart/nestjs-common-module-core": "3.2.10",
|
|
23
|
+
"@mondart/nestjs-common-module-iam": "3.2.11",
|
|
24
24
|
"@nestjs/axios": "^4.0.0",
|
|
25
25
|
"@nestjs/microservices": "^11.1.10",
|
|
26
26
|
"@nestjs/terminus": "^11.0.0",
|
|
27
27
|
"axios": "~1.16.1",
|
|
28
28
|
"express-basic-auth": "^1.2.1",
|
|
29
|
-
"kafkajs": "^2.2.4"
|
|
29
|
+
"kafkajs": "^2.2.4",
|
|
30
|
+
"ioredis": "^5.4.1"
|
|
30
31
|
},
|
|
31
32
|
"peerDependencies": {
|
|
32
33
|
"@nestjs/common": "^11.1.10",
|