From 62744d1a4313d3f6aa4447a88c00f5247aae76be Mon Sep 17 00:00:00 2001 From: Maksim Totmin Date: Wed, 8 Apr 2026 17:40:28 +0700 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8E=20=E2=80=94=20=D1=83=D0=B1=D1=80=D0=B0=D0=BB?= =?UTF-8?q?=20=D1=83=D1=81=D1=82=D0=B0=D1=80=D0=B5=D0=B2=D1=88=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20=D0=BD=D0=B0=20zabbix?= =?UTF-8?q?=5Fsender?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - заменил все упоминания zabbix_sender на Zabbix Agent/UserParameter - убрал лишнюю опцию --arch/--platform из build.sh - добавил реальный URL репозитория в инструкцию установки - исправил оглавление README --- README.md | 41 ++++++++++++----------------------------- build.sh | 45 ++++----------------------------------------- 2 files changed, 16 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 00d1421..b1e85a9 100644 --- a/README.md +++ b/README.md @@ -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 /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-зависимости diff --git a/build.sh b/build.sh index 02df05f..cbc6399 100755 --- a/build.sh +++ b/build.sh @@ -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:"