HTTP агент

Обзор

Этот тип элемента данных позволяет выполнять опрос данных с использованием протокола HTTP/HTTPS. Также возможен прием данных с помощью утилиты 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-элементов данных:

Параметр Описание
Тип Выберите здесь HTTP agent.
Ключ Укажите уникальный ключ элемента данных.
URL URL для подключения и получения данных. Например:
https://www.example.com
http://www.example.com/download
Доменные имена можно указывать с использованием символов Unicode. При выполнении HTTP-проверки они автоматически преобразуются в ASCII с использованием punycode.
Кнопка Разобрать позволяет отделить необязательные поля запроса (например, ?key=value&limit=10) от URL, переместив атрибуты и значения в Поля запроса для автоматического кодирования 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.
Тип тела запроса Выберите тип тела запроса:
Необработанные данные - пользовательское тело HTTP-запроса; макросы подставляются, но кодирование не выполняется.
Данные JSON - тело HTTP-запроса в формате JSON. Макросы можно использовать как строки, числа, true и false; макросы, используемые как строки, необходимо заключать в двойные кавычки. Значения макросов сначала подставляются, а затем автоматически экранируются. Если в заголовках не указан "Content-Type", по умолчанию используется "Content-Type: application/json".
Данные XML - тело 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; см. документацию; поддержка префикса протокола добавлена в 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 - используется дайджест-аутентификация.
Задается параметр cURL CURLOPT_HTTPAUTH.
Имя пользователя Укажите имя пользователя (до 255 символов).
Это поле доступно, если для HTTP-аутентификация выбрано значение Basic, NTLM, Kerberos или Digest. Поддерживаются пользовательские макросы и макросы обнаружения низкого уровня.
Пароль Укажите пароль пользователя (до 255 символов).
Это поле доступно, если для HTTP-аутентификация выбрано значение Basic, NTLM, Kerberos или Digest. Поддерживаются пользовательские макросы и макросы обнаружения низкого уровня.
Проверять SSL-узел Установите флажок, чтобы проверять SSL-сертификат веб-сервера. Сертификат сервера проверяется по сертификатам доверенных центров сертификации (CA) из общесистемного расположения CA. Расположение файлов CA можно переопределить с помощью параметра конфигурации сервера Zabbix или прокси SSLCALocation.
Задается параметр cURL CURLOPT_SSL_VERIFYPEER.
Проверять SSL-узел Установите флажок, чтобы проверять соответствие поля Common Name или Subject Alternate Name сертификата веб-сервера.
Задается параметр cURL CURLOPT_SSL_VERIFYHOST.
Файл SSL-сертификата Имя файла SSL-сертификата, используемого для аутентификации клиента. Файл сертификата должен быть в формате PEM1. Если файл сертификата также содержит закрытый ключ, оставьте поле Файл SSL-ключа пустым. Если ключ зашифрован, укажите пароль в поле Пароль SSL-ключа. Каталог, содержащий этот файл, задается параметром конфигурации сервера Zabbix или прокси 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. Каталог, содержащий этот файл, задается параметром конфигурации сервера Zabbix или прокси 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.
Дополнительную информацию о параметре Тайм-аут см. в разделе общие атрибуты элементов данных.
Включить прием данных Если этот флажок установлен, элемент данных также будет работать как элемент данных-траппер и принимать данные, отправленные на сервер Zabbix или прокси с помощью утилиты Zabbix sender или протокола Zabbix sender, либо принимать данные, отправленные на сервер Zabbix с помощью метода API history.push. Дополнительную информацию об отправке данных см. в разделе: Элементы данных-трапперы.
Разрешенные узлы сети Отображается только если установлен флажок Включить прием данных.
Список 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-совместимые IPv6-адреса» (префикс 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 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 и получение его метрик пакетно.

Пример вывода статуса 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]+):

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