Планировщик#
IncidentRelay использует задачи планировщика для напоминаний, эскалаций и периодической логики обслуживания.
Планировщик должен работать как отдельный процесс и не должен запускаться внутри каждого веб-воркера.
Зачем отдельный процесс планировщика?#
Не запускайте задачи планировщика внутри нескольких воркеров Gunicorn.
Плохая модель:
gunicorn -w 4
├── worker 1 -> scheduler
├── worker 2 -> scheduler
├── worker 3 -> scheduler
└── worker 4 -> scheduler
Это может дублировать напоминания и эскалации.
Рекомендуемая модель:
incidentrelay # HTTP API, UI, incoming webhooks
incidentrelay-scheduler # one scheduler process
Интервал планировщика и интервал напоминаний#
Существует два разных интервала:
| Настройка | Значение |
|---|---|
| Интервал пробуждения планировщика | Как часто планировщик проверяет наличие работы |
| Интервал напоминаний ротации | Как часто конкретный алерт должен получать уведомления-напоминания |
Правила интервала напоминаний ротации:
0 disables reminders for that rotation
>= 60 sends reminders at that interval in seconds
1..59 invalid
Не используйте глобальный резервный интервал времени выполнения для reminder-after, когда ротации требуют явного интервала напоминаний.
Retention данных#
IncidentRelay 2.1 запускает один периодический retention job для истории alerts, Explain Trace и Event Orchestration. Периодичность настраивается в отдельной секции:
[retention]
alert_days = 30
cleanup_interval_seconds = 86400
batch_size = 500
explain_trace_days и orchestration_execution_days наследуют alert_days, если не заданы явно. Job использует тот же distributed database lock, что и остальные scheduler jobs. Подробнее: Политика хранения данных.
Переменные окружения#
Процесс планировщика должен использовать:
INCIDENTRELAY_CONFIG_FILE=/etc/incidentrelay/incidentrelay.conf
INCIDENTRELAY_SERVICE=scheduler
PYTHONUNBUFFERED=1
Веб-процесс должен использовать:
INCIDENTRELAY_CONFIG_FILE=/etc/incidentrelay/incidentrelay.conf
INCIDENTRELAY_SERVICE=web
PYTHONUNBUFFERED=1
Автономный воркер планировщика#
Точка входа:
python -m app.scheduler_worker
Сервис systemd#
Пакеты RPM должны устанавливать этот сервис автоматически. Для ручных установок создайте:
/etc/systemd/system/incidentrelay-scheduler.service
Пример с virtualenv:
[Unit]
Description=IncidentRelay Scheduler service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/incidentrelay
Environment=INCIDENTRELAY_CONFIG_FILE=/etc/incidentrelay/incidentrelay.conf
Environment=INCIDENTRELAY_SERVICE=scheduler
Environment=PYTHONUNBUFFERED=1
ExecStart=/var/www/incidentrelay/venv/bin/python -m app.scheduler_worker
Restart=always
RestartSec=5
KillSignal=SIGTERM
TimeoutStopSec=30
[Install]
WantedBy=multi-user.target
Применить изменения:
sudo systemctl daemon-reload
sudo systemctl enable incidentrelay-scheduler
sudo systemctl restart incidentrelay-scheduler
sudo systemctl status incidentrelay-scheduler
Логи:
journalctl -u incidentrelay-scheduler -f
Устранение неполадок#
Напоминания дублируются#
Проверьте, что запущен только один процесс планировщика:
systemctl status incidentrelay-scheduler
ps aux | grep scheduler
Также проверьте, что запуск планировщика не срабатывает автоматически внутри каждого веб-воркера.
Напоминания продолжают приходить после установки интервала в 0#
Проверьте:
- Алерт использует ожидаемую ротацию.
- У ротации
reminder_interval_seconds = 0. - Сервис планировщика был перезапущен после изменений кода/конфигурации.
- Код времени выполнения не откатывается к глобальному значению reminder-after, когда интервал ротации равен
0.
Планировщик не может прочитать конфигурацию#
Проверьте:
systemctl show incidentrelay-scheduler --property=Environment
sudo -u www-data test -r /etc/incidentrelay/incidentrelay.conf
Для установок RPM используйте пользователя incidentrelay вместо www-data, если это пользователь сервиса из пакета.
База данных SQLite заблокирована#
SQLite подходит для небольших установок, но у неё есть блокировка на одного писателя. Рекомендуемая конфигурация SQLite:
[sqlite]
wal = true
busy_timeout = 5000
Для большего объёма алертов или нескольких веб-воркеров используйте PostgreSQL.