Реалізація алертів при збоях скрейпінгу (email/Telegram)
Парсер упав ночами — вранці дані застарілі, і ніхто не знає чому. Система алертів вирішує це: потрібна людина отримує сповіщення в момент збою, з достатнім контекстом для діагностики.
Що вважається збоєм
Не кожна помилка потребує алерту. Одиничний таймаут — штатна ситуація, воркер повторить спробу. Алерт потрібен коли:
- Завдання вичерпало всі спроби (перенесено в DLQ / остаточний збій)
- Воркер упав сам (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 робочі дні.







