feat(alerts): алерты всей команде — детекторы, дедупликация, список (#15)
CI / ruff · mypy · pytest (pull_request) Successful in 4m49s
CI / ruff · mypy · pytest (pull_request) Successful in 4m49s
- детекторы по состоянию после каждого раунда снапшотов: краш, OOM, цикл рестартов, unhealthy, перегрузка ≥ 1 мин, мало места, Docker недоступен; пороги в config/alerts.yaml - AlertService: ключ kind+service, повтор в 10 мин — счётчик в исходном сообщении, «✅ восстановлено» ответом; разовые события (🛡) со счётчиком - рассылка всем активным (🛡 — только админам), темп ~25/с, RetryAfter, заблокировавший бота пропускается; alert_deliveries для правок и ответов - «🚨 Алерты»: активные + 7 дней по 10, карточка; кнопки «📜 Логи», «🩺 Статус» под алертом открывают новое сообщение, а не затирают алерт - 🛡 атаки через агента идут через общий сервис алертов - убраны заглушки «Раздел в разработке» — у всех разделов свои роутеры Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+52
-9
@@ -29,9 +29,6 @@ help:
|
||||
Разделы открываются кнопками внизу. В любом шаге есть «⬅️ Назад» и «✖️ Отмена».
|
||||
|
||||
section:
|
||||
commit: "📝 Коммит\n\nРаздел в разработке."
|
||||
alerts: "🚨 Алерты\n\nРаздел в разработке."
|
||||
members: "👥 Участники\n\nРаздел в разработке."
|
||||
cancelled: "Отменено. Главное меню — кнопками внизу."
|
||||
|
||||
members:
|
||||
@@ -193,12 +190,6 @@ logs:
|
||||
agent_unavailable: "Агент сейчас недоступен. Попробуйте позже или воспользуйтесь своим grep."
|
||||
agent_not_understood: "Не получилось построить запрос. Переформулируйте вопрос или воспользуйтесь своим grep."
|
||||
head_agent: "🤖 <code>{command}</code>\n<b>{name}</b> · за {period} · совпадений: {matched}"
|
||||
attack_alert: |-
|
||||
🛡 Попытка атаки через агента логов
|
||||
Кто: {who}
|
||||
Отсечено: {stage} · {reason}
|
||||
Запрос:
|
||||
<pre>{prompt}</pre>
|
||||
to_list: "⬅️ К контейнерам"
|
||||
to_container: "⬅️ К контейнеру"
|
||||
ask_grep: |-
|
||||
@@ -220,3 +211,55 @@ logs:
|
||||
err_extra: "Нужен один шаблон, а «{arg}» лишнее. Шаблон с пробелами — в кавычках."
|
||||
err_too_long: "Шаблон длиннее 200 символов."
|
||||
err_regex: "Шаблон не разбирается: {arg}"
|
||||
|
||||
alerts:
|
||||
kinds:
|
||||
crash: "💥 Краш"
|
||||
oom: "🧠 OOM"
|
||||
restart_loop: "🔁 Цикл рестартов"
|
||||
unhealthy: "🩺 Unhealthy"
|
||||
overload: "🔥 Перегрузка"
|
||||
deploy_refused: "⛔ Не запустился после деплоя"
|
||||
cd_failed: "📦 CD упал"
|
||||
disk_low: "💾 Мало места на хосте"
|
||||
dependency_down: "🔌 Зависимость недоступна"
|
||||
agent_attack: "🛡 Атака через агента"
|
||||
details:
|
||||
crash: "Контейнер вышел с кодом {exit_code}."
|
||||
oom: "Убит по памяти (OOM), код {exit_code}."
|
||||
restart_loop: "{restarts} рестартов за {window_min} мин."
|
||||
unhealthy: "Health-check не проходит."
|
||||
overload: "CPU {cpu_pct}% · RAM {mem_pct}% от лимита — дольше минуты."
|
||||
deploy_refused: "{detail}"
|
||||
cd_failed: "{detail}"
|
||||
disk_low: "Свободно {free_pct}% диска."
|
||||
dependency_down: "Не отвечает с {since}."
|
||||
agent_attack: "{who} · отсечено: {stage} · {reason}"
|
||||
message: |-
|
||||
{title} · <b>{service}</b>
|
||||
{detail}
|
||||
🕒 {opened} UTC{repeats}
|
||||
repeats: " · повторов: {count}"
|
||||
resolved: "✅ Восстановлено · {title} · {service} · длилось {duration}"
|
||||
logs_button: "📜 Логи"
|
||||
status_button: "🩺 Статус"
|
||||
list_button: "📋 Список алертов"
|
||||
list_title: "🚨 Алерты · активных: {active} · всего за 7 дней: {total}"
|
||||
list_empty: "За 7 дней алертов не было."
|
||||
list_line: "{mark} {title} · {service} · {time}{repeats}"
|
||||
active_mark: "🔴"
|
||||
resolved_mark: "✅"
|
||||
page: "Стр. {page} из {pages}"
|
||||
prev: "◀️"
|
||||
next: "▶️"
|
||||
card: |-
|
||||
{title} · <b>{service}</b>
|
||||
{detail}
|
||||
|
||||
Начало: {opened} UTC
|
||||
Конец: {resolved}
|
||||
Повторов: {count}
|
||||
ongoing: "продолжается"
|
||||
to_list: "⬅️ К списку"
|
||||
host: "хост"
|
||||
gone: "Алерт не найден."
|
||||
|
||||
Reference in New Issue
Block a user