- автообнаружение Docker Airflow через docker inspect и .env - мониторинг failed и long-running DAG-запусков с автоматическим retry - экспорт данных в файлы для Zabbix Agent через UserParameter - офлайн-сборка ZIP-архива для закрытых контуров - Zabbix шаблоны для 5.x (XML) и 6.x+ (YAML) - systemd сервис с graceful shutdown и lock file
348 lines
15 KiB
XML
348 lines
15 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
||
<zabbix_export>
|
||
<version>5.4</version>
|
||
<groups>
|
||
<group>
|
||
<name>Templates/Applications</name>
|
||
</group>
|
||
</groups>
|
||
<templates>
|
||
<template>
|
||
<template>Airflow DAG Monitor</template>
|
||
<name>Airflow DAG Monitor</name>
|
||
<description>Мониторинг Apache Airflow DAG-ов через сервис airflow-monitor.
|
||
Сервис пишет данные в файлы, Zabbix Agent читает через UserParameter.
|
||
|
||
Требования:
|
||
- Установлен airflow-monitor (/opt/airflow-monitor)
|
||
- Установлен конфиг /etc/zabbix/zabbix_agentd.conf.d/airflow-monitor.conf
|
||
|
||
Версия шаблона: 1.0.0 (Zabbix 5.x)</description>
|
||
<groups>
|
||
<group>
|
||
<name>Templates/Applications</name>
|
||
</group>
|
||
</groups>
|
||
<items>
|
||
<!-- Problematic DAGs JSON -->
|
||
<item>
|
||
<name>Airflow: Problematic DAGs (JSON)</name>
|
||
<key>airflow.dag.problems</key>
|
||
<delay>1m</delay>
|
||
<history>7d</history>
|
||
<value_type>TEXT</value_type>
|
||
<description>JSON-массив проблемных DAG-запусков. [] = нет проблем.</description>
|
||
<tags>
|
||
<tag>
|
||
<tag>component</tag>
|
||
<value>airflow</value>
|
||
</tag>
|
||
</tags>
|
||
</item>
|
||
|
||
<!-- Problematic DAGs count -->
|
||
<item>
|
||
<name>Airflow: Problematic DAGs count</name>
|
||
<key>airflow.dag.problems.count</key>
|
||
<delay>1m</delay>
|
||
<history>90d</history>
|
||
<trends>365d</trends>
|
||
<value_type>UNSIGNED</value_type>
|
||
<description>Количество DAG-запусков с проблемами.</description>
|
||
<tags>
|
||
<tag>
|
||
<tag>component</tag>
|
||
<value>airflow</value>
|
||
</tag>
|
||
</tags>
|
||
</item>
|
||
|
||
<!-- Heartbeat -->
|
||
<item>
|
||
<name>Airflow Monitor: Heartbeat</name>
|
||
<key>airflow.monitor.heartbeat</key>
|
||
<delay>1m</delay>
|
||
<history>7d</history>
|
||
<value_type>UNSIGNED</value_type>
|
||
<description>Epoch timestamp последнего успешного цикла мониторинга.</description>
|
||
<tags>
|
||
<tag>
|
||
<tag>component</tag>
|
||
<value>dag-monitor</value>
|
||
</tag>
|
||
</tags>
|
||
</item>
|
||
|
||
<!-- Status JSON -->
|
||
<item>
|
||
<name>Airflow Monitor: Status (JSON)</name>
|
||
<key>airflow.monitor.status</key>
|
||
<delay>5m</delay>
|
||
<history>7d</history>
|
||
<value_type>TEXT</value_type>
|
||
<description>JSON со статусом монитора.</description>
|
||
<tags>
|
||
<tag>
|
||
<tag>component</tag>
|
||
<value>dag-monitor</value>
|
||
</tag>
|
||
</tags>
|
||
</item>
|
||
|
||
<!-- Service alive -->
|
||
<item>
|
||
<name>Airflow Monitor: Service alive</name>
|
||
<key>airflow.monitor.alive</key>
|
||
<delay>1m</delay>
|
||
<history>90d</history>
|
||
<trends>365d</trends>
|
||
<value_type>UNSIGNED</value_type>
|
||
<description>1 = сервис запущен, 0 = остановлен.</description>
|
||
<valuemap>
|
||
<name>Service state</name>
|
||
</valuemap>
|
||
<tags>
|
||
<tag>
|
||
<tag>component</tag>
|
||
<value>dag-monitor</value>
|
||
</tag>
|
||
</tags>
|
||
</item>
|
||
|
||
<!-- DAG count (dependent from status) -->
|
||
<item>
|
||
<name>Airflow Monitor: DAG count</name>
|
||
<type>DEPENDENT</type>
|
||
<key>airflow.monitor.dag_count</key>
|
||
<history>90d</history>
|
||
<trends>365d</trends>
|
||
<value_type>UNSIGNED</value_type>
|
||
<description>Количество отслеживаемых DAG-ов.</description>
|
||
<master_item>
|
||
<key>airflow.monitor.status</key>
|
||
</master_item>
|
||
<preprocessing>
|
||
<step>
|
||
<type>JSONPATH</type>
|
||
<parameters>
|
||
<parameter>$.dag_count</parameter>
|
||
</parameters>
|
||
</step>
|
||
<step>
|
||
<type>DISCARD_UNCHANGED_HEARTBEAT</type>
|
||
<parameters>
|
||
<parameter>1h</parameter>
|
||
</parameters>
|
||
</step>
|
||
</preprocessing>
|
||
<tags>
|
||
<tag>
|
||
<tag>component</tag>
|
||
<value>airflow</value>
|
||
</tag>
|
||
</tags>
|
||
</item>
|
||
|
||
<!-- Cycle time (dependent from status) -->
|
||
<item>
|
||
<name>Airflow Monitor: Cycle time (seconds)</name>
|
||
<type>DEPENDENT</type>
|
||
<key>airflow.monitor.cycle_time</key>
|
||
<history>90d</history>
|
||
<trends>365d</trends>
|
||
<value_type>FLOAT</value_type>
|
||
<units>s</units>
|
||
<description>Время выполнения последнего цикла мониторинга.</description>
|
||
<master_item>
|
||
<key>airflow.monitor.status</key>
|
||
</master_item>
|
||
<preprocessing>
|
||
<step>
|
||
<type>JSONPATH</type>
|
||
<parameters>
|
||
<parameter>$.cycle_time_seconds</parameter>
|
||
</parameters>
|
||
</step>
|
||
</preprocessing>
|
||
<tags>
|
||
<tag>
|
||
<tag>component</tag>
|
||
<value>dag-monitor</value>
|
||
</tag>
|
||
</tags>
|
||
</item>
|
||
|
||
<!-- Cycle count (dependent from status) -->
|
||
<item>
|
||
<name>Airflow Monitor: Cycle count</name>
|
||
<type>DEPENDENT</type>
|
||
<key>airflow.monitor.cycle_count</key>
|
||
<history>90d</history>
|
||
<trends>365d</trends>
|
||
<value_type>UNSIGNED</value_type>
|
||
<description>Номер текущего цикла мониторинга.</description>
|
||
<master_item>
|
||
<key>airflow.monitor.status</key>
|
||
</master_item>
|
||
<preprocessing>
|
||
<step>
|
||
<type>JSONPATH</type>
|
||
<parameters>
|
||
<parameter>$.cycle_count</parameter>
|
||
</parameters>
|
||
</step>
|
||
<step>
|
||
<type>DISCARD_UNCHANGED_HEARTBEAT</type>
|
||
<parameters>
|
||
<parameter>1h</parameter>
|
||
</parameters>
|
||
</step>
|
||
</preprocessing>
|
||
<tags>
|
||
<tag>
|
||
<tag>component</tag>
|
||
<value>dag-monitor</value>
|
||
</tag>
|
||
</tags>
|
||
</item>
|
||
</items>
|
||
|
||
<triggers>
|
||
<!-- Problematic DAGs detected -->
|
||
<trigger>
|
||
<expression>{Airflow DAG Monitor:airflow.dag.problems.count.last()}>0</expression>
|
||
<recovery_expression>{Airflow DAG Monitor:airflow.dag.problems.count.last()}=0</recovery_expression>
|
||
<name>Airflow: {ITEM.LASTVALUE1} problematic DAG run(s) detected</name>
|
||
<priority>HIGH</priority>
|
||
<description>Обнаружены проблемные DAG-запуски (failed или long_running).
|
||
Подробности в item "Airflow: Problematic DAGs (JSON)".
|
||
Триггер снимается автоматически при разрешении всех проблем.</description>
|
||
<tags>
|
||
<tag>
|
||
<tag>scope</tag>
|
||
<value>availability</value>
|
||
</tag>
|
||
</tags>
|
||
</trigger>
|
||
|
||
<!-- Heartbeat stale -->
|
||
<trigger>
|
||
<expression>{Airflow DAG Monitor:airflow.monitor.heartbeat.nodata(600)}=1 or (({Airflow DAG Monitor:airflow.monitor.heartbeat.last()}>0) and ({Airflow DAG Monitor:airflow.monitor.heartbeat.fuzzytime(600)}=0))</expression>
|
||
<name>Airflow Monitor: Data is stale (no update for 10+ minutes)</name>
|
||
<priority>DISASTER</priority>
|
||
<description>Данные мониторинга не обновлялись более 10 минут.
|
||
Возможные причины: сервис остановлен, Airflow API недоступен.</description>
|
||
<dependencies>
|
||
<dependency>
|
||
<name>Airflow Monitor: Service is not running</name>
|
||
<expression>{Airflow DAG Monitor:airflow.monitor.alive.last()}=0</expression>
|
||
</dependency>
|
||
</dependencies>
|
||
<tags>
|
||
<tag>
|
||
<tag>scope</tag>
|
||
<value>availability</value>
|
||
</tag>
|
||
</tags>
|
||
</trigger>
|
||
|
||
<!-- Service down -->
|
||
<trigger>
|
||
<expression>{Airflow DAG Monitor:airflow.monitor.alive.last()}=0</expression>
|
||
<name>Airflow Monitor: Service is not running</name>
|
||
<priority>HIGH</priority>
|
||
<description>Сервис airflow-monitor не запущен.
|
||
Запустить: sudo systemctl start airflow-monitor</description>
|
||
<tags>
|
||
<tag>
|
||
<tag>scope</tag>
|
||
<value>availability</value>
|
||
</tag>
|
||
</tags>
|
||
</trigger>
|
||
|
||
<!-- Slow cycle -->
|
||
<trigger>
|
||
<expression>{Airflow DAG Monitor:airflow.monitor.cycle_time.last()}>60</expression>
|
||
<name>Airflow Monitor: Cycle time is high ({ITEM.LASTVALUE1}s)</name>
|
||
<priority>WARNING</priority>
|
||
<description>Цикл мониторинга выполняется дольше 60 секунд.</description>
|
||
<tags>
|
||
<tag>
|
||
<tag>scope</tag>
|
||
<value>performance</value>
|
||
</tag>
|
||
</tags>
|
||
</trigger>
|
||
</triggers>
|
||
|
||
<graphs>
|
||
<!-- Problem count graph -->
|
||
<graph>
|
||
<name>Airflow: Problem DAG count</name>
|
||
<graph_items>
|
||
<graph_item>
|
||
<color>FF0000</color>
|
||
<item>
|
||
<host>Airflow DAG Monitor</host>
|
||
<key>airflow.dag.problems.count</key>
|
||
</item>
|
||
</graph_item>
|
||
<graph_item>
|
||
<color>00AA00</color>
|
||
<yaxisside>RIGHT</yaxisside>
|
||
<item>
|
||
<host>Airflow DAG Monitor</host>
|
||
<key>airflow.monitor.dag_count</key>
|
||
</item>
|
||
</graph_item>
|
||
</graph_items>
|
||
</graph>
|
||
|
||
<!-- Cycle time graph -->
|
||
<graph>
|
||
<name>Airflow Monitor: Cycle time</name>
|
||
<graph_items>
|
||
<graph_item>
|
||
<color>0000FF</color>
|
||
<item>
|
||
<host>Airflow DAG Monitor</host>
|
||
<key>airflow.monitor.cycle_time</key>
|
||
</item>
|
||
</graph_item>
|
||
</graph_items>
|
||
</graph>
|
||
</graphs>
|
||
|
||
<macros>
|
||
<macro>
|
||
<macro>{$AIRFLOW.STALE_THRESHOLD}</macro>
|
||
<value>600</value>
|
||
<description>Порог устаревания данных (секунды).</description>
|
||
</macro>
|
||
<macro>
|
||
<macro>{$AIRFLOW.CYCLE_TIME_WARN}</macro>
|
||
<value>60</value>
|
||
<description>Порог предупреждения о долгом цикле (секунды).</description>
|
||
</macro>
|
||
</macros>
|
||
</template>
|
||
</templates>
|
||
|
||
<value_maps>
|
||
<value_map>
|
||
<name>Service state</name>
|
||
<mappings>
|
||
<mapping>
|
||
<value>0</value>
|
||
<newvalue>Stopped</newvalue>
|
||
</mapping>
|
||
<mapping>
|
||
<value>1</value>
|
||
<newvalue>Running</newvalue>
|
||
</mapping>
|
||
</mappings>
|
||
</value_map>
|
||
</value_maps>
|
||
</zabbix_export>
|