2. Пассивные и активные проверки агента

Обзор

Этот раздел подробно описывает пассивные и активные проверки, которые выполняются Zabbix агентом.

Для взаимодействия с агентами Zabbix использует коммуникационный протокол на основе JSON.

Протоколы Zabbix агента и Zabbix агента 2 были унифицированы, начиная с версии Zabbix 7.0. Отличие между запросами/ответами Zabbix агента и Zabbix агента 2 выражается значением тега «variant».

Пассивные проверки

Пассивная проверка — это простой запрос данных. Сервер или прокси Zabbix запрашивает некоторые данные (например, загрузку CPU), а агент Zabbix отправляет результат обратно на сервер.

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

Пуллер агента будет пытаться подключиться ко всем адресам, возвращенным DNS-lookup. Это гарантирует, что если один IP-адрес недоступен, пуллер попробует следующий доступный адрес, повышая вероятность успешного подключения. Это улучшение применяется как к серверу Zabbix, так и к прокси.

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

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

Запрос сервера

Для определения длины заголовка и данных см. protocol details.

{
  "request": "passive checks",
  "data": [
    {
      "key": "agent.version",
      "timeout": 3
    }
  ]
}
Field Type Mandatory Value
request string yes "passive checks"
data array of object yes Элемент данных пассивной проверки.
key string yes Ключ элемента данных с раскрытыми макросами.
timeout number yes Тайм-аут связи.

Ответ агента

{
  "version": "8.0.0",
  "variant": 2,
  "data": [
    {
      "value": "8.0.0"
    }
  ]
}
Field Type Mandatory Value
version string yes Номер версии агента.
variant number yes Вариант агента (1 - Zabbix agent, 2 - Zabbix agent 2).
data array of object yes Содержит результат проверки.
value string no Значение элемента данных, если проверка выполнена успешно.
error string no Сообщение об ошибке, если проверка выполнена неуспешно.

Например, для поддерживаемых элементов данных:

  1. Сервер открывает TCP-соединение
  2. Сервер отправляет <HEADER><DATALEN>{"request":"passive checks","data":[{"key":"agent.ping","timeout":3}]}
  3. Агент читает запрос и отвечает <HEADER><DATALEN>{"version":"8.0.0","variant":2,"data":[{"value":1}]}
  4. Сервер обрабатывает данные, чтобы получить значение, в нашем случае — '1'
  5. TCP-соединение закрывается

Для неподдерживаемых элементов данных:

  1. Сервер открывает TCP-соединение
  2. Сервер отправляет <HEADER><DATALEN>{"request":"passive checks","data":[{"key":"vfs.fs.size[/nono]","timeout":3}]}
  3. Агент читает запрос и отвечает <HEADER><DATALEN>{"version":"8.0.0","variant":2,"data":[{"error":"Unsupported item key."}]}
  4. Сервер обрабатывает данные, изменяет состояние элемента данных на неподдерживаемое с указанным сообщением об ошибке
  5. TCP-соединение закрывается
Переключение на старый протокол

Чтобы сервер Zabbix или прокси могли работать с агентами версий до 7.2, в которых используется открытый текстовый протокол, реализовано переключение на старый протокол.

Пассивные проверки выполняются с использованием протокола JSON (7.0 и новее) после перезапуска или при изменении конфигурации интерфейса. Если в ответ не получен корректный JSON (агент отправил "ZBX_NOTSUPPORTED"), Zabbix сохранит интерфейс в кэше как использующий старый протокол и повторит проверку, отправив только ключ элемента данных.

Обратите внимание, что каждый час сервер Zabbix/прокси будет снова пытаться работать по новому протоколу со всеми интерфейсами, при необходимости возвращаясь к старому протоколу.

Активные проверки

Активные проверки требуют более сложной обработки. Сначала агент должен получить от сервера/прокси список элементов данных и/или удаленных команд для независимой обработки.

Серверы/прокси, с которых выполняется получение активных проверок, перечислены в параметре 'ServerActive' файла конфигурации агента. Частота запроса этих проверок задается параметром 'RefreshActiveChecks' в том же файле конфигурации. Однако если обновление активных проверок завершается неудачей, повторная попытка выполняется через жестко заданные 60 секунд.

Начиная с версии Zabbix 6.4, агент (в активном режиме) больше не получает от сервера/прокси полную копию конфигурации раз в две минуты (по умолчанию). Вместо этого, чтобы уменьшить сетевой трафик и использование ресурсов, каждые 5 секунд (по умолчанию) выполняется инкрементная синхронизация конфигурации, после чего сервер/прокси-сервер предоставляет полную копию конфигурации только, если агент ещё не получил её либо что-то изменилось в конфигурации узла сети, глобальных макросах или глобальных регулярных выражениях.

Затем агент периодически отправляет новые значения на сервер(ы). Если агент получил какие-либо удалённые команды для выполнения, также будет отправлен результат выполнения. Обратите внимание, что удалённое выполнение команд на активном агенте поддерживается, начиная с версии Zabbix агента 7.0.

