feat(tradein/ops): алерты GlitchTip доезжают в Telegram #2915
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2915
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-glitchtip-telegram-alerts"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Зачем
Мониторинг сейчас нем полностью. Замер 15.08.2026:
alerts_projectalertиalerts_alertrecipient— пусты: правил алертов не заведено ни одного;EMAIL_URL=consolemail://— письма печатаются в stdout (чинится отдельно, #2914);Этот PR даёт второй канал — Telegram-тему поддержки, независимую от почты.
Как
GlitchTip умеет получателя типа webhook и шлёт Slack-совместимый JSON. Telegram такой формат не понимает, поэтому нужен переводчик. Он поставлен на стороне «Меры», где уже есть Telegram-клиент с поддержкой тем.
Новый эндпоинт:
Секрет едет в query, а не в заголовке, по факту, проверенному по исходникам GlitchTip 6.1.6 внутри живого контейнера:
apps/alerts/webhooks.pyделаетsession.post(url, json=...)без единого заголовка — прислатьX-Internal-Auth-Secretон физически не может. Механизм сверки тот же (secrets.compare_digest), новый секрет не заводится.Аутентификация здесь fail-closed: пустой секрет, токен или chat_id →
503. Это намеренно отличается от fail-open в rbac (#2213): молча принимать неаутентифицированные вебхуки хуже, чем не принимать их вовсе.Формы payload у issue-алертов и uptime-алертов совпадают (
{"text", "attachments":[...]}) — обработаны обе, неизвестная форма пересылается как есть с пометкой. Лимит Telegram 4096 символов: длинное тело обрезается, а не роняет запрос.Сеть
glitchtip-worker(именно он шлёт вебхуки, не web) добавлен в сетьshared— иначе он не видитtradein-backendвовсе: раньше worker жил только вdefault, а backend «Меры» — вsharedиtradein-net.Проверка
pytest tests/test_glitchtip_webhook.py— 15 passed (успешная пересылка с замоканным клиентом, отказ без секрета, обрезка длинного текста, неизвестная форма payload).ruff check— чисто;docker-compose.prod.ymlразобран pyyaml — OK.Что нужно сделать руками после мержа
1. В файл окружения бэкенда «Меры» на VPS добавить:
TELEGRAM_BOT_TOKENтам уже есть (бот поддержки живой). Отдельно стоит проверить, чтоTRADEIN_INTERNAL_AUTH_SECRETвыставлен одинаково в обоих стеках — если он пуст, эндпоинт будет честно отдавать 503, а не притворяться работающим.2. В интерфейсе GlitchTip (
errors.gendsgn.ru) создать правило алерта — по проекту, а не по организации (ProjectAlertв модели привязан к проекту). У правила есть флагuptime— «слать при падении uptime-монитора»; он направляет и падения мониторов через тех же получателей. Получатель: тип Webhook, URL —3. Проверка сквозняка изнутри worker'а. В образе
glitchtip/glitchtip:6.1.6нет ни curl, ни wget — только python3:Ожидается
{"status":"ok"}и сообщение в теме алертов.401— секреты в двух стеках разошлись;503— одна из трёх настроек пуста; отказ соединения — не доехала правка сети.