feat(hands,jobs): длящаяся беда не пропадает - суточная сводка и всплеск против своей нормы

This commit is contained in:
hh committed 2026-09-21 00:09:04 +00:00
1 parent b6c5050d69
commit a0fe09811d
4 files changed
+492 -24

No files matched your search

+2
View File
@@ -32,6 +32,8 @@ jobs = [
Job("куратор", curate, cron="0 2,8,12,16,20 * * *", critical=False),
# Логи - раз в 3 часа и на ":40": на ":00" ротация и куратор. Чаще смысла
# мало (36 стеков = 36 чтений за проход), реже - хвост уезжает совсем.
# Проход 01:40 - первый после полуночи: он же несёт суточную сводку по
# длящемуся, чтобы фон не исчезал из виду, доложенный однажды.
Job("логи", logs_watch, cron="40 1,4,7,10,13,16,19,22 * * *", critical=False),
Job("deploy", deploy, webhook=True),
Job("komodo", komodo_alert, webhook=True, dedupe=False),
+22 -12
View File
@@ -25,6 +25,7 @@ from beaver_agent.hands.komodo_logs import (
StackScan,
Sweep,
brief,
daily,
digest,
read_stack,
)
@@ -99,26 +100,35 @@ async def sweep(
async def logs_watch(run: JobRun) -> None:
"""Проход по логам: состояние на диске, инжект - только на новом."""
"""Проход по логам: состояние на диске, инжект - на новом и раз в сутки.
Инжекта два и они разные: обычный - про новое, всплески и отбой; суточный -
про длящееся, которое в проходах молчит. Первый проход суток у нас в 01:40,
он же и несёт сводку: в 00:00 ротация мастера, лезть туда незачем.
"""
if KOMODO is None:
_log.info("логи: руки komodo нет, проход пропущен")
return
seen = Seen.load(STATE_FILE)
report = digest(seen, await sweep(KOMODO))
if not report.worth_telling:
seen.save()
_log.info(
"логи: нового нет, стеков прочитано %s из %s",
len(report.sweep.read),
report.sweep.in_scope,
)
return
if await run.inject_master(brief(report, ZONE), urgency="normal", origin="логи"):
report = digest(seen, await sweep(KOMODO), ZONE)
if report.worth_telling and await run.inject_master(
brief(report, ZONE), urgency="normal", origin="логи"
):
seen.mark_told(report)
if report.summary and await run.inject_master(
daily(report, ZONE), urgency="normal", origin="логи"
):
seen.mark_daily(report)
seen.save()
_log.info(
"логи: новое %s, стихло %s, не прочитано %s",
"логи: новое %s, всплеск %s, стихло %s, длится %s (сводка %s), "
"не прочитано %s, стеков %s из %s",
len(report.new),
len(report.surge),
len(report.quiet),
len(report.ongoing),
report.summary,
len(report.trouble),
len(report.sweep.read),
report.sweep.in_scope,
)