@mondart/nestjs-common-module-health-check 3.3.10 → 3.3.11
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 +22 -0
- package/dist/health-check-options.interface.d.ts +8 -0
- package/dist/health-check-options.interface.d.ts.map +1 -1
- package/dist/health-check.controller.d.ts +24 -5
- package/dist/health-check.controller.d.ts.map +1 -1
- package/dist/health-check.controller.js +103 -58
- package/dist/health-check.controller.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,6 +61,22 @@ HealthCheckModule.register({
|
|
|
61
61
|
});
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
+
Use `timeouts` to set a deadline in milliseconds per indicator. Omitted or
|
|
65
|
+
invalid values use the defaults (database 1000, http 2000, redis 2000,
|
|
66
|
+
bull 2000, kafka 2000). The deprecated `redisTimeoutMs` still applies to
|
|
67
|
+
`redis`/`bull` when `timeouts` doesn't set them:
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
HealthCheckModule.register({
|
|
71
|
+
redis: { host: 'localhost', port: 6379 },
|
|
72
|
+
kafka: { clientId: 'my-service', brokers: ['localhost:9092'] },
|
|
73
|
+
timeouts: { database: 3000, redis: 1000, kafka: 5000 },
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Keep the slowest timeout below the orchestrator's probe timeout, or the probe
|
|
78
|
+
fails before the check reports which dependency is slow.
|
|
79
|
+
|
|
64
80
|
Use `/live` for container restart decisions and `/ready` for load-balancer
|
|
65
81
|
traffic decisions.
|
|
66
82
|
|
|
@@ -76,6 +92,12 @@ traffic decisions.
|
|
|
76
92
|
| `GET /health-check/bull` | The configured `bull` connection only. |
|
|
77
93
|
| `GET /health-check/kafka` | The configured `kafka` brokers only. |
|
|
78
94
|
|
|
95
|
+
A single-dependency route whose option isn't set (or `database: false` for
|
|
96
|
+
`/database`) reports that indicator as `down` with "health check is not
|
|
97
|
+
configured". Redis, Bull and Kafka each keep one connection open between
|
|
98
|
+
probes and replace it after a failure; errors are reported without the
|
|
99
|
+
underlying driver message.
|
|
100
|
+
|
|
79
101
|
If a `messagePattern` option is passed to `register`/`registerAsync`, the
|
|
80
102
|
same aggregate check is also exposed as a `@MessagePattern` handler, so it
|
|
81
103
|
can be invoked over a microservice transport in addition to the HTTP route.
|
|
@@ -9,9 +9,17 @@ export interface HealthCheckReadinessOptions {
|
|
|
9
9
|
bull?: boolean;
|
|
10
10
|
kafka?: boolean;
|
|
11
11
|
}
|
|
12
|
+
export interface HealthCheckTimeoutOptions {
|
|
13
|
+
database?: number;
|
|
14
|
+
http?: number;
|
|
15
|
+
redis?: number;
|
|
16
|
+
bull?: number;
|
|
17
|
+
kafka?: number;
|
|
18
|
+
}
|
|
12
19
|
export interface HealthCheckModuleOptions {
|
|
13
20
|
messagePattern?: string;
|
|
14
21
|
redisTimeoutMs?: number;
|
|
22
|
+
timeouts?: HealthCheckTimeoutOptions;
|
|
15
23
|
http?: {
|
|
16
24
|
docsUrl: string;
|
|
17
25
|
};
|
|
@@ -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,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;
|
|
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;AAOD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IAKxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,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,15 +1,15 @@
|
|
|
1
1
|
import { Type, OnModuleDestroy } from '@nestjs/common';
|
|
2
|
-
import { HealthCheckService, HttpHealthIndicator,
|
|
2
|
+
import { HealthCheckService, HttpHealthIndicator, TypeOrmHealthIndicator } from '@nestjs/terminus';
|
|
3
3
|
import { HealthCheckModuleOptions } from './health-check-options.interface';
|
|
4
4
|
export declare class HealthCheckController implements OnModuleDestroy {
|
|
5
5
|
private health;
|
|
6
6
|
private http;
|
|
7
7
|
private db;
|
|
8
|
-
private microservice;
|
|
9
8
|
private options;
|
|
10
9
|
private readonly redisClients;
|
|
11
|
-
private
|
|
12
|
-
|
|
10
|
+
private kafkaAdmin?;
|
|
11
|
+
private readonly probes;
|
|
12
|
+
constructor(health: HealthCheckService, http: HttpHealthIndicator, db: TypeOrmHealthIndicator, options: HealthCheckModuleOptions);
|
|
13
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>>>>>;
|
|
14
14
|
checkLive(): {
|
|
15
15
|
status: string;
|
|
@@ -43,11 +43,30 @@ export declare class HealthCheckController implements OnModuleDestroy {
|
|
|
43
43
|
status: "up";
|
|
44
44
|
};
|
|
45
45
|
}>>>;
|
|
46
|
-
checkKafka(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> &
|
|
46
|
+
checkKafka(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & {
|
|
47
|
+
[key: string]: {
|
|
48
|
+
status: "up";
|
|
49
|
+
};
|
|
50
|
+
}, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & {
|
|
51
|
+
[key: string]: {
|
|
52
|
+
status: "up";
|
|
53
|
+
};
|
|
54
|
+
}>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>> & {
|
|
55
|
+
[key: string]: {
|
|
56
|
+
status: "up";
|
|
57
|
+
};
|
|
58
|
+
}>>>;
|
|
47
59
|
onModuleDestroy(): void;
|
|
60
|
+
private shareProbe;
|
|
61
|
+
private withTimeout;
|
|
62
|
+
private notConfigured;
|
|
48
63
|
private pingRedis;
|
|
49
64
|
private runRedisProbe;
|
|
65
|
+
private pingDatabase;
|
|
66
|
+
private pingHttp;
|
|
50
67
|
private pingKafka;
|
|
68
|
+
private runKafkaProbe;
|
|
69
|
+
private timeoutFor;
|
|
51
70
|
private isReadinessIndicatorEnabled;
|
|
52
71
|
}
|
|
53
72
|
export declare function createHealthCheckController(messagePattern?: string): Type<HealthCheckController>;
|
|
@@ -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,eAAe,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;AAIhF,OAAO,EAGL,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,wBAAwB,EAEzB,MAAM,kCAAkC,CAAC;AAY1C,qBAIa,qBAAsB,YAAW,eAAe;IAQzD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,EAAE;IAEV,OAAO,CAAC,OAAO;IAXjB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGnB;gBAEM,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,mBAAmB,EACzB,EAAE,EAAE,sBAAsB,EAE1B,OAAO,EAAE,wBAAwB;IAU3C,QAAQ;IAmCR,SAAS;;;IAST,UAAU;IAOV,SAAS;IAMT,YAAY;IAOZ,UAAU;;oBAjF2B,IAAI;;;;oBAAJ,IAAI;;;;oBAAJ,IAAI;;;IA0FzC,SAAS;;oBA1F4B,IAAI;;;;oBAAJ,IAAI;;;;oBAAJ,IAAI;;;IAiGzC,UAAU;;oBAjG2B,IAAI;;;;oBAAJ,IAAI;;;;oBAAJ,IAAI;;;IAqGzC,eAAe,IAAI,IAAI;IAQvB,OAAO,CAAC,UAAU;YAWJ,WAAW;IAiBzB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,SAAS;YAIH,aAAa;IAiD3B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,SAAS;YAKH,aAAa;IAuC3B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,2BAA2B;CAKpC;AAQD,wBAAgB,2BAA2B,CACzC,cAAc,CAAC,EAAE,MAAM,GACtB,IAAI,CAAC,qBAAqB,CAAC,CAqB7B"}
|
|
@@ -19,6 +19,7 @@ exports.HealthCheckController = void 0;
|
|
|
19
19
|
exports.createHealthCheckController = createHealthCheckController;
|
|
20
20
|
const common_1 = require("@nestjs/common");
|
|
21
21
|
const ioredis_1 = __importDefault(require("ioredis"));
|
|
22
|
+
const kafkajs_1 = require("kafkajs");
|
|
22
23
|
const microservices_1 = require("@nestjs/microservices");
|
|
23
24
|
const terminus_1 = require("@nestjs/terminus");
|
|
24
25
|
const health_check_options_interface_1 = require("./health-check-options.interface");
|
|
@@ -26,23 +27,22 @@ const nestjs_common_module_bottleneck_1 = require("@mondart/nestjs-common-module
|
|
|
26
27
|
const nestjs_common_module_caching_1 = require("@mondart/nestjs-common-module-caching");
|
|
27
28
|
const nestjs_common_module_iam_1 = require("@mondart/nestjs-common-module-iam");
|
|
28
29
|
let HealthCheckController = class HealthCheckController {
|
|
29
|
-
constructor(health, http, db,
|
|
30
|
+
constructor(health, http, db, options) {
|
|
30
31
|
this.health = health;
|
|
31
32
|
this.http = http;
|
|
32
33
|
this.db = db;
|
|
33
|
-
this.microservice = microservice;
|
|
34
34
|
this.options = options;
|
|
35
35
|
this.redisClients = new Map();
|
|
36
|
-
this.
|
|
36
|
+
this.probes = new Map();
|
|
37
37
|
}
|
|
38
38
|
checkAll() {
|
|
39
39
|
const indicators = [];
|
|
40
40
|
if (this.options.database !== false &&
|
|
41
41
|
this.isReadinessIndicatorEnabled('database')) {
|
|
42
|
-
indicators.push(() => this.
|
|
42
|
+
indicators.push(() => this.pingDatabase());
|
|
43
43
|
}
|
|
44
44
|
if (this.options.http && this.isReadinessIndicatorEnabled('http')) {
|
|
45
|
-
indicators.push(() => this.
|
|
45
|
+
indicators.push(() => this.pingHttp());
|
|
46
46
|
}
|
|
47
47
|
if (this.options.redis && this.isReadinessIndicatorEnabled('redis')) {
|
|
48
48
|
indicators.push(() => this.pingRedis('redis', this.options.redis));
|
|
@@ -64,12 +64,10 @@ let HealthCheckController = class HealthCheckController {
|
|
|
64
64
|
return this.checkAll();
|
|
65
65
|
}
|
|
66
66
|
checkHttp() {
|
|
67
|
-
return this.health.check([
|
|
68
|
-
() => this.http.pingCheck('app-docs', this.options?.http?.docsUrl),
|
|
69
|
-
]);
|
|
67
|
+
return this.health.check([() => this.pingHttp()]);
|
|
70
68
|
}
|
|
71
69
|
checkTypeOrm() {
|
|
72
|
-
return this.health.check([
|
|
70
|
+
return this.health.check([() => this.pingDatabase()]);
|
|
73
71
|
}
|
|
74
72
|
checkRedis() {
|
|
75
73
|
return this.health.check([
|
|
@@ -86,30 +84,47 @@ let HealthCheckController = class HealthCheckController {
|
|
|
86
84
|
for (const client of this.redisClients.values())
|
|
87
85
|
client.disconnect();
|
|
88
86
|
this.redisClients.clear();
|
|
87
|
+
void this.kafkaAdmin?.disconnect().catch(() => undefined);
|
|
88
|
+
this.kafkaAdmin = undefined;
|
|
89
89
|
}
|
|
90
|
-
|
|
91
|
-
const existing = this.
|
|
90
|
+
shareProbe(name, run) {
|
|
91
|
+
const existing = this.probes.get(name);
|
|
92
92
|
if (existing)
|
|
93
93
|
return existing;
|
|
94
|
-
const probe =
|
|
95
|
-
|
|
96
|
-
});
|
|
97
|
-
this.redisProbes.set(name, probe);
|
|
94
|
+
const probe = run().finally(() => this.probes.delete(name));
|
|
95
|
+
this.probes.set(name, probe);
|
|
98
96
|
return probe;
|
|
99
97
|
}
|
|
100
|
-
async
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
98
|
+
async withTimeout(work, timeoutMs) {
|
|
99
|
+
let timer;
|
|
100
|
+
try {
|
|
101
|
+
await Promise.race([
|
|
102
|
+
work,
|
|
103
|
+
new Promise((_, reject) => {
|
|
104
|
+
timer = setTimeout(() => reject(new Error('Probe timeout')), timeoutMs);
|
|
105
|
+
}),
|
|
106
|
+
]);
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
if (timer)
|
|
110
|
+
clearTimeout(timer);
|
|
108
111
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
:
|
|
112
|
+
}
|
|
113
|
+
notConfigured(name, label) {
|
|
114
|
+
throw new terminus_1.HealthCheckError(`${label} health check failed`, {
|
|
115
|
+
[name]: {
|
|
116
|
+
status: 'down',
|
|
117
|
+
message: `${label} health check is not configured`,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
pingRedis(name, options) {
|
|
122
|
+
return this.shareProbe(name, () => this.runRedisProbe(name, options));
|
|
123
|
+
}
|
|
124
|
+
async runRedisProbe(name, options) {
|
|
125
|
+
if (!options)
|
|
126
|
+
this.notConfigured(name, 'Redis');
|
|
127
|
+
const timeoutMs = this.timeoutFor(this.options.timeouts?.[name], this.timeoutFor(this.options.redisTimeoutMs, 2000));
|
|
113
128
|
let client = this.redisClients.get(name);
|
|
114
129
|
if (!client) {
|
|
115
130
|
client = new ioredis_1.default({
|
|
@@ -128,19 +143,13 @@ let HealthCheckController = class HealthCheckController {
|
|
|
128
143
|
client.on('error', () => undefined);
|
|
129
144
|
this.redisClients.set(name, client);
|
|
130
145
|
}
|
|
131
|
-
let timer;
|
|
132
146
|
try {
|
|
133
|
-
await
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
})(),
|
|
140
|
-
new Promise((_, reject) => {
|
|
141
|
-
timer = setTimeout(() => reject(new Error('Probe timeout')), timeoutMs);
|
|
142
|
-
}),
|
|
143
|
-
]);
|
|
147
|
+
await this.withTimeout((async () => {
|
|
148
|
+
if (client.status === 'wait')
|
|
149
|
+
await client.connect();
|
|
150
|
+
if ((await client.ping()) !== 'PONG')
|
|
151
|
+
throw new Error('Unexpected reply');
|
|
152
|
+
})(), timeoutMs);
|
|
144
153
|
return { [name]: { status: 'up' } };
|
|
145
154
|
}
|
|
146
155
|
catch {
|
|
@@ -151,25 +160,62 @@ let HealthCheckController = class HealthCheckController {
|
|
|
151
160
|
[name]: { status: 'down', message: 'Redis PING failed or timed out' },
|
|
152
161
|
});
|
|
153
162
|
}
|
|
154
|
-
finally {
|
|
155
|
-
if (timer)
|
|
156
|
-
clearTimeout(timer);
|
|
157
|
-
}
|
|
158
163
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
164
|
+
pingDatabase() {
|
|
165
|
+
if (this.options.database === false)
|
|
166
|
+
this.notConfigured('typeorm', 'Database');
|
|
167
|
+
return this.db.pingCheck('typeorm', {
|
|
168
|
+
timeout: this.timeoutFor(this.options.timeouts?.database, 1000),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
pingHttp() {
|
|
172
|
+
if (!this.options.http?.docsUrl)
|
|
173
|
+
this.notConfigured('app-docs', 'HTTP');
|
|
174
|
+
return this.http.pingCheck('app-docs', this.options.http.docsUrl, {
|
|
175
|
+
timeout: this.timeoutFor(this.options.timeouts?.http, 2000),
|
|
171
176
|
});
|
|
172
177
|
}
|
|
178
|
+
pingKafka() {
|
|
179
|
+
return this.shareProbe('kafka', () => this.runKafkaProbe());
|
|
180
|
+
}
|
|
181
|
+
async runKafkaProbe() {
|
|
182
|
+
const options = this.options.kafka;
|
|
183
|
+
if (!options)
|
|
184
|
+
this.notConfigured('kafka', 'Kafka');
|
|
185
|
+
const timeoutMs = this.timeoutFor(this.options.timeouts?.kafka, 2000);
|
|
186
|
+
let admin = this.kafkaAdmin;
|
|
187
|
+
try {
|
|
188
|
+
await this.withTimeout((async () => {
|
|
189
|
+
if (!admin) {
|
|
190
|
+
admin = new kafkajs_1.Kafka({
|
|
191
|
+
clientId: options.clientId,
|
|
192
|
+
brokers: options.brokers,
|
|
193
|
+
sasl: options.sasl,
|
|
194
|
+
ssl: options.ssl,
|
|
195
|
+
connectionTimeout: timeoutMs,
|
|
196
|
+
requestTimeout: timeoutMs,
|
|
197
|
+
retry: { retries: 0 },
|
|
198
|
+
logLevel: kafkajs_1.logLevel.NOTHING,
|
|
199
|
+
}).admin();
|
|
200
|
+
this.kafkaAdmin = admin;
|
|
201
|
+
await admin.connect();
|
|
202
|
+
}
|
|
203
|
+
await admin.describeCluster();
|
|
204
|
+
})(), timeoutMs);
|
|
205
|
+
return { kafka: { status: 'up' } };
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
void admin?.disconnect().catch(() => undefined);
|
|
209
|
+
if (this.kafkaAdmin === admin)
|
|
210
|
+
this.kafkaAdmin = undefined;
|
|
211
|
+
throw new terminus_1.HealthCheckError('Kafka health check failed', {
|
|
212
|
+
kafka: { status: 'down', message: 'Kafka ping failed or timed out' },
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
timeoutFor(value, fallback) {
|
|
217
|
+
return Number.isFinite(value) && value > 0 ? value : fallback;
|
|
218
|
+
}
|
|
173
219
|
isReadinessIndicatorEnabled(indicator) {
|
|
174
220
|
return this.options.readiness?.[indicator] !== false;
|
|
175
221
|
}
|
|
@@ -228,11 +274,10 @@ exports.HealthCheckController = HealthCheckController = __decorate([
|
|
|
228
274
|
(0, nestjs_common_module_caching_1.SkipCachingInterceptorDecorator)(),
|
|
229
275
|
(0, nestjs_common_module_bottleneck_1.SkipBottleneckDecorator)(),
|
|
230
276
|
(0, common_1.Controller)('health-check'),
|
|
231
|
-
__param(
|
|
277
|
+
__param(3, (0, common_1.Inject)(health_check_options_interface_1.HEALTH_CHECK_MODULE_OPTIONS)),
|
|
232
278
|
__metadata("design:paramtypes", [terminus_1.HealthCheckService,
|
|
233
279
|
terminus_1.HttpHealthIndicator,
|
|
234
|
-
terminus_1.TypeOrmHealthIndicator,
|
|
235
|
-
terminus_1.MicroserviceHealthIndicator, Object])
|
|
280
|
+
terminus_1.TypeOrmHealthIndicator, Object])
|
|
236
281
|
], HealthCheckController);
|
|
237
282
|
function createHealthCheckController(messagePattern) {
|
|
238
283
|
class ConfiguredHealthCheckController extends HealthCheckController {
|
|
@@ -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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"}
|