@chrono-os/health-nest
v0.1.1
Published
Health check para NestJS: GET /health com checks de dependência (banco, Redis, heartbeat) em paralelo, timeout por check, 200 ok ou 503 degraded, sem vazar erro interno no corpo; GET /health/live para liveness.
Maintainers
Readme
@chrono-os/health-nest
Health check para backend NestJS. GET /health roda os checks de dependência em paralelo, cada um com timeout próprio, e responde 200 {status:'ok'} ou 503 {status:'degraded'}. GET /health/live responde 200 enquanto o processo estiver vivo, sem tocar em nada.
Substitui o HealthController repetido no parque: uns devolvem 200 fixo sem olhar o banco (o orquestrador diz "saudável" com o Postgres fora), outros põem a mensagem do erro no corpo, e nenhum tem timeout (banco travado trava o health junto).
import { HealthModule, prismaPing } from '@chrono-os/health-nest'
@Module({
imports: [
HealthModule.forRootAsync({
inject: [PrismaService],
useFactory: (prisma: PrismaService) => ({
checks: {
db: prismaPing(prisma), // SELECT 1
redis: async () => (await redis.ping()) === 'PONG',
zapi: { run: () => !getZapiHealth().degraded, critical: false },
},
timeoutMs: 2000,
info: { service: 'meu-backend' },
}),
decorators: [Public(), SkipThrottle()], // libera do guard global
}),
],
})
export class AppModule {}Resposta:
{ "service": "meu-backend", "status": "degraded",
"checks": { "db": { "status": "falha", "latencyMs": 2001 }, "redis": { "status": "ok", "latencyMs": 3 } } }Regras
- Um check falha quando lança, rejeita, devolve
falseou passa dotimeoutMs(default 3000, pode ser definido por check). - O corpo nunca leva o erro. Só
ok/falhae a latência. O motivo vai para o log do servidor (Loggerdo Nest, ouonFailure(name, error)). Mensagem de erro do Prisma/pg costuma trazer host, usuário e nome do banco. critical: falsedeixa o check só informativo: aparece no corpo, mas não derruba para 503.- Prisma não é dependência.
prismaPing(client)chama$queryRawUnsafe('SELECT 1');sqlPing(pool)servepg. Qualquer() => Promisetambém vale. pathmuda o prefixo (default'health', aceita array);live: falsetira a sub-rota de liveness.- Com
setGlobalPrefix, exclua as rotas:app.setGlobalPrefix('api/v1', { exclude: ['health', 'health/live'] }). - Backend Fastify (sem Nest) usa só o núcleo:
import { runHealthChecks } from '@chrono-os/health-nest/core'.
Peers: @nestjs/common e @nestjs/core 11.
