Fresh — современный фреймворк для построения веб-приложений на JavaScript и Deno, ориентированный на производительность и минимальную зависимость от клиентского JavaScript. Одной из ключевых задач при эксплуатации приложений является мониторинг их доступности (uptime monitoring). Этот процесс позволяет отслеживать работоспособность сервисов и своевременно реагировать на сбои.
Мониторинг доступности в Fresh строится вокруг серверных обработчиков и задач по расписанию. Основные компоненты:
Обработчики HTTP-запросов (Routes) Fresh использует файл-ориентированную маршрутизацию. Для проверки состояния сервиса создаются отдельные маршруты, например:
// routes/api/health.ts
import { Handlers } from "$fresh/server.ts";
export const handler: Handlers = {
GET(_req) {
return new Response(JSON.stringify({ status: "ok" }), {
headers: { "Content-Type": "application/json" },
});
},
};
Такой эндпоинт может использоваться как ping-проверка. Он возвращает статус приложения без нагрузки на бизнес-логику.
Фоновые задачи (Cron / Scheduled Tasks) Для
постоянной проверки внешних сервисов или внутренних маршрутов
применяются фоновые задачи. В Deno и Fresh можно
настроить периодические проверки с использованием
setInterval или сторонних библиотек для cron-подобного
поведения:
import { fetch } from "undici";
setInterval(async () => {
try {
const res = await fetch("https://example.com/api/health");
if (res.status !== 200) {
console.error("Сервис недоступен:", res.status);
}
} catch (err) {
console.error("Ошибка подключения:", err);
}
}, 60000); // Проверка каждые 60 секунд
Этот подход позволяет вести логирование доступности и оперативно реагировать на сбои.
Для эффективного мониторинга необходимо собирать и хранить метрики:
Fresh не предоставляет встроенной системы метрик, поэтому рекомендуется интеграция с внешними инструментами: Prometheus, Grafana, Datadog. Для экспорта метрик используется API-подход: каждая проверка отправляет данные на сервер метрик.
async function reportMetrics(status, latency) {
await fetch("https://metrics.example.com/ingest", {
method: "POST",
body: JSON.stringify({ status, latency, timestamp: Date.now() }),
headers: { "Content-Type": "application/json" },
});
}
Мониторинг без уведомлений бесполезен. Для Fresh можно использовать два подхода:
Пример webhook-уведомления:
async function sendAlert(message) {
await fetch("https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXX", {
method: "POST",
body: JSON.stringify({ text: message }),
headers: { "Content-Type": "application/json" },
});
}
Эта схема позволяет автоматически информировать команду о проблемах, снижая время реакции.
Важной частью uptime monitoring является обработка ошибок без падения приложения:
try/catch при запросах к внешним
сервисам.try {
const res = await fetch("https://example.com/api/health");
if (!res.ok) throw new Error(`HTTP ${res.status}`);
} catch (err) {
console.error("Мониторинг: сервис недоступен", err);
}
Для наглядного контроля uptime можно строить дашборды:
Fresh совместим с frontend-фреймворками и библиотеками визуализации, такими как D3.js или Chart.js, что позволяет встроить дашборд прямо в административную панель приложения.
Мониторинг доступности напрямую влияет на процессы DevOps:
Использование Fresh с Deno Deploy или другими облачными платформами обеспечивает минимальные задержки и высокую надежность мониторинга за счет серверного исполнения без лишней клиентской нагрузки.