27a0600dcd
* chore(healthchecks): refactor out of modules * feat(server): multi-region aware liveness and readiness checks * Add tests for redis & postgres healthchecks * do not close Redis client after checking it is healthy, we now use a shared client
41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import type { Knex } from 'knex'
|
|
import { getServerInfoFactory } from '@/modules/core/repositories/server'
|
|
import { getAllRegisteredDbClients } from '@/modules/multiregion/utils/dbSelector'
|
|
import type { CheckResponse, MultiDBCheck } from '@/healthchecks/types'
|
|
import { ensureErrorOrWrapAsCause } from '@/modules/shared/errors/ensureError'
|
|
import { ensureError } from '@speckle/shared'
|
|
|
|
type DBCheck = (params: { db: Knex }) => Promise<CheckResponse>
|
|
|
|
export const isPostgresAlive: DBCheck = async (params) => {
|
|
const { db } = params
|
|
const getServerInfo = getServerInfoFactory({ db })
|
|
|
|
try {
|
|
await getServerInfo()
|
|
} catch (err) {
|
|
return { isAlive: false, err: ensureError(err, 'Unknown Postgres error.') }
|
|
}
|
|
return { isAlive: true }
|
|
}
|
|
|
|
export const areAllPostgresAlive: MultiDBCheck = async (): Promise<
|
|
Record<string, CheckResponse>
|
|
> => {
|
|
const clients = await getAllRegisteredDbClients()
|
|
|
|
const results: Record<string, CheckResponse> = {}
|
|
for (const dbClient of clients) {
|
|
try {
|
|
results[dbClient.regionKey] = await isPostgresAlive({ db: dbClient.client })
|
|
} catch (err) {
|
|
results[dbClient.regionKey] = {
|
|
isAlive: false,
|
|
err: ensureErrorOrWrapAsCause(err, 'Unknown postgres error.')
|
|
}
|
|
}
|
|
}
|
|
|
|
return results
|
|
}
|