9. HTTP агент

Обзор

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

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

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

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

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

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

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

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

Функция постоянных соединений (persistent connections) cURL была добавлена в проверки HTTP-агента, начиная с версии 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}, {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"
Обратите внимание, что для выбора Данные XML требуется libxml2.
Тело запроса Введите тело запроса.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, пользовательские макросы, макросы обнаружения низкого уровня.
Заголовки Пользовательские HTTP-заголовки, отправляемые при выполнении запроса.
Указываются в виде пар атрибут-значение.
Поддерживаемые макросы: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {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}, {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}, {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}, {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-совместимые 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, чтобы получать загрузку процессора (среднее значение за 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 в Последние данные: