Files
speckle-server/packages/server/healthchecks/postgres.ts
T
Iain Sproat 27a0600dcd feat(server): multi-region aware liveness and readiness checks (#3468)
* 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
2024-12-11 09:29:53 +00:00

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
}