docs: обновил документацию — убрал устаревшие ссылки на zabbix_sender
- заменил все упоминания zabbix_sender на Zabbix Agent/UserParameter - убрал лишнюю опцию --arch/--platform из build.sh - добавил реальный URL репозитория в инструкцию установки - исправил оглавление README
This commit is contained in:
parent
bc437cbf8c
commit
62744d1a43
41
README.md
41
README.md
@ -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-зависимости
|
||||||
|
|||||||
45
build.sh
45
build.sh
@ -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:"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user