Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BC-8308 add warning if an error occurs during healtch check #5310

Merged
merged 9 commits into from
Oct 28, 2024
Merged
2 changes: 2 additions & 0 deletions apps/server/src/modules/health/health-api.module.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { Module } from '@nestjs/common';

import { LoggerModule } from '@src/core/logger';
import { HealthController } from './controller';
import { HealthCheckRepo } from './repo';
import { HealthService } from './service';
import { HealthUC } from './uc';

@Module({
imports: [LoggerModule],
controllers: [HealthController],
providers: [HealthCheckRepo, HealthService, HealthUC],
})
Expand Down
26 changes: 24 additions & 2 deletions apps/server/src/modules/health/uc/health.uc.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { Injectable } from '@nestjs/common';

import { Loggable, LoggableMessage } from '@shared/common/loggable';
import { Logger } from '@src/core/logger';
import { HealthService } from '../service';
import { HealthConfig } from '../health.config';
import { HealthStatuses, HealthStatusCheck, HealthStatus } from '../domain';
Expand All @@ -25,9 +27,28 @@ function hasMessage(error: unknown): error is { message: string } {
);
}

class HealthCheckErrorLoggable implements Loggable {
constructor(private readonly error: unknown) {}

getLogMessage(): LoggableMessage {
if (this.error instanceof Error) {
return {
message: this.error.message,
stack: this.error.stack,
};
}
return {
message: String(this.error),
stack: undefined,
};
}
}

Loki-Afro marked this conversation as resolved.
Show resolved Hide resolved
@Injectable()
export class HealthUC {
constructor(private readonly healthService: HealthService) {}
constructor(private readonly healthService: HealthService, private readonly logger: Logger) {
this.logger.setContext(HealthUC.name);
}

checkSelfHealth(): HealthStatus {
// This health check verifies just the correct module setup and doesn't include
Expand All @@ -43,7 +64,7 @@ export class HealthUC {
async checkOverallHealth(): Promise<HealthStatus> {
// The below check allows for turning off the MongoDB dependency on the health check -
// it shouldn't be typically used, but if this health check will be used e.g. in the k8s
// liveness or readiness probes and, for any reason, there would be a need to stop
// liveliness or readiness probes and, for any reason, there would be a need to stop
// including MongoDB check in the overall API health checks, the HEALTH_CHECKS_EXCLUDE_MONGODB
// config var can be set to 'true' to disable it. This way, as currently only this single
// MongoDB check is included in the overall API health checks, the whole health check will
Expand All @@ -70,6 +91,7 @@ export class HealthUC {

await this.healthService.upsertHealthCheckById(healthCheckID);
} catch (error) {
this.logger.warning(new HealthCheckErrorLoggable(error));
// If any error occurred in the database operation execution it should be indicated
// as a MongoDB check failure (and thus the whole health check should fail).

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { Module } from '@nestjs/common';
import { MikroOrmModule } from '@mikro-orm/nestjs';

import { DB_URL, DB_USERNAME, DB_PASSWORD } from '@src/config';
import { DB_URL, DB_USERNAME, DB_PASSWORD, createConfigModuleOptions } from '@src/config';
import { HealthApiModule, HealthEntities } from '@src/modules/health';
import { ConfigModule } from '@nestjs/config';
import { serverConfig } from '@modules/server';

@Module({
imports: [
Expand All @@ -16,6 +18,7 @@ import { HealthApiModule, HealthEntities } from '@src/modules/health';
// debug: true, // use it only for the local queries debugging
}),
HealthApiModule,
ConfigModule.forRoot(createConfigModuleOptions(serverConfig)),
],
})
export class InternalServerModule {}
Loading