Если агент находится за брандмауэром, вы можете рассмотреть возможность использования исключительно Активных проверок, т.к. в этом случае вам не понадобится менять настройки брандмауэра для разрешения начальных входящих соединений.

Получение списка элементов данных

Запрос агента

Запрос active checks используется для получения активных проверок, которые должны обрабатываться агентом.
Этот запрос отправляется агентом при запуске, а затем с интервалами RefreshActiveChecks.

{
  "request": "active checks",
  "host": "Zabbix server",
  "host_metadata": "mysql,nginx",
  "interface": "zabbix.server.lan",
  "ip": "159.168.1.1",
  "port": 12050,
  "version": "8.0.0",
  "variant": 2,
  "config_revision": 1,
  "session": "e3dcbd9ace2c9694e1d7bbd030eeef6e"
}
Field Type Mandatory Value
request string yes active checks
host string yes Имя узла сети.
host_metadata string no Значение параметра конфигурации HostMetadata или метрики HostMetadataItem.
interface string no Значение параметра конфигурации HostInterface или метрики HostInterfaceItem.
ip string no Первый IP-адрес параметра конфигурации ListenIP, если он задан.
port number no Значение параметра конфигурации ListenPort, если он задан и не совпадает со стандартным портом прослушивания агента.
version string yes Номер версии агента.
variant number yes Вариант агента (1 - Zabbix agent, 2 - Zabbix agent 2).
config_revision number no Идентификатор конфигурации для инкрементальной синхронизации конфигурации.
session string no Идентификатор сеанса для инкрементальной синхронизации конфигурации.

Ответ сервера

Ответ active checks отправляется сервером агенту после обработки запроса active checks.

{
  "response": "success",
  "config_revision": 2,
  "data": [
    {
      "key": "system.uptime",
      "itemid": 1234,
      "delay": "10s",
      "lastlogsize": 0,
      "mtime": 0
    },
    {
      "key": "agent.version",
      "itemid": 5678,
      "delay": "10m",
      "lastlogsize": 0,
      "mtime": 0,
      "timeout": "30s"
    }
  ],
  "commands": [
    {
      "command": "df -h --output=source,size / | awk 'NR>1 {print $2}'",
      "id": 1324,
      "wait": 1
    }
  ]
}
Field Type Mandatory Value
response string yes success | failed
info string no Информация об ошибке в случае сбоя.
data array of objects no Элементы данных активных проверок. Не указывается, если конфигурация узла сети не изменилась.
key string no Ключ элемента данных с раскрытыми макросами.
itemid number no Идентификатор элемента данных.
delay string no Интервал обновления элемента данных.
Гибкие интервалы/интервалы по расписанию поддерживаются как Zabbix agent, так и Zabbix agent 2 начиная с Zabbix 7.0.
lastlogsize number no lastlogsize элемента данных.
mtime number no mtime элемента данных.
timeout string no Тайм-аут элемента данных.
refresh_unsupported number no Интервал обновления неподдерживаемого элемента данных.
regexp array of objects no Глобальные регулярные выражения.
name string no Имя глобального регулярного выражения.
expression string no Глобальное регулярное выражение.
expression_type number no Тип глобального регулярного выражения.
exp_delimiter string no Разделитель глобального регулярного выражения.
case_sensitive number no Настройка чувствительности глобального регулярного выражения к регистру.
commands array of objects no Удаленные команды для выполнения. Включаются, если выполнение удаленной команды было инициировано действием operation или ручным выполнением script. Обратите внимание, что выполнение удаленных команд на активном агенте поддерживается начиная с Zabbix agent 7.0. Более старые активные агенты будут игнорировать любые удаленные команды, включенные в ответ сервера active checks.
command string no Удаленная команда.
id number no Идентификатор удаленной команды.
wait number no Режим выполнения удаленной команды ("0" (nowait) для команд из действий operations; "1" (wait) для команд из ручного выполнения script).
timeout number no Тайм-аут выполнения удаленной команды в конфигурации сервер/прокси.
config_revision number no Идентификатор конфигурации для инкрементальной синхронизации конфигурации. Не указывается, если конфигурация узла сети не изменилась. Увеличивается, если конфигурация узла сети изменена.

Сервер должен ответить success.

Например:

  1. Агент открывает TCP-соединение
  2. Агент запрашивает список проверок
  3. Сервер отвечает списком элементов данных и удаленных команд для выполнения
  4. Агент разбирает ответ
  5. TCP-соединение закрывается
  6. Агент начинает периодический сбор данных и выполняет удаленные команды (поддерживается начиная с Zabbix agent 7.0)

Обратите внимание, что (чувствительные) данные конфигурации могут стать доступны сторонам, имеющим доступ к порту trapper сервера Zabbix, при использовании активной проверки. Это возможно, поскольку любой может выдать себя за активный агент и запросить данные конфигурации элемента данных; аутентификация не выполняется, если не используются параметры шифрования.

