Почему нужно мониторить Cloudflare Workers
Cloudflare Workers позволяют запускать ваш код на краевых серверах сети Cloudflare, обеспечивая минимальное время отклика и высокую производительность. Однако даже при высокой надежности самой инфраструктуры могут возникать проблемы с вашим приложением:
- Runtime ошибки: Необработанные исключения приводят к падению вашего воркера.
- Превышение лимитов времени выполнения: Бесплатные аккаунты имеют ограничение в 10 мс, платные – до 50 мс; превышение этих значений приводит к ошибкам.
- Проблемы с памятью: Лимит памяти составляет 128 МБ, его превышение также вызывает сбои.
- Сбои хранилищ данных: Проблемы с доступом к KV, D1 или R2 могут привести к отказу работы приложения.
- Ошибка деплоя: Неправильная версия кода может быть развернута незаметно.
- Несоответствие маршрутов: Новые маршруты не соответствуют ожидаемым шаблонам.
- Отказ внешних API: Если ваше приложение зависит от сторонних сервисов, их недоступность приведет к сбоям.
Настройка точки проверки здоровья
Для мониторинга состояния своего воркера рекомендуется создать специальный маршрут /health, который будет проверять доступность основных компонентов:
// worker.js
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
// Проверка работоспособности
if (url.pathname === '/health') {
return handleHealthCheck(env);
}
// Обычная логика обработки запросов...
return handleRequest(request, env, ctx);
}
};
async function handleHealthCheck(env) {
const checks = {};
const start = Date.now();
// Проверяем доступность KV (если используется)
if (env.MY_KV) {
try {
await env.MY_KV.put('_health_check', 'ok', { expirationTtl: 60 });
const val = await env.MY_KV.get('_health_check');
checks.kv = val === 'ok' ? 'ok' : 'error';
} catch (e) {
checks.kv = 'error';
}
}
// Проверяем базу данных D1 (если используется)
if (env.MY_DB) {
try {
await env.MY_DB.prepare('SELECT 1').first();
checks.d1 = 'ok';
} catch (e) {
checks.d1 = 'error';
}
}
const allOk = Object.values(checks).every(s => s === 'ok');
return new Response(JSON.stringify({ status: allOk ? 'OK' : 'ERROR', details: checks }), {
headers: {'Content-Type': 'application/json'}
});
}