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

View File

@ -7,8 +7,7 @@
# контур без доступа в интернет и развернуть через install.sh. # контур без доступа в интернет и развернуть через install.sh.
# #
# Использование: # Использование:
# ./build.sh # сборка для текущей платформы # ./build.sh
# ./build.sh --platform manylinux2014_x86_64 # явное указание платформы
# ============================================================================= # =============================================================================
set -euo pipefail set -euo pipefail
@ -23,31 +22,6 @@ BUILD_DIR="$SCRIPT_DIR/build"
DIST_DIR="$SCRIPT_DIR/dist" DIST_DIR="$SCRIPT_DIR/dist"
WHEELS_DIR="$BUILD_DIR/wheels" WHEELS_DIR="$BUILD_DIR/wheels"
STAGE_DIR="$BUILD_DIR/airflow-monitor-${VERSION}" 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 "=== Airflow DAG Monitor — Offline Build ==="
echo "Version: ${VERSION}" echo "Version: ${VERSION}"
@ -61,21 +35,10 @@ mkdir -p "$WHEELS_DIR" "$STAGE_DIR" "$DIST_DIR"
# --- Step 1: Download wheel packages --- # --- Step 1: Download wheel packages ---
echo "[1/4] Downloading dependencies as wheel packages..." echo "[1/4] Downloading dependencies as wheel packages..."
PIP_ARGS=( python3 -m pip download \
download -r "$SCRIPT_DIR/requirements.txt" \
-r "$SCRIPT_DIR/requirements.txt" --dest "$WHEELS_DIR" \
--dest "$WHEELS_DIR"
--quiet --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) WHEEL_COUNT=$(find "$WHEELS_DIR" -type f | wc -l)
echo " Downloaded $WHEEL_COUNT packages:" echo " Downloaded $WHEEL_COUNT packages:"