docs: обновил документацию — убрал устаревшие ссылки на zabbix_sender

- заменил все упоминания zabbix_sender на Zabbix Agent/UserParameter
- убрал лишнюю опцию --arch/--platform из build.sh
- добавил реальный URL репозитория в инструкцию установки
- исправил оглавление README
This commit is contained in:
Maksim Totmin 2026-04-08 17:40:28 +07:00
parent bc437cbf8c
commit 62744d1a43
2 changed files with 16 additions and 70 deletions

View File

@ -21,6 +21,7 @@
- [Логирование и диагностика](#логирование-и-диагностика)
- [Безопасность](#безопасность)
- [Структура проекта](#структура-проекта)
- [Лицензия](#лицензия)
---
@ -31,7 +32,7 @@
- **Автоматическое обнаружение** всех активных (не приостановленных) DAG-ов через Airflow REST API
- **Детекция проблем**: упавшие (`failed`) и зависшие (выполнение > 30 мин) DAG-запуски
- **Самовосстановление**: однократная попытка перезапуска с контролем результата
- **Эскалация в Zabbix**: при неуспешном перезапуске данные отправляются через `zabbix_sender`
- **Эскалация в Zabbix**: при неуспешном перезапуске данные экспортируются для Zabbix Agent
- **Heartbeat-мониторинг**: Zabbix отслеживает работоспособность самого монитора
- **Идемпотентность**: персистентное состояние исключает дублирование перезапусков и алертов
- **Автодетекция API**: поддержка Airflow REST API v1 и experimental API
@ -83,7 +84,7 @@
### Автоматическая
```bash
git clone <repository-url> /opt/airflow-monitor
git clone https://git.totmin.ru/en2zmax/AirflowDAGMonitor.git /opt/airflow-monitor
cd /opt/airflow-monitor
./setup.sh
```
@ -127,11 +128,7 @@ sudo systemctl daemon-reload
На машине **с доступом в интернет**:
```bash
# Сборка для текущей платформы
./build.sh
# Сборка для конкретной платформы (если целевой сервер отличается)
./build.sh --platform manylinux2014_x86_64
```
Результат: `dist/airflow-monitor-1.0.0.zip`
@ -202,25 +199,9 @@ cd /tmp/airflow-monitor-1.0.0
4. Создание рабочих директорий (`/var/lib/airflow-monitor`, `/var/log/airflow-monitor`)
5. Установку systemd unit с автоподстановкой путей и пользователя
> **Важно:** На целевом сервере должен быть установлен Python 3.10+ и утилита `zabbix_sender`.
> **Важно:** На целевом сервере должен быть установлен Python 3.10+ и Zabbix Agent.
> Доступ в интернет **не требуется** — все зависимости включены в архив.
### Кросс-платформенная сборка
Если архитектура машины сборки отличается от целевого сервера:
```bash
# Целевой сервер: x86_64
./build.sh --platform manylinux2014_x86_64
# Целевой сервер: aarch64
./build.sh --platform manylinux2014_aarch64
```
При использовании `--platform` скачиваются только бинарные wheel-пакеты для указанной
платформы. Если зависимость доступна только в виде source distribution, сборка завершится
ошибкой — в таком случае соберите на машине с аналогичной архитектурой.
---
## Auto-discovery Docker Airflow
@ -611,8 +592,8 @@ zabbix_agentd -t airflow.monitor.alive
| Airflow API недоступен | Пропуск цикла, повтор через `cycle_interval` |
| Таймаут запроса к API | Пропуск конкретного DAG, продолжение с остальными |
| Ошибка авторизации (401/403) | Логирование, продолжение цикла |
| `zabbix_sender` не найден | Отключение Zabbix, продолжение мониторинга |
| `zabbix_sender` вернул ошибку | Повтор отправки в следующем цикле |
| Ошибка записи файлов данных | Логирование ошибки, повтор в следующем цикле |
| Zabbix Agent не читает данные | Проверить конфиг в `/etc/zabbix/zabbix_agentd.conf.d/` |
| Повреждённый файл состояния | Пересоздание с пустым состоянием |
| Необработанное исключение в цикле | Логирование traceback, переход к следующему циклу |
@ -620,7 +601,7 @@ zabbix_agentd -t airflow.monitor.alive
Персистентное состояние хранит для каждого DAG-запуска:
- Счётчик перезапусков — исключает повторный retry
- Флаг `alerted` — исключает повторную отправку в Zabbix
- Флаг `alerted` — исключает повторный экспорт в Zabbix
- Ключ `{dag_id}::{dag_run_id}` — уникальная идентификация
- Автоочистка записей старше 24 часов
@ -655,8 +636,10 @@ journalctl -u airflow-monitor --since "1 hour ago"
# Содержимое state файла
cat /var/lib/airflow-monitor/state.json | python3 -m json.tool
# Тест отправки в Zabbix
zabbix_sender -z zabbix.example.com -s airflow-server -k airflow.dag.problems -o '[]'
# Проверка что Zabbix Agent читает данные
zabbix_agentd -t airflow.dag.problems
zabbix_agentd -t airflow.dag.problems.count
zabbix_agentd -t airflow.monitor.heartbeat
```
---
@ -704,7 +687,7 @@ air-flow-monitor/
│ ├── client.py # HTTP-клиент Airflow REST API
│ ├── analyzer.py # Анализ DAG-запусков, классификация проблем
│ ├── state.py # Персистентное состояние (JSON, атомарная запись)
│ ├── actions.py # Перезапуск DAG-ов, отправка в Zabbix
│ ├── actions.py # Перезапуск DAG-ов, экспорт данных для Zabbix Agent
│ └── monitor.py # Оркестрация цикла мониторинга
├── config.yaml # Конфигурация (Airflow, Zabbix, пороги, логи)
├── requirements.txt # Python-зависимости

View File

@ -7,8 +7,7 @@
# контур без доступа в интернет и развернуть через install.sh.
#
# Использование:
# ./build.sh # сборка для текущей платформы
# ./build.sh --platform manylinux2014_x86_64 # явное указание платформы
# ./build.sh
# =============================================================================
set -euo pipefail
@ -23,31 +22,6 @@ BUILD_DIR="$SCRIPT_DIR/build"
DIST_DIR="$SCRIPT_DIR/dist"
WHEELS_DIR="$BUILD_DIR/wheels"
STAGE_DIR="$BUILD_DIR/airflow-monitor-${VERSION}"
PLATFORM=""
# --- Parse arguments ---
while [[ $# -gt 0 ]]; do
case "$1" in
--platform)
PLATFORM="$2"
shift 2
;;
-h|--help)
echo "Usage: $0 [--platform PLATFORM]"
echo ""
echo "Options:"
echo " --platform Target platform for wheels (e.g., manylinux2014_x86_64)"
echo " Default: auto-detect from current system"
echo ""
echo "Output: dist/airflow-monitor-VERSION.zip"
exit 0
;;
*)
echo "Unknown option: $1" >&2
exit 1
;;
esac
done
echo "=== Airflow DAG Monitor — Offline Build ==="
echo "Version: ${VERSION}"
@ -61,21 +35,10 @@ mkdir -p "$WHEELS_DIR" "$STAGE_DIR" "$DIST_DIR"
# --- Step 1: Download wheel packages ---
echo "[1/4] Downloading dependencies as wheel packages..."
PIP_ARGS=(
download
-r "$SCRIPT_DIR/requirements.txt"
--dest "$WHEELS_DIR"
python3 -m pip download \
-r "$SCRIPT_DIR/requirements.txt" \
--dest "$WHEELS_DIR" \
--quiet
)
if [ -n "$PLATFORM" ]; then
PIP_ARGS+=(--platform "$PLATFORM" --only-binary=:all:)
echo " Target platform: $PLATFORM"
else
echo " Target platform: current ($(python3 -c 'import platform; print(platform.machine())'))"
fi
python3 -m pip "${PIP_ARGS[@]}"
WHEEL_COUNT=$(find "$WHEELS_DIR" -type f | wc -l)
echo " Downloaded $WHEEL_COUNT packages:"