DevOps

HTTP запросы из Zabbix агента к Prometheus экспортеру

Пошаговое руководство по выполнению HTTP запросов из локального Zabbix агента к Prometheus экспортеру. Методы настройки и примеры конфигурации.

1 ответ 2 просмотра

Как выполнить HTTP-запрос из Zabbix агента к Prometheus экспортеру? Имеется самописный Prometheus экспортер, который слушает TCP порт и отдает метрики по запросу. Известно, что можно сделать запрос с Zabbix сервера с помощью HTTP-агента, но возможно ли выполнить такой запрос непосредственно с локального Zabbix агента?

Выполнять HTTP-запросы из Zabbix агента к Prometheus экспортеру возможно с помощью нескольких методов: HTTP-агентных элементов, пользовательских параметров, скриптовых элементов или внешних проверок. Каждый из этих подходов позволяет локальному Zabbix агенту получать метрики с вашего самописного экспортера через стандартные HTTP-запросы к указанному TCP порту.


Содержание


Возможность локального запроса

Да, выполнить HTTP-запрос непосредственно с локального Zabbix агента к Prometheus экспортеру возможно. Хотя часто используется подход с Zabbix сервера и HTTP-агентных элементов, существуют альтернативные методы, которые позволяют агенту самостоятельно запрашивать метрики с экспортера. Это особенно полезно в распределенных системах, где прямой доступ к Zabbix серверу может быть ограничен или нежелателен.


Метод 1: HTTP-агентный элемент

HTTP-агентные элементы могут использоваться не только на Zabbix сервере, но и непосредственно на локальных агентах. Этот метод позволяет агенту самостоятельно отправлять HTTP-запросы к вашему самописному Prometheus экспортеру.

Настройка HTTP-агентного элемента

Для создания HTTP-агентного элемента на локальном агенте:

  1. Откройте файл конфигурации Zabbix агента (zabbix_agentd.conf)
  2. Добавьте элемент с ключом типа http.get:
UserParameter=custom.prometheus[*],curl -s http://$1:$2/metrics
  1. Перезапустите Zabbix агент
  2. В веб-интерфейсе 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:

python
#!/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:

bash
#!/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}'

Примеры использования в элементах

  1. Элемент для всех метрик:
Ключ: prometheus.metrics[localhost,9100]
Тип данных: Текст
Интервал обновления: 30s
  1. Элемент для конкретной метрики:
Ключ: prometheus.custom[localhost,9100,my_custom_metric]
Тип данных: Числовой (нечеткий)
Интервал обновления: 30s
  1. Элемент для проверки доступности:
Ключ: prometheus.health[localhost,9100]
Тип данных: Числовой (целый)
Интервал обновления: 60s

Безопасность и аутентификация

Базовая безопасность

При настройке HTTP-запросов из Zabbix агента к Prometheus экспортеру важно учитывать следующие аспекты безопасности:

  1. Используйте HTTPS: Если возможно, настройте экспортер для работы по HTTPS
  2. Ограничьте доступ: Настройте брандмауэр, чтобы разрешать запросы только с IP-адресов Zabbix агентов
  3. Используйте аутентификацию: Если экспортер требует аутентификацию, настройте ее в 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

Устранение неполадок

Частые проблемы и решения

  1. Время ожидания истекло:
Проблема: ERROR: Connection timeout
Решение: Увеличьте таймауты в curl или проверьте доступность порта
  1. Нет ответа от экспортера:
Проблема: Пустой ответ
Решение: Проверьте, что экспортер запущен и слушает нужный порт
  1. Неверный формат метрик:
Проблема: Ошибка парсинга
Решение: Проверьте формат ответа экспортера, он должен соответствовать Prometheus формату

Проверка вручную

Для тестирования выполните команду на сервере с агентом:

bash
curl -s http://localhost:9100/metrics

Если запрос выполняется успешно, но не работает через Zabbix, проверьте:

  1. Права доступа к файлам агента
  2. Правильность параметров в конфигурации
  3. Логи Zabbix агента на предмет ошибок

Заключение

Выполнение HTTP-запросов из Zabbix агента к Prometheus экспортеру возможно и не требует подключения к Zabbix серверу. Наиболее подходящие методы включают использование HTTP-агентных элементов, пользовательских параметров с curl-командами, скриптовых элементов на Python или внешних проверок. Каждый метод имеет свои преимущества: от простоты настройки до гибкости обработки сложных запросов. Для вашего самописного экспортера, который слушает TCP порт и отдает метрики, оптимальным будет использование пользовательских параметров или скриптовых элементов, что позволит гибко извлекать нужные метрики и обрабатывать их на уровне агента.


Источники

  1. Zabbix HTTP Agent Documentation — Подробное описание HTTP-агентных элементов и их конфигурации: https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/http
  2. Zabbix Prometheus Integration Guide — Официальное руководство по интеграции Zabbix с Prometheus: https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/prometheus
  3. User Parameters Configuration — Документация по настройке пользовательских параметров в Zabbix агенте: https://www.zabbix.com/documentation/current/en/manual/config/items/userparameters
  4. StackOverflow Prometheus Exporter Query — Практический пример выполнения HTTP-запросов из Zabbix: https://stackoverflow.com/questions/73278111/prometheus-target-data-export-to-zabbix
  5. Zabbix Official Blog - Prometheus Integration — Блог Zabbix с примерами интеграции Prometheus: https://blog.zabbix.com/zabbix-4-2-prometheus-integration/7558/
  6. Script Items Documentation — Информация о скриптовых элементах в Zabbix: https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/script
  7. ServerFault - HTTP Monitoring — Сообщество с примерами мониторинга HTTP URL через Zabbix агенты: https://serverfault.com/questions/963328/how-to-monitor-http-urls-by-zabbix-agents
  8. External Checks Documentation — Описание внешних проверок в Zabbix: https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/external
  9. SBCode - Prometheus Node Exporter Tutorial — Практическое руководство по настройке Prometheus Node Exporter: https://sbcode.net/zabbix/prometheus-node-exporter-intro-install/
  10. GitHub Zabbix Exporter — Реализация Zabbix экспортера для Prometheus с примерами конфигурации: https://github.com/MyBook/zabbix-exporter
Авторы
Проверено модерацией
Модерация