api jsonrpc php zabbix
Api jsonrpc php zabbix
The 3.x versions of this package are compatible and tested with Zabbix™ from version 3.0.0 up to 3.4.15. If you are migrating this package from 2.x to 3.0, please follow the upgrade notes.
PhpZabbixApi is an open-source PHP SDK to communicate with the Zabbix JSON-RPC API.
Because this package is generated directly from the origin Zabbix PHP front-end source code, each real Zabbix JSON-RPC API method is implemented directly as a PHP method. This means PhpZabbixApi is IDE-friendly, because you’ve a declared PHP method for each API method, and there are no PHP magic functions or alike.
PhpZabbixApi is licensed under the MIT license.
Make sure the version of the package you are trying to install is compatible with your Zabbix API version. If you aren’t sure about your Zabbix API version, send a request to the apiinfo.version method:
Replace with your Zabbix API endpoint (for example, «https://your-zabbix-domain/api_jsonrpc.php»). Then, you will be able to install the PhpZabbixApi version that is better for you:
All tagged versions can be installed, for example:
If you’re looking for more bleeding-edge versions (e.g. for testing), then you could also use development branches by setting a specific stability flag in the version constraint:
To translate a Zabbix API call into an SDK method call, you can simply do the following:
| Zabbix API | PHP SDK |
|---|---|
| graph.get | graphGet() |
| host.massUpdate | hostMassUpdate() |
| dcheck.isWritable | dcheckIsWritable() |
The API can also work with HTTP Basic Authroization, you just have to call the constructor with additional parameters:
If you already have an authentication token, you can pass that value as argument 6 in order to avoid the library to perform the request for the user.login method for requests that require an authenticated user. If the token is valid, you can omit the argument 2 and 3, since they will be not required:
Internally, this package uses the Guzzle HTTP client to perform the requests against the Zabbix API. In order to give you more control and flexibility about the client configuration, you can pass your own implementation of \GuzzleHttp\ClientInterface as argument 7 for ZabbixApi :
Additionally, if you prefer to provide options for the built-in client instead of provide your own client, you can pass an options array as argument 8:
Please, note that argument 7 and 8 cannot be used together. You must choose between one of both.
Authentication token caching
In order to improve the response times avoiding the call for the user.login method in each request, you can configure a PSR-6 caching backend for the authentication token. This way the SDK will get the cached token after the first login and until its expiration. The following example uses a fictional Psr6FilesystemAdapter class, but you can choose any available implementation:
Here’s a simple request to fetch all defined graphs via graph.get API method:
By default, the values will be returned using an associative array, but you can always choose to get instances of \stdClass instead, using false as argument 3 in the method call:
Request with parameters
Most of the time you want to define some specific parameters. Here’s an example to fetch all CPU graphs via graph.get API method:
Define default parameters
Sometimes you want to define default parameters, which will be included in each API request. You can do that by defining the parameters in an array via setDefaultParams() :
Get associative / un-indexed array
By default all API responses will be returned in an indexed array.
So if you then looking for a specific named graph, you’ve to loop through the indexed array and compare the name attribute of each element. This can be a bit of a pain, and because of that, there’s a simple way to get an associative array instead of an indexed one. You just have to pass the argument 2 for the method, which is the name of attribute you’d like to use as a key in the resulting array.
Here’s an example to fetch all graphs in an associative array, with the graph’s name as array key:
Парсинг и передача json данных в Zabbix
Продолжаю серию рассказов на тему настройки различных метрик в системе мониторинга заббикс. Сегодня расскажу, как быстро, легко и удобно передавать данные в json формате в zabbix и там их обрабатывать. Развитие функционала в последних версиях позволяют работать с json без лишних костылей и самописных скриптов.
Передача json данных в zabbix
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
То же самое на Debian 10, если предпочитаете его:
Для примера возьму мониторинг работы ноды Bitcoin. В данном случае это совершенно не принципиально, так как подход к парсингу json в zabbix одинаковый везде. Формат json сейчас очень популярен. Большое число сервисов его поддерживают для вывода информации или логов. У биткоин ноды есть команды для вывода информации о состоянии ноды. Вывод идет в формате json. Вот пример:
В своем примере я покажу, как из этого вывода парсить значения blocks и headers, хранить их в отдельных итемах в zabbix, чтобы дальше использовать в триггерах. По аналогии можно будет работать с другими значениями.
Настройка парсинга json в zabbix будет состоять из следующих шагов:
Проверьте, что скрипт выдает корректную строку json. Далее создаем UserParameter. Я предпочитаю их хранить в разных конфигах, разделяя по функционалу. Создаю файл /etc/zabbix/zabbix_agentd.d/btc.conf следующего содержания:
Сохраняем и перезапускаем zabbix-agent. Проверяем, что json корректно передается в нужном виде, без ошибок и прочих проблем:
На выходе должны увидеть тот же самый json.
Zabbix агент подготовили. Для продолжения настройки, переходим на сервер.
Настройка zabbix server для мониторинга по json
На сервере создаем шаблон и добавляем в него элемент данных.
Подключите этот шаблон к хосту, где настраивали zabbix агент и подождите поступления данных. После того, как убедитесь, что json строка поступает на сервер, возвращайтесь в шаблон и создавайте еще один зависимый элемент данных.
В моем случае значение, которое я буду парсить из json, числовое, поэтому я выбираю соответствующий тип. У вас он может быть другой.
Дальше переходим на вкладку Preprocessing (предобработка):
В моем случае путь json очень простой. Если у вас более сложные выражения, то используйте удобный json парсер. Можете добавить туда свой json вывод и указать путь для парсинга, проверив таким образом его правильность.
Я убедился, что все верно. Сохраняем этот итем и ждем, когда он будет обработан. В latest data увидите значения из json строки.
По аналогии добавляете остальные элементы. Таким образом вы можете распарсить полностью json в отдельные итемы и использовать их дальше в триггерах и на графиках.
Заключение
Скорее всего вам понадобится не просто парсинг json файла, но и автообнаружение на основе данных из него и автоматическое создание итемов. Но это уже тема отдельной статьи. А на сегодняшний момент это все, что я хотел рассказать, пока выдалась возможность поделиться информацией.
Обнаружение + Zabbix API под Java
По мере развития проекта разрастается и инфраструктура, обслуживающая этот проект. Со временем появляется множество элементов сети, параметры которых важно отслеживать в онлайн-режиме. Для решения этой задачи элементы сети необходимо добавить в систему мониторинга.
Добавить новый узел в Zabbix можно несколькими способами:
Так выглядит обнаруженный и созданный узел. Мы видим, что имена новым узлам проставляются в соответствии с IP узла, как и способ подключения – по умолчанию по IP. Обнаружение позволяет избавиться от рутиной и долгой работы по добавлению новых узлов, однако наименования узлов не несут никакой смысловой нагрузки. Также способ по подключению через IP неудобен тем, что при смене IP серверов вам придётся снова на всех узлах менять IP. Способ подключения по DNS решит проблему с изменяющимися IP. Что же с этим можно сделать? Можно написать скрипт обновления данных напрямую в базе Zabbix, что не очень правильно.
А что если переименовать название узлов и изменить параметры подключения через API? Для работы с Zabbix API написаны библиотеки под разные языки, которые можно посмотреть здесь. Я выбрал библиотеку под Java, создал проект в IDEA, подключил библиотеку и начал изучать документацию с официального сайта для Zabbix v.2.0.8.
Из каких объектов состоит узел?
Как показано на рисунке, интересующие нас поля принадлежат двум объектам: Host и Host interface. Для решения задачи нужно:
Первое, что необходимо сделать – это организовать подключение к серверу Zabbix.
Затем авторизоваться на сервере Zabbix под пользователем.
Теперь нужно найти идентификатор узла, переименовать и перенастроить подключение агента. В документации для метода поиска узла приведен пример запроса. Разберем, что он значит.
Результатом этого примера станет получение объектов Host с техническими названиями «Zabbix server» и «Linux server» и полными наборами свойств этих узлов.
Используя этот пример, формируем запрос. В скаченной библиотеке есть конструктор запросов, которому нужно передать название метода и параметры запроса. В примере выше видим, что методу нужно передать параметр «host» c текущем названием узла в качестве значения параметра «filter».
Чтобы вызвать сформированный метод и получить ответ вызываем метод call().
Полученный ответ будет выглядеть так:
Чтобы вывести полученный ответ на экран, достаточно передать полученный ответ в метод println();
Получаем идентификатор узла из полученного ответа:
Идентификатор узла найден. Используя его, можем переименовать узел. Для этого нужно вызвать метод «host.update» с параметрами » hostid «,» host»,» name».
Половина задачи выполнено. Осталось найти объект Host interface и изменить его свойства. Для поиска объекта Host interface используем найденный идентификатор узла.
Найденному объекту изменяем свойства «dns», «useip».
Задача выполнена для одного узла, но их намного больше. Для решения этой задачи я написал небольшую утилиту, которая читает текстовый файл вида:
Получает IP и меняет свойства узла по описанному выше алгоритму. Ниже приведен листинг.
Из листинга я убрал большинство обработчиков ошибок и условий, чтобы показать реализацию задачи. Описанный метод может помочь решить уже существующую проблему с наименованием обнаруженных узлов.
Кто-то может сказать, что было бы проще, используя API, сразу создавать узлы со всеми нужными параметрами. И я соглашусь. Немного модифицировав приведенный листинг, можно переписать код не на изменение свойств, а на создание узлов с нужными параметрами без использования «обнаружения» Zabbix. Так я и сделаю в будущем.
Использование Zabbix API. Когда не хватает стандартной статистики
Возникла задача получить некоторую статистику из Zabbix, делюсь опытом получения данных из базы Zabbix через API средствами Python.
Куски кода будут для Python 2.7
Для работы с zabbix-api есть готовая библиотека py-zabbix, документация по ней доступна тут, но примеров там не много. Официальное руководство по Zabbix API.
Итак, после стандартной установки:
Пробуем подключиться к серверу Zabbix:
Формат ответа от сервера — JSON:
Скрипт печатает содержимое поля result:
Теперь можно приниматься за решение интересующей задачи. Задача — получить среднее значение Disk Idle Time со всех виртуальных машин за неделю (Пн-Пт) в рабочее время (с 10:00 до 19:00) за определенную неделю. Я не хочу заострять внимание на актуальности этих параметров, а просто поделиться опытом работы с Zabbix API на примере этой конкретной задачи.
Итак, виртуальные машины в Zabbix лежат в отдельной группе, для начала получим список доступных групп с помощью метода hostgroup.get:
Параметром output можно определить, какие поля вернет API:
Затем можно получить список хостов в конкретной группе с помощью метода host.get:
Параметр groupids определяет идентификатор группы:
Для получения списка items по определенному хосту используется метод item.get:
Как видно из ответа, выбранный хост имеет 2 диска, нужно вывести минимальное значение из нескольких. Для доступа к данным по items используется метод history.get. Следующий код не претендует на оптимальность, я только начал осваивать Python, но в целом с поставленной задачей скрипт справился.
Для метода history.get нужно определить следующие параметры:
В результате получаем разделенные запятой имя хоста, кол-во винтов и min idle time:
Zabbix Documentation 1.8
Sidebar
Table of Contents
Начало работы с Zabbix API
Что такое Zabbix API
Пример сессии
Для быстрого обзора, взгляните на пример сессии Zabbix API или читайте ниже для более подробного объяснения.
Использование JSON RPC
Если вы не знакомы с JSON RPC, не бойтесь, все сложности отмечены ниже. Весь рабочий процесс заключается в нескольких шагах:
В большинстве случаев вы будете делать это из скриптов, с помощью инструментов скриптового язык, но, конечно, вы можете отправлять запросы «вручную», используя любой из желаемых инструментов JSON-RPC.
В самом деле, правильно! Все, что вам нужно знать сейчас, это способ аутентификации для этого, и то, какой формат JSON является ожидаемым для Zabbix.
Базовый формат запроса
Аутентификация
Что произошло? Конечно, не случайный человек может отправить запрос Zabbix на получение информации или для изменения чего-нибудь. Вот зачем вам нужно проходить аутентификацию для того, чтобы что-нибудь сделать.
Хорошее время отметить несколько моментов:
В случае любой ошибки, в результате вы получите параметр “error”:
В случае успеха, вы получите параметрo “result” вместо “error” (как вы увидите далее).
И так, как получить аутентификацию? Вам потребуется отправить запрос, вызвав метод “user.login” и указав параметрами “user” и “password”.
“Admin/zabbix” является учетной записью в Zabbix по умолчанию, но вы уже вероятно изменили пароль Админа. Не так ли?
Таким образом, мы получим ответ:
Теперь, когда ваш пользователь является членом группы пользователей с включенным “Доступ к API ”, попробуем отправить такой же запрос снова:
Примеры использования и общие параметры
Теперь, когда вы авторизовались можно пойти дальше и сделать что-нибудь. Прежде всего, давайте попробуем получить какую-нибудь информацию.
Получение списка групп узлов сети
Вот простой запрос на получение всех доступных групп узлов сети с сортировкой по имени Обратите внимание, что “method” содержит “hostgroup.get”, фактическую процедуру которую мы выполняем, и “params” содержащий дополнительные опции.
“sortfield”, как вы можете догадаться, позволяет сортировать результат, который вы получаете по выбранному полю.
“output”:“extend” означает, что вы хотите получить всю доступную информацию о каждой группе. Это, в некотором роде похоже на “SELECT *” в SQL. Возможными вариантами “output” могут быть:
И не забывайте о хэше “auth”, который вы получили используя “user.login”.
Ответ на данный запрос может выглядеть следующим образом::
Это стандартные группы, созданные при первичной настройке Zabbix. Обратите внимание на поле “groupid”, поля “XXXXid” уникальные идентификаторы системы, которые будут использоваться для адресации на объект в других запросах. Смотрите следующий раздел для объяснений.
Создание узла сети
Мы получили группы узлов сети, теперь попробуем что-нибудь создать. Попробуем создать узел сети, который будет находиться в группе узлов сети “Linux servers” и “Zabbix servers”. Запрос будет выглядеть следующим образом:
Обратите внимание, мы используем поля “groupid” полученные ранее, для связки с группами в которые мы хотим, чтобы входил наш узел сети. Мы, говорим, что хотим чтобы узел сети был в группах с id 2 (Linux servers) и 4 (Zabbix servers). Таким способом, вы будете работать со всеми сопутствующими объектами.
Если все пойдет верно, вы получите ответ:
Обновление элемента данных
Конечно, если вы можете создавать что-либо, вы должны иметь возможность обновлять или удалять. И для вас, чтобы попробовать и обновить элемент данных, я создал элемент данных с описанием “agent.ping” в созданном ранее “Моем новом придуманном узле сети, который я создал с помощью API ”, так что можно поиграть с ним. Во-первых, давайте посмотрим на это:
Обратите внимание, мы использовали параметр “filter”, для указания описания элемента данных и “hostids”, чтобы сказать что мы заинтересованы в элементе данных у узла сети, который мы создали (это было и его ID был 10051, помните?)
Ничего себе, много ж информации здесь. Теперь попробуем и обновить элемент данных, изменим “snmp_port” на 162 и “item type” на SNMPV1. Метод item.update будет верным инструментом для этого.
Обратите внимание, мы указали три параметра: “itemid”, таким образом Zabbix будет знать какой элемент данных обновлять (не забывайте это!) и два параметра, которые мы хотим изменить. Кстати, откуда я знаю, что “type”:1 означает SNMPV1? Это все есть в общем разделе элемента данных.
Обычно, Zabbix возвращает ID претерпевшего изменение элемента.











