feat(hands,jobs): job-run watchdog looks a week back and alarms on jobs that stopped running

This commit is contained in:
hh committed 2026-09-22 20:15:15 +02:00
1 parent 426b4055f4
commit 91bd50a66d
6 files changed
+620 -71

No files matched your search

+10 -4
View File
@@ -151,13 +151,19 @@ def parse_beat(text: str, kind: str = "hb") -> Beat | None:
def every_from_cron(
expression: str | None, tz: tzinfo, *, now: datetime | None = None
expression: str | None,
tz: tzinfo,
*,
now: datetime | None = None,
grain: timedelta = timedelta(hours=1),
) -> timedelta | None:
"""Шаг крона, если он сводится к «раз в N часов»; иначе None.
"""Шаг крона, если он сводится к «раз в N `grain`»; иначе None.
Считаем по стенным часам зоны, в которой планировщик читает кроны:
суточный крон - это 24 часа и в сутки перевода стрелок тоже, а вот
`0 2,8,12,16,20 * * *` не сводится ни к какому N и даёт None.
`0 2,8,12,16,20 * * *` не сводится ни к какому N и даёт None. `grain`
по умолчанию час - такой период печатается в отметке соседу; сторожу
прогонов нужен и `*/10`, он просит минуту.
"""
if not expression:
return None
@@ -171,7 +177,7 @@ def every_from_cron(
if len(steps) != 1:
return None
step = steps.pop()
return step if step.total_seconds() % 3600 == 0 else None
return step if step % grain == timedelta(0) else None
def beat_line(