feat(hands,jobs): job-run watchdog looks a week back and alarms on jobs that stopped running
This commit is contained in:
1 parent
426b4055f4
commit
91bd50a66d
6 files changed
+620
-71
No files matched your search
@@ -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(
|
||||
|
||||
Reference in new issue
Block a user