Uptime monitoring

Fresh — современный фреймворк для построения веб-приложений на JavaScript и Deno, ориентированный на производительность и минимальную зависимость от клиентского JavaScript. Одной из ключевых задач при эксплуатации приложений является мониторинг их доступности (uptime monitoring). Этот процесс позволяет отслеживать работоспособность сервисов и своевременно реагировать на сбои.

Архитектура мониторинга

Мониторинг доступности в Fresh строится вокруг серверных обработчиков и задач по расписанию. Основные компоненты:

  1. Обработчики 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-проверка. Он возвращает статус приложения без нагрузки на бизнес-логику.

  2. Фоновые задачи (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 секунд

    Этот подход позволяет вести логирование доступности и оперативно реагировать на сбои.

Метрики и логирование

Для эффективного мониторинга необходимо собирать и хранить метрики:

  • HTTP-коды ответов — 200, 503, 500 и др.
  • Время отклика — latency, важное для SLA.
  • Количество ошибок за интервал — позволяет строить графики надежности.

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 можно использовать два подхода:

  1. Webhook-уведомления — отправка POST-запроса в Slack, Telegram, или собственный алертинг-сервис при обнаружении ошибки.
  2. Email / SMS уведомления — интеграция с сервисами вроде SendGrid, Twilio или Mailgun.

Пример 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 при запросах к внешним сервисам.
  • Логирование не только ошибок соединения, но и неожиданных HTTP-кодов.
  • Разделение мониторинга и основной логики приложения для минимизации влияния сбоев.
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

Мониторинг доступности напрямую влияет на процессы DevOps:

  • Автоматическое масштабирование при падении сервисов.
  • Сбор статистики для анализа SLA.
  • Тестирование отказоустойчивости при обновлениях.

Использование Fresh с Deno Deploy или другими облачными платформами обеспечивает минимальные задержки и высокую надежность мониторинга за счет серверного исполнения без лишней клиентской нагрузки.