61 lines
4.3 KiB
Python
61 lines
4.3 KiB
Python
"""Джобы: кроны считаются в локальном времени, вебхуки приходят на /hooks/<имя>."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
from beaver_gateway.jobs.scheduler import Job
|
|
|
|
from beaver_agent.jobs.closing import close_idle
|
|
from beaver_agent.jobs.deploy import deploy
|
|
from beaver_agent.jobs.heartbeat import beat, watch
|
|
from beaver_agent.jobs.komodo import komodo_alert
|
|
from beaver_agent.jobs.leisure import tick
|
|
from beaver_agent.jobs.logs import logs_watch
|
|
from beaver_agent.jobs.memory import curate, memory
|
|
from beaver_agent.jobs.rotation import rotate
|
|
from beaver_agent.jobs.runs import watch_runs
|
|
from beaver_agent.jobs.t3code import t3code_event
|
|
from beaver_agent.jobs.vibegram import vibegram
|
|
from beaver_agent.jobs.voice import rotate_voice
|
|
|
|
LEISURE_OFF = os.environ.get("LEISURE", "").strip().lower() in ("off", "0", "false")
|
|
"""Рубильник досуга в env; повседневный выключатель - строка в `мета/бобер/досуг.md`."""
|
|
|
|
jobs = [
|
|
Job("ротация", rotate, cron="0 * * * *"),
|
|
# Не на ":00": там ротация, а лежащий в очереди тик держит мастера занятым
|
|
# (`busy`), и она пропускала бы себя каждый час.
|
|
*([] if LEISURE_OFF else [Job("досуг", tick, cron="7 * * * *")]),
|
|
Job("вайбграм", vibegram, cron="*/10 * * * *", critical=False),
|
|
Job("закрытие", close_idle, cron="20 4 * * *", critical=False),
|
|
# Сторожевое кольцо с чужим агентом. Кроны читаются в локальной зоне, а
|
|
# сосед печатает свою отметку в 05:00 UTC - вечер по Варшаве разводит нас
|
|
# на полсуток, и его строка лежит в комнате задолго до нашего прогона.
|
|
# Частоты тут две, и они разные: отметка суточная (её период мы обещаем
|
|
# соседу), а проверка - вчетверо чаще. Сторож с шагом в сутки при пороге
|
|
# 36 ч обнаруживал бы молчание только через ~60 ч, то есть мерил бы не то,
|
|
# ради чего заведён; чтение 25 событий стоит копейки.
|
|
Job("отметка", beat, cron="12 17 * * *", critical=False),
|
|
Job("сторож", watch, cron="42 */6 * * *", critical=False),
|
|
# Сторож собственного журнала прогонов. Час - это компромисс: окно счёта
|
|
# сутки, и джоб, упавший три раза подряд, лежит уже заметно дольше часа,
|
|
# так что чаще смысла нет, а реже - тревога стареет на свой же период.
|
|
# ":27" выбрана пустой: на ":00" ротация и куратор, на ":40" логи, на
|
|
# ":42" сторож соседа, а собственный прогон этого джоба не должен ждать
|
|
# очереди за чужим спавном.
|
|
Job("прогоны", watch_runs, cron="27 * * * *", critical=False),
|
|
Job("память", memory, cron="30 4 * * 0", critical=False),
|
|
Job("голосовой", rotate_voice, cron="5 4 * * *", critical=False),
|
|
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),
|
|
Job("t3code", t3code_event, webhook=True, dedupe=False),
|
|
]
|
|
"""Алерты и события t3code идут пачками (тревога и отбой подряд) - их не схлопывают."""
|