> Как реализовать джобы с разной частотой выгрузки данных из Zabbix (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: Международный аэропорт Шереметьево

Стек: Python

> Пример ответа

Для реализации джоб с разной частотой выгрузки данных из Zabbix на Python можно использовать комбинацию планировщика задач (например, APScheduler или schedule) и асинхронного подхода с asyncio. Вот пример:

PYTHON
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.interval import IntervalTrigger
import asyncio
import aiohttp
from datetime import datetime
class ZabbixDataExporter:
def __init__(self, zabbix_url, api_token):
self.zabbix_url = zabbix_url
self.api_token = api_token
self.scheduler = AsyncIOScheduler()
async def fetch_data(self, item_ids, interval_name):
async with aiohttp.ClientSession() as session:
payload = {
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": "extend",
"itemids": item_ids,
"history": "0" # последние данные
},
"auth": self.api_token,
"id": 1
}
async with session.post(self.zabbix_url, json=payload) as resp:
data = await resp.json()
print(f"[{interval_name}] {datetime.now()}: Получено {len(data.get('result', []))} элементов")
# Здесь логика сохранения в БД или файл
def setup_jobs(self):
# Джоба с частотой 5 минут
self.scheduler.add_job(
self.fetch_data,
trigger=IntervalTrigger(minutes=5),
args=[["item_id_1", "item_id_2"], "5min"],
id="job_5min"
)
# Джоба с частотой 1 час
self.scheduler.add_job(
self.fetch_data,
trigger=IntervalTrigger(hours=1),
args=[["item_id_3", "item_id_4"], "1hour"],
id="job_1hour"
)
# Джоба с частотой 1 день
self.scheduler.add_job(
self.fetch_data,
trigger=IntervalTrigger(days=1),
args=[["item_id_5"], "daily"],
id="job_daily"
)
def run(self):
self.setup_jobs()
self.scheduler.start()
try:
asyncio.get_event_loop().run_forever()
except KeyboardInterrupt:
self.scheduler.shutdown()
if __name__ == "__main__":
exporter = ZabbixDataExporter("http://zabbix/api_jsonrpc.php", "your_api_token")
exporter.run()

Ключевые моменты:

  • Используем AsyncIOScheduler для асинхронной работы, что позволяет не блокировать выполнение при множестве джоб.
  • Каждая джоба имеет свой IntervalTrigger с разным интервалом (минуты, часы, дни).
  • Для каждого набора item-ов (метрик Zabbix) можно задать свою частоту выгрузки.
  • Асинхронные HTTP-запросы через aiohttp обеспечивают эффективную работу с API Zabbix.

При необходимости более сложной логики (например, выгрузка исторических данных за период) можно добавить параметры time_from и time_till в запрос к Zabbix API.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью