16. HTTP агент

Обзор

Этот тип элемента данных позволяет получать данные с использованием протокола HTTP/HTTPS. Трапы также возможны с использованием Zabbix sender или протокола Zabbix sender.

Проверка HTTP элемента данных выполняется на стороне Zabbix сервера. Однако, если узлы сети наблюдаются через Zabbix прокси, проверки HTTP элементов данных выполняются этими прокси.

Проверки HTTP элементов данных не требуют наличия какого-либо агента, запущенного на наблюдаемом узле сети.

HTTP агент поддерживает как HTTP, так и HTTPS. Zabbix будет опционально следовать перенаправлениям (смотрите ниже опцию Следовать перенаправлениям). Максимальное количество перенаправлений вшито в код и равно 10 (используется cURL опция CURLOPT_MAXREDIRS).

Zabbix сервер/прокси должны быть изначально сконфигурированы с поддержкой cURL (libcurl).

Настройка

Для настройки HTTP элемента данных:

  • Перейдите в: НастройкаУзлы сети
  • Нажмите на Элементы данных в строке с узлом сети
  • Нажмите на Создать элемент данных
  • Введите параметры элемента данных в диалоге

Все обязательные поля ввода отмечены красной звёздочкой.

Поля, которые требуют информацию, специфичную для HTTP элементов данных:

