9. HTTP агент

Обзор

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

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

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

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

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

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

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

Количество асинхронных poller'ов HTTP agent определяется параметром StartHTTPAgentPollers.

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

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

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

  1. Перейдите в Сбор данных > Узлы сети.
  2. Нажмите Элементы данных в строке узла сети.
  3. Нажмите Создать элемент данных.
  4. Введите параметры элемента данных в форме.

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

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

Parameter Description
Type Выберите здесь HTTP agent.
Key Введите уникальный ключ элемента данных.
URL URL для подключения и получения данных. Например:
https://www.example.com
http://www.example.com/download
Доменные имена можно указывать в символах Unicode. При выполнении HTTP-проверки они автоматически преобразуются в punycode и ASCII.
Кнопка Parse может использоваться для отделения необязательных полей запроса (например, ?name=Admin&password=mypassword) от URL с переносом атрибутов и значений в Query fields для автоматического URL-кодирования.
Ограничено 2048 символами.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это задает параметр cURL CURLOPT_URL.
Query fields Переменные для 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.
Request type Выберите тип метода запроса: GET, POST, PUT или HEAD
Request body type Выберите тип тела запроса:
Raw data - пользовательское тело HTTP-запроса, макросы подставляются, но кодирование не выполняется
JSON data - тело HTTP-запроса в формате JSON. Макросы можно использовать как строку, число, true и false; макросы, используемые как строки, должны быть заключены в двойные кавычки. Значения из макросов подставляются, а затем автоматически экранируются. Если в заголовках не указан "Content-Type", по умолчанию будет использоваться "Content-Type: application/json"
XML data - тело HTTP-запроса в формате XML. Макросы можно использовать как текстовый узел, атрибут или секцию CDATA. Значения из макросов подставляются, а затем автоматически экранируются в текстовом узле и атрибуте. Если в заголовках не указан "Content-Type", по умолчанию будет использоваться "Content-Type: application/xml"
Request body Введите тело запроса.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Headers Пользовательские HTTP-заголовки, которые будут отправлены при выполнении запроса.
Указываются как пары атрибутов и значений.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это задает параметр cURL CURLOPT_HTTPHEADER.
Required status codes Список ожидаемых HTTP-кодов состояния. Если Zabbix получает код, которого нет в списке, элемент данных станет неподдерживаемым. Если поле пустое, проверка не выполняется.
Например: 200,201,210-299
Поддерживаемые макросы в списке: пользовательские макросы, макросы низкоуровневого обнаружения.
Используется параметр cURL CURLINFO_RESPONSE_CODE.
Follow redirects Установите флажок, чтобы следовать HTTP-перенаправлениям.
Это задает параметр cURL CURLOPT_FOLLOWLOCATION.
Retrieve mode Выберите часть ответа, которую нужно получить:
Body - только тело
Headers - только заголовки
Body and headers - тело и заголовки
Convert to JSON Заголовки сохраняются как пары атрибутов и значений под ключом "header", если Retrieve mode не установлен в Body.
Если обнаружен 'Content-Type: application/json', тело сохраняется как объект, в противном случае оно хранится как строка, например:
HTTP proxy Можно указать HTTP-прокси для использования в формате [protocol://][username[:password]@]proxy.example.com[:port].
Необязательный префикс protocol:// можно использовать для указания альтернативных протоколов прокси (например, https, socks4, socks5; см. документацию; поддержка префикса протокола была добавлена в 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 authentication Выберите вариант аутентификации:
None - аутентификация не используется;
Basic - используется базовая аутентификация;
NTLM - используется аутентификация NTLM (Windows NT LAN Manager);
Kerberos - используется аутентификация Kerberos (см. также: Настройка Kerberos в Zabbix);
Digest - используется аутентификация Digest.
Это задает параметр cURL CURLOPT_HTTPAUTH.
User name Введите имя пользователя (до 255 символов).
Это поле доступно, если для HTTP authentication выбрано Basic, NTLM, Kerberos или Digest. Поддерживаются пользовательские макросы и макросы низкоуровневого обнаружения.
Password Введите пароль пользователя (до 255 символов).
Это поле доступно, если для HTTP authentication выбрано Basic, NTLM, Kerberos или Digest. Поддерживаются пользовательские макросы и макросы низкоуровневого обнаружения.
SSL verify peer Установите флажок, чтобы проверить SSL-сертификат веб-сервера. Сертификат сервера будет автоматически взят из системного хранилища центров сертификации (CA). Вы можете переопределить расположение файлов CA с помощью параметра конфигурации Zabbix server или proxy SSLCALocation.
Это задает параметр cURL CURLOPT_SSL_VERIFYPEER.
SSL verify host Установите флажок, чтобы проверить, совпадает ли поле Common Name или поле Subject Alternate Name в сертификате веб-сервера.
Это задает параметр cURL CURLOPT_SSL_VERIFYHOST.
SSL certificate file Имя файла SSL-сертификата, используемого для аутентификации клиента. Файл сертификата должен быть в формате PEM1. Если файл сертификата также содержит закрытый ключ, оставьте поле SSL key file пустым. Если ключ зашифрован, укажите пароль в поле SSL key password. Каталог, содержащий этот файл, задается параметром конфигурации Zabbix server или proxy SSLCertLocation.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это задает параметр cURL CURLOPT_SSLCERT.
SSL key file Имя файла закрытого SSL-ключа, используемого для аутентификации клиента. Файл закрытого ключа должен быть в формате PEM1. Каталог, содержащий этот файл, задается параметром конфигурации Zabbix server или proxy SSLKeyLocation.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы низкоуровневого обнаружения.
Это задает параметр cURL CURLOPT_SSLKEY.
SSL key password Пароль файла закрытого SSL-ключа.
Поддерживаемые макросы: пользовательские макросы, макросы низкоуровневого обнаружения.
Это задает параметр cURL CURLOPT_KEYPASSWD.
Timeout Zabbix не будет тратить на обработку URL больше заданного времени (1-600 секунд). Фактически этот параметр определяет максимальное время на установление соединения с URL и максимальное время на выполнение HTTP-запроса. Поэтому Zabbix не будет тратить на одну проверку более 2 x Timeout секунд.
Это задает параметр cURL CURLOPT_TIMEOUT.
Дополнительные сведения о параметре Timeout см. в разделе общие атрибуты элемента данных.
Enable trapping Если этот флажок установлен, элемент данных также будет работать как элемент данных типа trapper и будет принимать данные, отправленные на сервер или прокси Zabbix с помощью утилиты Zabbix sender или протокола Zabbix sender, либо будет принимать данные, отправленные на сервер Zabbix с помощью метода API history.push. Дополнительные сведения об отправке данных см. в разделе: Элементы данных типа trapper.
Allowed hosts Отображается только если установлен флажок Enable trapping.
Список IP-адресов, разделенных запятыми (при необходимости в нотации CIDR), или DNS-имен.

Значение по умолчанию — пользовательский макрос {$TRAPPER.ALLOWED_HOSTS}. По умолчанию {$TRAPPER.ALLOWED_HOSTS} равно 127.0.0.1,::1. Вы можете либо ввести адреса непосредственно в поле, либо изменить значение макроса. Если поле оставить пустым, входящие соединения будут запрещены со всех узлов сети. Если значение указано, входящие соединения будут приниматься только от перечисленных здесь узлов сети.
Если включена поддержка 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 prefix) поддерживаются, но считаются устаревшими согласно 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 proxy оставить пустым, другим способом использования 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 body, чтобы получить загрузку процессора (среднее за 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

Проверка доступности API Zabbix с использованием 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.

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

Другие погодные показатели, такие как 'Temperature', добавляются аналогичным образом.

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

  • Проверьте результат данных о погоде в Latest data:

Пример 5

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

Пример вывода stub status Nginx:

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