HTTP запросы из Zabbix агента к Prometheus экспортеру
Пошаговое руководство по выполнению HTTP запросов из локального Zabbix агента к Prometheus экспортеру. Методы настройки и примеры конфигурации.
Как выполнить HTTP-запрос из Zabbix агента к Prometheus экспортеру? Имеется самописный Prometheus экспортер, который слушает TCP порт и отдает метрики по запросу. Известно, что можно сделать запрос с Zabbix сервера с помощью HTTP-агента, но возможно ли выполнить такой запрос непосредственно с локального Zabbix агента?
Выполнять HTTP-запросы из Zabbix агента к Prometheus экспортеру возможно с помощью нескольких методов: HTTP-агентных элементов, пользовательских параметров, скриптовых элементов или внешних проверок. Каждый из этих подходов позволяет локальному Zabbix агенту получать метрики с вашего самописного экспортера через стандартные HTTP-запросы к указанному TCP порту.
Содержание
- Возможность локального запроса
- Метод 1: HTTP-агентный элемент
- Метод 2: Пользовательские параметры
- Метод 3: Скриптовые элементы
- Метод 4: Внешние проверки
- Конфигурация и примеры
- Безопасность и аутентификация
- Устранение неполадок
- Заключение
Возможность локального запроса
Да, выполнить HTTP-запрос непосредственно с локального Zabbix агента к Prometheus экспортеру возможно. Хотя часто используется подход с Zabbix сервера и HTTP-агентных элементов, существуют альтернативные методы, которые позволяют агенту самостоятельно запрашивать метрики с экспортера. Это особенно полезно в распределенных системах, где прямой доступ к Zabbix серверу может быть ограничен или нежелателен.
Метод 1: HTTP-агентный элемент
HTTP-агентные элементы могут использоваться не только на Zabbix сервере, но и непосредственно на локальных агентах. Этот метод позволяет агенту самостоятельно отправлять HTTP-запросы к вашему самописному Prometheus экспортеру.
Настройка HTTP-агентного элемента
Для создания HTTP-агентного элемента на локальном агенте:
- Откройте файл конфигурации Zabbix агента (
zabbix_agentd.conf) - Добавьте элемент с ключом типа
http.get:
UserParameter=custom.prometheus[*],curl -s http://$1:$2/metrics
- Перезапустите Zabbix агент
- В веб-интерфейсе Zabbix создайте элемент с использованием этого параметра
Преимущества метода
- Простота настройки
- Низкие требования к ресурсам
- Поддержка стандартных HTTP/HTTPS протоколов
- Возможность обработки ответов через препроцессинг
Метод 2: Пользовательские параметры
Пользовательские параметры предоставляют гибкий способ выполнения произвольных команд на локальном агенте, что идеально подходит для HTTP-запросов к Prometheus экспортеру.
Конфигурация в zabbix_agentd.conf
Добавьте следующие строки в конфигурационный файл агента:
# Базовый параметр для запроса к Prometheus
UserParameter=prometheus.get[*],/usr/bin/curl -s --connect-timeout 5 --max-time 10 http://$1:$2/metrics
# Параметр для извлечения конкретных метрик
UserParameter=prometheus.metric[*],/usr/bin/curl -s http://$1:$2/metrics | grep "$3" | awk '{print $2}'
Пример использования
# Запрос всех метрик
prometheus.get[localhost,9100]
# Запрос конкретной метрики
prometheus.metric[localhost,9100,cpu_usage]
Этот метод позволяет выполнять curl-команды напрямую с агента и обрабатывать их результаты.
Метод 3: Скриптовые элементы
Скриптовые элементы предоставляют более продвинутый подход, который можно использовать для создания сложных HTTP-запросов к вашему самописному Prometheus экспортеру.
Пример на Python
Создайте скрипт /usr/local/bin/prometheus_query.py:
#!/usr/bin/env python3
import sys
import requests
import json
from urllib.parse import urlparse
def query_prometheus(host, port, metric=None):
try:
url = f"http://{host}:{port}/metrics"
response = requests.get(url, timeout=10)
response.raise_for_status()
if metric:
# Извлечение конкретной метрики
for line in response.text.split('\n'):
if line.startswith(metric):
return line.split(' ')[1]
else:
# Возврат всех метрик
return response.text
except Exception as e:
return f"ERROR: {str(e)}"
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: prometheus_query.py <host> <port> [metric]")
sys.exit(1)
host = sys.argv[1]
port = sys.argv[2]
metric = sys.argv[3] if len(sys.argv) > 3 else None
result = query_prometheus(host, port, metric)
print(result)
Настройка параметра в агенте
UserParameter=prometheus.script[*],/usr/local/bin/prometheus_query.py $1 $2 $3
Метод 4: Внешние проверки
Внешние проверки позволяют запускать внешние скрипты из Zabbix, которые могут выполнять HTTP-запросы к Prometheus экспортеру.
Создание проверочного скрипта
Создайте скрипт /usr/local/zabbix/externalscripts/prometheus_exporter_check.sh:
#!/bin/bash
HOST=$1
PORT=$2
METRIC=$3
if [ -z "$METRIC" ]; then
curl -s "http://${HOST}:${PORT}/metrics"
else
curl -s "http://${HOST}:${PORT}/metrics" | grep "^${METRIC}" | awk '{print $2}'
fi
Настройка прав доступа
chmod +x /usr/local/zabbix/externalscripts/prometheus_exporter_check.sh
Конфигурация элемента
UserParameter=prometheus.external[*],/usr/local/zabbix/externalscripts/prometheus_exporter_check.sh $1 $2 $3
Конфигурация и примеры
Базовая конфигурация для HTTP-запросов
Для вашего самописного экспортера, который слушает TCP порт и отдает метрики, минимальная конфигурация будет выглядеть так:
# zabbix_agentd.conf
# Параметр для получения всех метрик
UserParameter=prometheus.metrics[*],curl -s --connect-timeout 5 --max-time 10 http://$1:$2/metrics
# Параметр для проверки доступности
UserParameter=prometheus.health[*],curl -s --connect-timeout 5 --max-time 10 http://$1:$2/metrics | grep -c "# HELP"
# Пример извлечения конкретной метрики
UserParameter=prometheus.custom[*],/usr/bin/curl -s http://$1:$2/metrics | grep "$3" | awk '{print $2}'
Примеры использования в элементах
- Элемент для всех метрик:
Ключ: prometheus.metrics[localhost,9100]
Тип данных: Текст
Интервал обновления: 30s
- Элемент для конкретной метрики:
Ключ: prometheus.custom[localhost,9100,my_custom_metric]
Тип данных: Числовой (нечеткий)
Интервал обновления: 30s
- Элемент для проверки доступности:
Ключ: prometheus.health[localhost,9100]
Тип данных: Числовой (целый)
Интервал обновления: 60s
Безопасность и аутентификация
Базовая безопасность
При настройке HTTP-запросов из Zabbix агента к Prometheus экспортеру важно учитывать следующие аспекты безопасности:
- Используйте HTTPS: Если возможно, настройте экспортер для работы по HTTPS
- Ограничьте доступ: Настройте брандмауэр, чтобы разрешать запросы только с IP-адресов Zabbix агентов
- Используйте аутентификацию: Если экспортер требует аутентификацию, настройте ее в curl-запросе
Пример с аутентификацией
UserParameter=prometheus.auth[*],curl -s --connect-timeout 5 --max-time 10 -u username:password http://$1:$2/metrics
Конфигурация брандмауэра
Разрешите входящие соединения только с IP-адресов Zabbix агентов:
# Для iptables
iptables -A INPUT -p tcp --dport 9100 -s <zabbix_agent_ip> -j ACCEPT
iptables -A INPUT -p tcp --dport 9100 -j DROP
Устранение неполадок
Частые проблемы и решения
- Время ожидания истекло:
Проблема: ERROR: Connection timeout
Решение: Увеличьте таймауты в curl или проверьте доступность порта
- Нет ответа от экспортера:
Проблема: Пустой ответ
Решение: Проверьте, что экспортер запущен и слушает нужный порт
- Неверный формат метрик:
Проблема: Ошибка парсинга
Решение: Проверьте формат ответа экспортера, он должен соответствовать Prometheus формату
Проверка вручную
Для тестирования выполните команду на сервере с агентом:
curl -s http://localhost:9100/metrics
Если запрос выполняется успешно, но не работает через Zabbix, проверьте:
- Права доступа к файлам агента
- Правильность параметров в конфигурации
- Логи Zabbix агента на предмет ошибок
Заключение
Выполнение HTTP-запросов из Zabbix агента к Prometheus экспортеру возможно и не требует подключения к Zabbix серверу. Наиболее подходящие методы включают использование HTTP-агентных элементов, пользовательских параметров с curl-командами, скриптовых элементов на Python или внешних проверок. Каждый метод имеет свои преимущества: от простоты настройки до гибкости обработки сложных запросов. Для вашего самописного экспортера, который слушает TCP порт и отдает метрики, оптимальным будет использование пользовательских параметров или скриптовых элементов, что позволит гибко извлекать нужные метрики и обрабатывать их на уровне агента.
Источники
- Zabbix HTTP Agent Documentation — Подробное описание HTTP-агентных элементов и их конфигурации: https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/http
- Zabbix Prometheus Integration Guide — Официальное руководство по интеграции Zabbix с Prometheus: https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/prometheus
- User Parameters Configuration — Документация по настройке пользовательских параметров в Zabbix агенте: https://www.zabbix.com/documentation/current/en/manual/config/items/userparameters
- StackOverflow Prometheus Exporter Query — Практический пример выполнения HTTP-запросов из Zabbix: https://stackoverflow.com/questions/73278111/prometheus-target-data-export-to-zabbix
- Zabbix Official Blog - Prometheus Integration — Блог Zabbix с примерами интеграции Prometheus: https://blog.zabbix.com/zabbix-4-2-prometheus-integration/7558/
- Script Items Documentation — Информация о скриптовых элементах в Zabbix: https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/script
- ServerFault - HTTP Monitoring — Сообщество с примерами мониторинга HTTP URL через Zabbix агенты: https://serverfault.com/questions/963328/how-to-monitor-http-urls-by-zabbix-agents
- External Checks Documentation — Описание внешних проверок в Zabbix: https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/external
- SBCode - Prometheus Node Exporter Tutorial — Практическое руководство по настройке Prometheus Node Exporter: https://sbcode.net/zabbix/prometheus-node-exporter-intro-install/
- GitHub Zabbix Exporter — Реализация Zabbix экспортера для Prometheus с примерами конфигурации: https://github.com/MyBook/zabbix-exporter