Отправка собранных данных

Агент отправляет

Запрос данных агента содержит собранные значения элементов данных и значения для выполненных удалённых команд (если есть).

{
  "request": "agent data",
  "data": [
    {
      "id": 1,
      "itemid": 5678,
      "value": "7.0.0",
      "clock": 1712830783,
      "ns": 76808644
    },
    {
      "id": 2,
      "itemid": 1234,
      "value": "69672",
      "clock": 1712830783,
      "ns": 77053975
    }
  ],
  "commands": [
    {
      "id": 1324,
      "value": "16G"
    }
  ],
  "session": "8495cd52070e6ca52b371f29c8574165",
  "host": "Zabbix server",
  "version": "8.0.0",
  "variant": 2
}
Field Type Mandatory Value
request string yes agent data
data array of objects yes Значения элементов данных.
id number yes Идентификатор значения (инкрементный счётчик, используемый для проверки дублирующихся значений в случае проблем с сетью).
itemid number yes Идентификатор элемента данных.
value string no Значение элемента данных.
lastlogsize number no lastlogsize элемента данных.
mtime number no mtime элемента данных.
state number no Состояние элемента данных.
source string no Источник журнала событий значения.
eventid number no eventid журнала событий значения.
severity number no severity журнала событий значения.
timestamp number no timestamp журнала событий значения.
clock number yes Метка времени значения (секунды с начала эпохи).
ns number yes Наносекунды метки времени значения.
commands array of objects no Результат выполнения удалённых команд. Обратите внимание, что выполнение удалённых команд на активном агенте поддерживается начиная с Zabbix agent 7.0. Более старые активные агенты будут игнорировать любые удалённые команды, включённые в ответ сервера на активные проверки.
id number no Идентификатор удалённой команды.
value string no Результат выполнения удалённой команды, если выполнение прошло успешно.
error string no Сообщение об ошибке выполнения удалённой команды, если выполнение завершилось неудачей.
session string yes Уникальный идентификатор сессии, генерируемый при каждом запуске агента.
host string yes Имя узла сети.
version string yes Номер версии агента.
variant number yes Вариант агента (1 - Zabbix agent, 2 - Zabbix agent 2).

Каждому значению назначается виртуальный ID. ID значения — это простой возрастающий счётчик, уникальный в пределах одной сессии данных (идентифицируемой токеном сессии). Этот ID используется для отбрасывания дублирующихся значений, которые могут быть отправлены в условиях нестабильного соединения.

Ответ сервера

Ответ с данными агента отправляется сервером обратно агенту после обработки запроса данных агента.

{
  "response": "success",
  "info": "processed: 2; failed: 0; total: 2; seconds spent: 0.003534"
}
Field Type Mandatory Value
response string yes success | failed
info string yes Результаты обработки элементов данных.

Если отправка некоторых значений завершается ошибкой на стороне сервера (например, если узел сети или элемент данных были отключены или удалены), агент не будет повторно пытаться отправить эти значения.

Например:

  1. Агент открывает TCP-соединение
  2. Агент отправляет список значений
  3. Сервер обрабатывает данные и отправляет обратно статус
  4. TCP-соединение закрывается

Сообщение об ошибке будет обрезано до 2048 символов на стороне сервера.

Сообщение heartbeat

Агент отправляет

Сообщение heartbeat отправляется активным агентом на сервер Zabbix/прокси каждые HeartbeatFrequency секунд (настраивается в файле конфигурации Zabbix agent/ agent 2).

Оно используется для мониторинга доступности активных проверок.

{
  "request": "active check heartbeat",
  "host": "Zabbix server",
  "heartbeat_freq": 60,
  "version": "8.0.0",
  "variant": 2
}
Поле Тип Обязательное Значение
request string yes active check heartbeat
host string yes Имя узла сети.
heartbeat_freq number yes Частота heartbeat агента (параметр конфигурации HeartbeatFrequency).
version string yes Номер версии агента.
variant number yes Вариант агента (1 - Zabbix agent, 2 - Zabbix agent 2).

Ответ перенаправления

Когда узел сети был переназначен, сервер может указать агенту перенаправить его heartbeat (и последующие активные проверки) на другой экземпляр прокси или сервера.

  {
    "response": "failed",
    "redirect": {
      "revision": 2,
      "address": "192.0.2.1:10055"
    }
  }
Поле Тип Обязательное Значение
response string yes success | failed
redirect object yes Инструкции по перенаправлению.
revision number yes Идентификатор ревизии конфигурации.
address string yes Адрес целевого сервера/прокси.

Более старый XML протокол

Zabbix воспринимает до 16 МВ XML данных, закодированных в Base64, но одиночное декодированное значение не должно быть длиннее 64 КБ, в противном случае значение будет обрезано до 64 КБ в процессе декодирования.