Параметр Описание
Тип (Type) Здесь выберите HTTP агент.
Ключ (Key) Введите уникальный ключ элемента данных.
URL URL для подключения и получения данных. Например:
https://www.example.com
http://www.example.com/download
Имена доменов можно указывать Юникод символами. Они автоматически конвертируются методом punycode в ASCII при выполнении HTTP проверки.
Кнопку Анализ (Parse) можно использовать, чтобы отделить из URL опциональные поля запроса (например, ?name=Admin&password=mypassword), переместив атрибуты и значения в Поля запроса, чтобы URL кодировка выполнялась автоматически.
Ограничено 2048 символами.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLOPT_URL [en].
Поля запроса
(Query fields)
Переменные для URL (см. выше).
Задаются в виде пар атрибутов и значений.
Значения автоматически URL-кодируются. Значения из макросов раскрываются и затем автоматически URL-кодируются.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLOPT_URL [en].
Тип запроса
(Request type)
Выберите тип метода запроса: GET, POST, PUT или HEAD
Время ожидания
(Timeout)
Zabbix не будет тратить более указанного времени при обработке URL (1-60 секунд). В действительности же этот параметр определяет максимальное время создания подключения к URL и максимальное время выполнения HTTP запроса. Следовательно, Zabbix не будет тратить более 2 x Время ожидания секунд за одну проверку.
Поддерживаются суффиксы времени, например, 30s, 1m.
Поддерживаемые макросы: пользовательские макросы, макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLOPT_TIMEOUT [en].
Тип тела запроса
(Request body type)
Выберите тип тела запроса:
Сырые данные (Raw data) — пользовательское тело HTTP запроса, макросы заменяются, но кодирование не выполняется
JSON данные (JSON data) — тело HTTP запроса в формате JSON. Макросы можно использовать в виде строк, чисел, true или false; макросы, которые используются в виде строки, должны быть заключены в двойные кавычки. Значения из макросов раскрываются и затем экранируются автоматически. Если в заголовках «Content-Type» не задан, тогда будет указано значение по умолчанию «Content-Type: application/json»
XML данные (XML data) — тело HTTP запроса в формате XML. Макросы можно использовать в виде текстового узла, атрибута или секции CDATA. Значения из макросов раскрываются и затем автоматически экранируются в текстовых узлах и в атрибутах. Если в заголовках «Content-Type» не задан, тогда будет указано значение по умолчанию «Content-Type: application/xml»
Обратите внимание, что выбор XML данные требует наличия поддержки libxml2.
Тело запроса
(Request body)
Введите тело запроса.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Заголовки
(Headers)
Пользовательские HTTP заголовки, которые будут отправлены при выполнении запроса.
Задаются в виде пар атрибутов и значений.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLOPT_HTTPHEADER [en].
Требуемые коды состояния
(Required status codes)
Список ожидаемых кодов состояния HTTP. Если Zabbix получает код не из списка, то элемент данных станет неподдерживаемым. Если поле не заполнено, то проверка не производится.
Например: 200,201,210-299
Поддерживаемые макросы в этом списке: пользовательские макросы, макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLINFO_RESPONSE_CODE [en].
Следовать перенаправлениям
(Follow redirects)
Отметьте для следования HTTP перенаправлениям.
Это поле задаёт опцию cURL CURLOPT_FOLLOWLOCATION [en].
Режим получения
(Retrieve mode)
Выберите часть ответа, которую необходимо получать:
Тело (Body) — только тело
Заголовки (Headers) — только заголовки
Тело и заголовки (Body and headers) — тело и заголовки
Конвертация в JSON
(Convert to JSON)
Заголовки сохраняются в виде пар атрибутов и значений под ключом "header".
Если встречается 'Content-Type: application/json', тогда тело сохраняется в виде объекта, в противном случае оно сохраняется в виде строки, например:
HTTP прокси<br(HTTP proxy) Вы можете указать необходимый HTTP прокси, следуя формату: [протокол://][имя пользователя[:пароль]@]proxy.example.com[:порт]
Можно использовать опциональный префикс протокол://, чтобы указать альтернативные протоколы прокси (например: https, socks4, socks5; смотрите документацию [en]; поддержка префиксов протоколов добавлена в cURL 7.21.7). Если протокол не указан, прокси будет обрабатываться как HTTP прокси. Если вы укажете ошибочный протокол, подключение завершится неудачей и элемент данных перейдёт в неподдерживаемое состояние.
По умолчанию будет использоваться порт 1080.
Если этот параметр указан, прокси заменит переменные окружения, связанные с прокси — такие как http_proxy, HTTPS_PROXY. Если не указан, переменные окружения не будут заменены. Введённое значение передается «как есть», проверка корректности ввода не производится.
Примечание: Для HTTP прокси поддерживается только простая аутентификация.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLOPT_PROXY [en].
HTTP Аутентификация
(HTTP authentication)
Тип аутентификации:
Пусто (None) — без использования аутентификации.
Простая аутентификация (Basic) — с использованием простой аутентификации.
NTLM аутентификация (NTLM) — с использованием NTLM (Windows NT LAN Manager) аутентификации.
Kerberos — с использованием Kerberos аутентификации. Смотрите также: Настройка Kerberos с Zabbix.
Digest — с использованием Digest аутентификации.
После выбора какой-либо метода аутентификации, будут доступны два дополнительных поля для ввода имени пользователя и пароля, в которых поддерживаются пользовательские макросы и макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLOPT_HTTPAUTH [en].
Проверка SSL узла
(SSL verify peer)
Отметьте флажок для верификации SSL сертификата веб-сервера. Сертификат сервера будет автоматически взят из местоположения центра сертификации (CA) всей системы. Вы можете переопределить расположение CA файлов, воспользовавшись параметром конфигурации SSLCALocation на стороне Zabbix сервера или прокси.
Это поле задаёт опцию cURL CURLOPT_SSL_VERIFYPEER [en].
Проверка SSL хоста
(SSL verify host)
Отметьте флажок для удостоверения, что поле Common Name или поле Subject Alternate Name сертификата веб-сервера совпадают.
Это поле задаёт опцию cURL CURLOPT_SSL_VERIFYHOST [en].
Файл SSL сертификата
(SSL certificate file)
Имя файла SSL сертификата для аутентификации клиента. Файл сертификата должен быть в формате PEM1. Если файл сертификата также содержит и закрытый ключ (private key), оставьте поле Файл SSL ключа пустым. Если ключ зашифрован, укажите пароль в поле Пароль к SSL ключу. Папка, содержащая этот файл, указывается в параметре конфигурации SSLCertLocation Zabbix сервера или прокси.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLOPT_SSLCERT [en].
Файл SSL ключа
(SSL key file)
Имя файла закрытого ключа SSL (private key), который используется для аутентификации клиента. Файл закрытого ключа должен быть в формате PEM1. Папка, содержащая этот файл, указывается в параметре конфигурации SSLKeyLocation Zabbix сервера или прокси.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLOPT_SSLKEY [en].
Пароль к SSL ключу
(SSL key password)
Пароль к файлу закрытого ключа.
Поддерживаемые макросы: пользовательские макросы, макросы низкоуровневого обнаружения.
Это поле задаёт опцию cURL CURLOPT_KEYPASSWD [en].
Активировать трапы
(Enable trapping)
При включении этой опции элемент данных будет работать также и как траппер элемент данных и будет принимать данные, которые отправляются на этот элемент данных при помощи Zabbix sender или с использованием протокола Zabbix sender.
Разрешённые хосты
(Allowed hosts)
Доступно, только если выбрана опция Активировать трапы.
Список разделённых запятыми IP адресов, опционально в CIDR представлении, или DNS имён.
Если задано, входящие подключения будут приниматься только с перечисленных здесь хостов.
Если включена поддержка IPv6, тогда «127.0.0.1», «::127.0.0.1», «::ffff:127.0.0.1» обрабатываются одинаково и «::/0» будет разрешать любые IPv4 или IPv6 адреса.
«0.0.0.0/0» можно использовать, чтобы разрешить любые IPv4 адреса.
Обратите внимание, что «IPv4-совместимые IPv6 адреса» (префикс 0000::/96) поддерживаются, но являются устаревшими согласно RFC4291 [en].

Пример: 127.0.0.1, 192.168.1.0/24, 192.168.3.1-255, 192.168.1-10.1-255, ::1,2001:db8::/32, mysqlserver1, zabbix.example.com, {HOST.HOST}
В этом поле разрешены пробелы и пользовательские макросы.
Макросы узлов сети: {HOST.HOST}, {HOST.NAME}, {HOST.IP}, {HOST.DNS}, {HOST.CONN} поддерживаются в этом поле.

Если поле HTTP прокси оставить пустым, можно воспользоваться другим способом указать HTTP прокси, для этого необходимо задать переменные окружения.

Для HTTP проверок — укажите переменную окружения http_proxy для пользователя Zabbix сервера. Например:
http_proxy=http://proxy_ip:proxy_port.

Для HTTPS проверок — укажите переменную окружения HTTPS_PROXY. Например:
HTTPS_PROXY=http://proxy_ip:proxy_port. Более подробная информация доступна при выполнении shell команды # man curl.

[1] Zabbix поддерживает файлы сертификатов и закрытых ключей (private keys) только в формате PEM. В случае, если у вас имеются данные сертификата и закрытого ключа в формате файла PKCS #12 (обычно поставляются с расширениями *.p12 или *.pfx), вы можете сгенерировать из них PEM файл, используя следующие команды:

openssl pkcs12 -in ssl-cert.p12 -clcerts -nokeys -out ssl-cert.pem
       openssl pkcs12 -in ssl-cert.p12 -nocerts -nodes  -out ssl-cert.key

Примеры

Пример 1

Отправка простых GET запросов на получение данных с таких сервисов, как Elasticsearch:

  • Создайте GET элемент данных с URL: localhost:9200/?pretty
  • Обратите внимание на ответ:
{
         "name" : "YQ2VAY-",
         "cluster_name" : "elasticsearch",
         "cluster_uuid" : "kH4CYqh5QfqgeTsjh2F9zg",
         "version" : {
           "number" : "6.1.3",
           "build_hash" : "af51318",
           "build_date" : "2018-01-26T18:22:55.523Z",
           "build_snapshot" : false,
           "lucene_version" : "7.1.0",
           "minimum_wire_compatibility_version" : "5.6.0",
           "minimum_index_compatibility_version" : "5.0.0"
         },
         "tagline" : "You know, for search"
       }
  • Теперь извлеките номер версии, используя шаг предварительной обработки JSONPath: $.version.number
Пример 2

Отправка простых POST запросов на получение данных с таких сервисов, как Elasticsearch:

  • Создайте POST элемент данных с URL: http://localhost:9200/str/values/_search?scroll=10s
  • Настройте следующее тело POST, чтобы получать загрузку процессора (среднее значение за 1 минуту по каждому ядру)
{
           "query": {
               "bool": {
                   "must": [{
                       "match": {
                           "itemid": 28275
                       }
                   }],
                   "filter": [{
                       "range": {
                           "clock": {
                               "gt": 1517565836,
                               "lte": 1517566137
                           }
                       }
                   }]
               }
           }
       }
  • Получено:
{
           "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAAkFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAJRZZUTJWQVktVFNacU5nRHhlcEI0QUxRAAAAAAAAACYWWVEyVkFZLVRTWnFOZ0R4ZXBCNEFMUQAAAAAAAAAnFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAKBZZUTJWQVktVFNacU5nRHhlcEI0QUxR",
           "took": 18,
           "timed_out": false,
           "_shards": {
               "total": 5,
               "successful": 5,
               "skipped": 0,
               "failed": 0
           },
           "hits": {
               "total": 1,
               "max_score": 1.0,
               "hits": [{
                   "_index": "dbl",
                   "_type": "values",
                   "_id": "dqX9VWEBV6sEKSMyk6sw",
                   "_score": 1.0,
                   "_source": {
                       "itemid": 28275,
                       "value": "0.138750",
                       "clock": 1517566136,
                       "ns": 25388713,
                       "ttl": 604800
                   }
               }]
           }
       }
  • Теперь используйте шаг предварительной обработки JSONPath, чтобы получить значение элемента данных: $.hits.hits[0]._source.value
Пример 3

Проверка, доступен ли Zabbix API, используя apiinfo.version.

  • Настройка элемента данных:

Обратите внимание на использование метода POST с данными JSON, установку заголовков запроса и запрос на возврат только заголовков:

  • Предварительная обработка значений элемента данных при помощи регулярного выражения, чтобы получить HTTP код:

  • Проверка результата в Последние данные:

Пример 4

Получение информации о погоде с публичного сервиса Openweathermap.

  • Настройка основного элемента данных для массового сбора данных в одном JSON:

Обратите внимание на использование макросов в полях запроса. Обратитесь к Openweathermap API [en] для получения подробных сведений о том, чем их заполнять.

Пример JSON, который вернулся в ответе HTTP агенту:

{
           "body": {
               "coord": {
                   "lon": 40.01,
                   "lat": 56.11
               },
               "weather": [{
                   "id": 801,
                   "main": "Clouds",
                   "description": "few clouds",
                   "icon": "02n"
               }],
               "base": "stations",
               "main": {
                   "temp": 15.14,
                   "pressure": 1012.6,
                   "humidity": 66,
                   "temp_min": 15.14,
                   "temp_max": 15.14,
                   "sea_level": 1030.91,
                   "grnd_level": 1012.6
               },
               "wind": {
                   "speed": 1.86,
                   "deg": 246.001
               },
               "clouds": {
                   "all": 20
               },
               "dt": 1526509427,
               "sys": {
                   "message": 0.0035,
                   "country": "RU",
                   "sunrise": 1526432608,
                   "sunset": 1526491828
               },
               "id": 487837,
               "name": "Stavrovo",
               "cod": 200
           }
       }

Следующая задача — настройка зависимых элементов данных, которые извлекут данные из JSON.

  • Настройка примера зависимого элемента данных для влажности:

Другие метрики погоды, такие как «Температура», добавляются тем же способом.

  • Пример предобработки значений зависимого элемента данных с использованием JSONPath:

  • Проверка результата данных о погоде в Последние данные:

Пример 5

Подключение в странице состояния Nginx и получение его метрик за один запрос.

  • Настройте основной элемент данных для массового сбора данных:

Пример вывода состояния Nginx stub:

Active connections: 1 Active connections:
       server accepts handled requests
        52 52 52 
       Reading: 0 Writing: 1 Waiting: 0

Следующая задача — настроить зависимые элементы данных, которые извлекают необходимые данные.

  • Настройка примера зависимого элемента данных для запросов в секунду:

  • Настройка предварительной обработки значений зависимого элемента данных при помощи регулярного выражения server accepts handled requests\s+([0-9]+) ([0-9]+) ([0-9]+):

  • Проверьте полученный результат от модуля stub в Последние данные: