Разработка бота уведомлений в Telegram о критических событиях сайта
Мониторинг критических событий через Telegram — быстрый способ получать алерты о проблемах сайта на мобильный телефон, минуя email и системы мониторинга. Бот уведомляет: упал сайт, ошибка оплаты, переполнился диск, появились 500-е ошибки.
Типы событий
// Список критических событий с уровнями важности
enum AlertLevel: string {
case CRITICAL = '🔴'; // требует немедленной реакции
case WARNING = '🟡'; // требует внимания
case INFO = '🔵'; // информационное
}
class SiteEventAlerter
{
public function alert(AlertLevel $level, string $event, array $context = []): void
{
$message = "{$level->value} <b>{$event}</b>\n\n";
foreach ($context as $key => $value) {
$message .= "<b>{$key}:</b> {$value}\n";
}
$message .= "\n⏰ " . now()->format('d.m.Y H:i:s');
// Критические события — личные сообщения дежурному
$recipients = $level === AlertLevel::CRITICAL
? $this->getOnCallEngineers()
: [$this->alertsChannelId];
foreach ($recipients as $chatId) {
$this->telegram->sendMessage($chatId, $message);
}
}
}
Интеграция в код
// В обработчике исключений (Handler.php)
public function report(Throwable $exception): void
{
if ($exception instanceof PaymentException) {
app(SiteEventAlerter::class)->alert(
AlertLevel::CRITICAL,
'Ошибка платёжного шлюза',
[
'Gateway' => $exception->getGateway(),
'Order' => $exception->getOrderId(),
'Error' => $exception->getMessage(),
]
);
}
parent::report($exception);
}
// В планировщике (Kernel.php)
$schedule->call(function () {
$freeSpace = disk_free_space('/') / disk_total_space('/') * 100;
if ($freeSpace < 10) {
app(SiteEventAlerter::class)->alert(
AlertLevel::WARNING,
'Мало свободного места на диске',
['Свободно' => round($freeSpace, 1) . '%']
);
}
})->hourly();
Антиспам
Одна и та же ошибка может генерировать сотни алертов в минуту. Дедупликация через Redis:
private function shouldSend(string $eventKey): bool
{
$cacheKey = "alert_dedup:{$eventKey}";
if (Cache::has($cacheKey)) return false;
Cache::put($cacheKey, 1, now()->addMinutes(15));
return true;
}
Время реализации: 1–2 рабочих дня.







