Страница статуса и мониторинг uptime для приложений NestJS
Мониторинг NestJS-контроллеров, провайдеров, микросервисов и BullMQ-воркеров. Terminus-style health естественно ложится на наши JSON-ассершны.
Три способа запустить страницу статуса для NestJS
Выберите нужный уровень контроля — zero-code, low-code или полный headless.
Хостед
Добавьте NestJS-эндпоинт, направьте CNAME на status.yourdomain.com — готово. 5 минут.
Headless
Через публичный API собрать свою UI прямо в NestJS-приложении. Полный контроль дизайна и брендинга.
Смотреть APIВстраиваемые бейджи
SVG-бейджи uptime и статуса в README или лендинг. Обновляются каждые 5 минут.
Вставьте этот health endpoint в своё NestJS-приложение
Скопируйте, вставьте, направьте PulseAPI на URL. 200 — здоров, 503 — деградация.
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 уже отдаёт нужную форму — `$.details.database.status == "up"` работает из коробки.
Что ломается в NestJS-приложениях и как это поймать
Индикаторы Terminus зелёные при сломанной апп
DB-пинг может проходить, пока критический сервис упал. Сочетайте HTTP-пинги и schema-ассершны.
Отказы транспорта микросервисов
Падения gRPC или Redis дают тихие таймауты. Мониторьте каждый микросервис напрямую.
Падающие процессоры BullMQ
Воркер может выйти, API работает. Экспозируйте heartbeat и алертьте.
Не нравится наша страница статуса? Соберите свою на NestJS.
Наш API отдаёт те же данные, что потребляет наша хостед-UI. Полная OpenAPI-спека на api.pulseapi.tech/docs.
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 ассершны.
Можно мониторить микросервисы?
Да. Экспозируйте каждую health-проверку по HTTP и добавляйте как отдельные эндпоинты.
Поддерживает GraphQL?
Да. POST-запрос с query и ассершн по форме JSON-ответа.
Можно рендерить страницу статуса из NestJS?
Да. Запрос API в контроллере и возврат JSON, или рендер Handlebars/MJML.
Запустите мониторинг NestJS-приложения за 5 минут
Бесплатный тариф, без карты. Добавьте эндпоинт, получайте алерты о падениях.