16 HTTP агент

Обзор

Этот тип элемента данных позволяет опрашивать данные по протоколу HTTP/HTTPS. Также возможен траппинг с использованием утилиты Zabbix sender или протокола Zabbix sender (для отправки данных на сервер или прокси Zabbix), либо с использованием метода API history.push (для отправки данных на сервер Zabbix).

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

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

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

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

HTTP-проверки выполняются асинхронно — не требуется получать ответ на один запрос до начала других проверок. Разрешение DNS-имен также выполняется асинхронно.

Максимальная параллельность асинхронных проверок составляет 1000 (определяется параметром MaxConcurrentChecksPerPoller).

Количество асинхронных poller-процессов HTTP агента задаётся параметром StartHTTPAgentPollers.

Поддержка функции постоянных соединений cURL была добавлена в проверки HTTP агента, начиная с Zabbix 7.0.

Конфигурация

Чтобы настроить HTTP-элемент данных:

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

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

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

Параметр Описание
Тип Выберите здесь HTTP агент.
Ключ Введите уникальный ключ элемента данных.
URL URL для подключения и получения данных. Например:
https://www.example.com
http://www.example.com/download
Доменные имена могут быть указаны символами Unicode. При выполнении HTTP-проверки они автоматически преобразуются в punycode и затем в ASCII.
Кнопка Parse может использоваться для отделения необязательных полей запроса (например, ?name=Admin&password=mypassword) от URL, перемещая атрибуты и значения в Поля запроса для автоматического URL-кодирования.
Ограничено 2048 символами.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Устанавливает параметр cURL CURLOPT_URL.
Поля запроса Переменные для URL (см. выше).
Указываются как пары атрибут-значение.
Значения автоматически URL-кодируются. Значения из макросов сначала разрешаются, а затем автоматически URL-кодируются.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Устанавливает параметр cURL CURLOPT_URL.
Тип запроса Выберите тип метода запроса: GET, POST, PUT или HEAD
Тип тела запроса Выберите тип тела запроса:
Raw data - пользовательское тело HTTP-запроса, макросы подставляются, но кодирование не выполняется
JSON data - тело HTTP-запроса в формате JSON. Макросы могут использоваться как string, number, true и false; макросы, используемые как строки, должны быть заключены в двойные кавычки. Значения из макросов сначала разрешаются, а затем автоматически экранируются. Если "Content-Type" не указан в заголовках, по умолчанию будет использоваться "Content-Type: application/json"
XML data - тело HTTP-запроса в формате XML. Макросы могут использоваться как текстовый узел, атрибут или секция CDATA. Значения из макросов сначала разрешаются, а затем автоматически экранируются в текстовом узле и атрибуте. Если "Content-Type" не указан в заголовках, по умолчанию будет использоваться "Content-Type: application/xml"
Тело запроса Введите тело запроса.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Заголовки Пользовательские HTTP-заголовки, которые будут отправлены при выполнении запроса.
Указываются как пары атрибут-значение.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Устанавливает параметр cURL CURLOPT_HTTPHEADER.
Требуемые коды состояния Список ожидаемых HTTP-кодов состояния. Если Zabbix получит код, которого нет в списке, элемент данных станет неподдерживаемым. Если поле пустое, проверка не выполняется.
Например: 200,201,210-299
Поддерживаемые макросы в списке: пользовательские макросы, макросы низкоуровневого обнаружения.
Использует параметр cURL CURLINFO_RESPONSE_CODE.
Следовать перенаправлениям Установите этот флажок, чтобы следовать HTTP-перенаправлениям.
Устанавливает параметр cURL CURLOPT_FOLLOWLOCATION.
Режим получения Выберите часть ответа, которую необходимо получить:
Тело - только тело
Заголовки - только заголовки
Тело и заголовки - тело и заголовки
Преобразовать в JSON Заголовки сохраняются как пары атрибут-значение под ключом "header", если Режим получения не установлен в Тело.
Если обнаружен 'Content-Type: application/json', тогда тело сохраняется как объект, в противном случае оно сохраняется как строка, например:
HTTP прокси Вы можете указать HTTP-прокси для использования в формате [protocol://][username[:password]@]proxy.example.com[:port].
Необязательный префикс protocol:// может использоваться для указания альтернативных протоколов прокси (например, https, socks4, socks5; см. documentation; поддержка префикса протокола была добавлена в cURL 7.21.7). Если протокол не указан, прокси будет рассматриваться как HTTP-прокси. Если вы укажете неверный протокол, соединение завершится ошибкой, и элемент данных станет неподдерживаемым.
По умолчанию будет использоваться порт 1080.
Если указано, прокси переопределит связанные с прокси переменные окружения, такие как http_proxy, HTTPS_PROXY. Если не указано, прокси не будет переопределять связанные с прокси переменные окружения. Введенное значение передается "как есть", без какой-либо проверки корректности.
Обратите внимание, что с HTTP-прокси поддерживается только простая аутентификация.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Устанавливает параметр cURL CURLOPT_PROXY.
HTTP аутентификация Выберите вариант аутентификации:
Нет - аутентификация не используется;
Basic - используется базовая аутентификация;
NTLM - используется аутентификация NTLM (Windows NT LAN Manager);
Kerberos - используется аутентификация Kerberos (см. также: Настройка Kerberos в Zabbix);
Digest - используется аутентификация Digest.
Устанавливает параметр cURL CURLOPT_HTTPAUTH.
Имя пользователя Введите имя пользователя (до 255 символов).
Это поле доступно, если для HTTP аутентификация установлено значение Basic, NTLM, Kerberos или Digest. Поддерживаются пользовательские макросы и макросы низкоуровневого обнаружения.
Пароль Введите пароль пользователя (до 255 символов).
Это поле доступно, если для HTTP аутентификация установлено значение Basic, NTLM, Kerberos или Digest. Поддерживаются пользовательские макросы и макросы низкоуровневого обнаружения.
Проверять SSL-сертификат узла Установите этот флажок, чтобы проверять SSL-сертификат веб-сервера. Сертификат сервера будет автоматически взят из общесистемного расположения центра сертификации (CA). Вы можете переопределить расположение файлов CA с помощью параметра конфигурации сервера или прокси SSLCALocation.
Устанавливает параметр cURL CURLOPT_SSL_VERIFYPEER.
Проверять SSL-имя узла Установите этот флажок, чтобы проверять совпадение поля Common Name или поля Subject Alternate Name сертификата веб-сервера.
Устанавливает параметр cURL CURLOPT_SSL_VERIFYHOST.
Файл SSL-сертификата Имя файла SSL-сертификата, используемого для аутентификации клиента. Файл сертификата должен быть в формате PEM1. Если файл сертификата также содержит закрытый ключ, оставьте поле файла SSL-ключа пустым. Если ключ зашифрован, укажите пароль в поле пароля SSL-ключа. Каталог, содержащий этот файл, задается параметром конфигурации сервера или прокси SSLCertLocation.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Устанавливает параметр cURL CURLOPT_SSLCERT.
Файл SSL-ключа Имя файла закрытого SSL-ключа, используемого для аутентификации клиента. Файл закрытого ключа должен быть в формате PEM1. Каталог, содержащий этот файл, задается параметром конфигурации сервера или прокси SSLKeyLocation.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Устанавливает параметр cURL CURLOPT_SSLKEY.
Пароль SSL-ключа Пароль файла закрытого SSL-ключа.
Поддерживаемые макросы: пользовательские макросы, макросы низкоуровневого обнаружения.
Устанавливает параметр cURL CURLOPT_KEYPASSWD.
Тайм-аут Zabbix не будет тратить на обработку URL больше заданного времени (1-600 секунд). Фактически этот параметр определяет максимальное время для установления соединения с URL и максимальное время для выполнения HTTP-запроса. Таким образом, Zabbix не будет тратить на одну проверку более 2 x Тайм-аут секунд.
Устанавливает параметр cURL CURLOPT_TIMEOUT.
Дополнительную информацию о параметре Тайм-аут см. в разделе общие атрибуты элемента данных.
Включить траппинг Если этот флажок установлен, элемент данных также будет функционировать как элемент данных trapper и будет принимать данные, отправленные на сервер или прокси Zabbix с помощью утилиты Zabbix sender или протокола Zabbix sender, либо будет принимать данные, отправленные на сервер Zabbix с помощью метода API history.push. Дополнительную информацию об отправке данных см. в разделе: Элементы данных trapper.
Разрешенные узлы сети Отображается только если установлен флажок Включить траппинг.
Список 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-compatible IPv6 addresses" (префикс 0000::/96) поддерживаются, но объявлены устаревшими в RFC4291.
Пример: 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. Более подробная информация доступна при выполнении команды оболочки: # man curl.

[1] Zabbix поддерживает только файлы сертификатов и закрытых ключей в формате 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, чтобы узнать, как их заполнять.

Пример 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-модуля в разделе Последние данные: