Розробка бота Telegram для сповіщення про критичні події сайту
Моніторинг критичних подій через Telegram — швидкий спосіб отримувати алерти про проблеми сайту на мобільний телефон, мінуючи пошту та системи моніторингу. Бот сповіщує: упав сайт, помилка оплати, переповнився диск, з'явились 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 робочі дні.







