为 NestJS 发布状态页的三种方式
选择所需的控制级别 — 零代码、低代码或完全 headless。
托管
添加 NestJS 端点,把 CNAME 指向 status.yourdomain.com,完成。5 分钟搞定。
嵌入式徽章
将 SVG 正常运行时间和状态徽章放入 README 或落地页。每 5 分钟自动更新。
把这个 health 端点加入你的 NestJS 应用
复制、粘贴、把 PulseAPI 指向 URL。健康时返回 200,降级时返回 503。
src/health/health.controller.ts
import { Controller, Get } from '@nestjs/common'
import {
HealthCheck,
HealthCheckService,
TypeOrmHealthIndicator,
MemoryHealthIndicator,
} from '@nestjs/terminus'
@Controller('health')
export class HealthController {
constructor(
private health: HealthCheckService,
private db: TypeOrmHealthIndicator,
private memory: MemoryHealthIndicator,
) {}
@Get()
@HealthCheck()
check() {
return this.health.check([
() => this.db.pingCheck('database'),
() => this.memory.checkHeap('memory_heap', 300 * 1024 * 1024),
])
}
}Terminus 默认返回 PulseAPI 能断言的结构 — `$.details.database.status == "up"` 开箱即用。
NestJS 应用会出什么故障 — 如何捕获
应用坏掉但 Terminus 指标仍通过
关键服务宕机时 db ping 仍可能成功。叠加 HTTP ping 和 schema 断言以获得真实覆盖。
微服务传输层故障
gRPC 或 Redis 掉线导致静默超时。直接监控每个微服务端点。
BullMQ 处理器崩溃
Worker 退出后 API 仍保持在线。暴露处理器心跳并在停止时告警。
为自定义页面代理状态数据的 Nest 控制器。
import { Controller, Get } from '@nestjs/common'
import { HttpService } from '@nestjs/axios'
import { firstValueFrom } from 'rxjs'
@Controller('status')
export class StatusController {
constructor(private http: HttpService) {}
@Get()
async status() {
const res = await firstValueFrom(
this.http.get('https://api.pulseapi.tech/status/acme', { timeout: 5000 }),
)
return res.data
}
}NestJS 监控 — FAQ
能否开箱使用 Terminus?
可以。Terminus 的默认响应结构直接映射到我们的 JSON-path 断言。
能否监控微服务?
可以。用 HTTP 暴露每个健康检查,作为独立端点添加。
支持 GraphQL 吗?
支持。POST 一个 query 并对 JSON 响应结构断言。
能从 NestJS 渲染状态页吗?
可以。在控制器中调用 API 并返回 JSON,或用 Handlebars/MJML 渲染。