Реализация алертов при сбоях парсинга (email/Telegram)
Парсер упал ночью — утром данные устарели, и никто не знает почему. Система алертов решает это: нужный человек получает уведомление в момент сбоя, с достаточным контекстом для диагностики.
Что считается сбоем
Не каждая ошибка требует алерта. Одиночный таймаут — штатная ситуация, воркер повторит попытку. Алерт нужен когда:
- Задача исчерпала все попытки (moved to DLQ / failed finally)
- Воркер упал сам (process crash, OOM)
- Процент ошибок за последние 15 минут превысил порог (например, > 20%)
- Парсинг сайта не завершился за ожидаемое время (watchdog timeout)
- Изменилась структура страницы — парсер возвращает пустые данные
Уведомление в Telegram
import httpx
import textwrap
async def send_telegram_alert(bot_token: str, chat_id: str, event: dict):
text = textwrap.dedent(f"""
🔴 <b>Сбой парсинга</b>
<b>Сайт:</b> {event['site_name']}
<b>URL:</b> <code>{event['url']}</code>
<b>Ошибка:</b> {event['error_type']}
<b>Сообщение:</b> <code>{event['error_message'][:300]}</code>
<b>Попыток:</b> {event['attempts']}
<b>Время:</b> {event['timestamp']}
""").strip()
async with httpx.AsyncClient() as client:
await client.post(
f"https://api.telegram.org/bot{bot_token}/sendMessage",
json={"chat_id": chat_id, "text": text, "parse_mode": "HTML"},
timeout=10,
)
Email через SMTP / SendGrid
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
def send_email_alert(to_email: str, event: dict):
message = Mail(
from_email='[email protected]',
to_emails=to_email,
subject=f"[Парсинг] Сбой: {event['site_name']}",
html_content=render_alert_template(event),
)
sg = SendGridAPIClient(api_key=SENDGRID_API_KEY)
sg.send(message)
Дедупликация алертов
Без дедупликации при массовом сбое (упал прокси-провайдер) придёт 500 писем за минуту. Решение — группировка по ключу с cooldown:
def should_send_alert(site_id: int, error_type: str, cooldown_minutes: int = 30) -> bool:
key = f"alert_sent:{site_id}:{error_type}"
if redis.exists(key):
return False
redis.setex(key, cooldown_minutes * 60, "1")
return True
Один алерт на тип ошибки в 30 минут — разумный баланс между информативностью и шумом.
Сроки реализации
Telegram + email алерты с дедупликацией — 1–2 рабочих дня.







