Home » Zabbix » Парсинг и передача json данных в Zabbix

Парсинг и передача json данных в Zabbix

Продолжаю серию рассказов на тему настройки различных метрик в системе мониторинга заббикс. Сегодня расскажу, как быстро, легко и удобно передавать данные в json формате в zabbix и там их обрабатывать. Развитие функционала в последних версиях позволяют работать с json без лишних костылей и самописных скриптов.

Если у вас есть желание освоить Linux с нуля, не имея базовых знаний, рекомендую познакомиться с онлайн-курсом Administrator Linux.Basic в OTUS. Курс для новичков, для тех, кто хочет войти в профессию администратора Linux. Подробности по .

Передача json данных в zabbix

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:

  1. Установка CentOS 8.
  2. Настройка CentOS 8.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 10, если предпочитаете его:

  1. Установка Debian 10.
  2. Базовая настройка Debian.
  3. Установка и настройка zabbix на debian.

Для примера возьму мониторинг работы ноды Bitcoin. В данном случае это совершенно не принципиально, так как подход к парсингу json в zabbix одинаковый везде. Формат json сейчас очень популярен. Большое число сервисов его поддерживают для вывода информации или логов. У биткоин ноды есть команды для вывода информации о состоянии ноды. Вывод идет в формате json. Вот пример:

# bitcoin-cli getblockchaininfo
{
  "chain": "test",
  "blocks": 1447503,
  "headers": 1447503,
  "bestblockhash": "506a6952d47b939e9d7baa34fc290b4356c446",
  "difficulty": 12691409.16925421,
  "mediantime": 1544607906,
  "verificationprogress": 0.9999915635029165,
  "initialblockdownload": false,
  "chainwork": "00000000000000000000000000db56207f5987ad3",
  "size_on_disk": 23159068639,
  "pruned": false,
  "softforks": [
    {
      "id": "bip34",
      "version": 2,
      "reject": {
        "status": true
      }
    },
    {
      "id": "bip66",
      "version": 3,
      "reject": {
        "status": true
      }
    },
    {
      "id": "bip65",
      "version": 4,
      "reject": {
        "status": true
      }
    }
  ],
  "bip9_softforks": {
    "csv": {
      "status": "active",
      "startTime": 1456790400,
      "timeout": 1493596800,
      "since": 770112
    },
    "segwit": {
      "status": "active",
      "startTime": 1462060800,
      "timeout": 1493596800,
      "since": 834624
    }
  },
  "warnings": "Warning: unknown new rules activated (versionbit 28)"
}

В своем примере я покажу, как из этого вывода парсить значения blocks и headers, хранить их в отдельных итемах в zabbix, чтобы дальше использовать в триггерах. По аналогии можно будет работать с другими значениями.

Настройка парсинга json в zabbix будет состоять из следующих шагов:

  1. Передаем всю json строку в исходном виде в итем в заббиксе.
  2. С помощью зависимых элементов данных формируем отдельные итемы с нужными значениями.
  3. Используем полученные итемы по назначению.

Для начала делаем простой скрипт для получения json - /etc/zabbix/scripts/getblockchaininfo.sh

#!/bin/bash
/usr/bin/bitcoin-cli -rpcuser=user -rpcpassword=password -rpcport=8332 getblockchaininfo

Проверьте, что скрипт выдает корректную строку json. Далее создаем UserParameter. Я предпочитаю их хранить в разных конфигах, разделяя по функционалу. Создаю файл /etc/zabbix/zabbix_agentd.d/btc.conf следующего содержания:

UserParameter=blockchaininfo,/etc/zabbix/scripts/getblockchaininfo.sh

Сохраняем и перезапускаем zabbix-agent. Проверяем, что json корректно передается в нужном виде, без ошибок и прочих проблем:

# zabbix_agentd -t blockchaininfo

На выходе должны увидеть тот же самый json.

Пример json данных

Zabbix агент подготовили. Для продолжения настройки, переходим на сервер.

Настройка zabbix server для мониторинга по json

На сервере создаем шаблон и добавляем в него элемент данных.

Итем для передачи json в zabbix

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

Парсинг json строки в зависимый элемент данных

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

Дальше переходим на вкладку Preprocessing (предобработка):

Параметры обработки json

В моем случае путь json очень простой. Если у вас более сложные выражения, то используйте удобный json парсер. Можете добавить туда свой json вывод и указать путь для парсинга, проверив таким образом его правильность.

JSON парсер

Я убедился, что все верно. Сохраняем этот итем и ждем, когда он будет обработан. В latest data увидите значения из json строки.

Проверка мониторинга данных через парсинг json

По аналогии добавляете остальные элементы. Таким образом вы можете распарсить полностью json в отдельные итемы и использовать их дальше в триггерах и на графиках.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Я показал простейший пример работы с json для тех, кто никогда не использовал его в zabbix. Благодаря тому, что в какой-то не очень давней версии появились зависимые элементы, работа с мониторингом сильно упростилась. Первое, что мне пришло в голову, когда нужно было выбрать отдельные значения из json вывода - написать баш скрипт. Это не сложно, я бы быстро распарсил и вытащил те данные, что мне нужны. Но вспомнив про зависимые элементы и возможность обработки данных в самом заббиксе, решил посмотреть в эту сторону и не ошибся. Так действительно проще и удобнее. За нас уже все сделали разработчики.

Скорее всего вам понадобится не просто парсинг json файла, но и автообнаружение на основе данных из него и автоматическое создание итемов. Но это уже тема отдельной статьи. А на сегодняшний момент это все, что я хотел рассказать, пока выдалась возможность поделиться информацией.

Онлайн курсы по Mikrotik

Если у вас есть желание научиться работать с роутерами микротик и стать специалистом в этой области, рекомендую пройти курсы по программе, основанной на информации из официального курса MikroTik Certified Network Associate. Помимо официальной программы, в курсах будут лабораторные работы, в которых вы на практике сможете проверить и закрепить полученные знания. Все подробности на сайте . Стоимость обучения весьма демократична, хорошая возможность получить новые знания в актуальной на сегодняшний день предметной области. Особенности курсов:
  • Знания, ориентированные на практику;
  • Реальные ситуации и задачи;
  • Лучшее из международных программ.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Zerox
Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству.

27 комментариев

  1. Аватар

    [
    {
    "ID": 28574,
    "Username": "XXXXX",
    "Groupname": "XXXX",
    "State": "connected",
    "Device": "vpns1",
    "MTU": "1406",
    "Remote IP": "XXXXX",
    "Location": "Russian Federation",
    "Local Device IP": "XXXXXX",
    "IPv4": "XXXXX",
    "P-t-P IPv4": "XXXXX",
    "User-Agent": "Cisco AnyConnect VPN Agent for Android 4.8.03651 / samsung SM-A",
    "RX": "0",
    "TX": "496",
    "Restricted to routes": "False",
    "Restricted to ports": []
    }
    ]

    Пытался сделать по мануалу
    прилетает такое на сервер
    но вычленить не могу.. $.Username
    Если бы прилетало без квадратных скобок - то работало бы.. в чем затык?

  2. Аватар

    Подскажите пожалуйста, как можно http_agent заставить забирать данные у Java-приложения, с логином через j_security_check.
    У меня выходит что:
    шаги вебсценария я могу прописать для логина, и получить нужный мне стринг со странички, но больше кода или стринга - я не получаю.

    А в случае с айтемом типа http_agent и препроцессингом - все могу, но не могу себя авторизовать, и соответственно забрать и обработать json.

    • Zerox

      Я не разбирался с авторизацией в http агенте, так что не смогу подсказать. Обычно получается так или иначе ему напрямую отдать данные, без авторизации.

      • Аватар

        Я в результате плюнул и забираю все курл-скриптом

        • Zerox

          Тоже вариант, почему нет, если так быстрее и проще. Неудобно только разворачивать и хранить. Когда делаешь через http агент, все сохраняется в шаблоне и легко переносится. Но если надо сделать один раз, то я обычно делаю максимально быстро и просто.

  3. Аватар
    Александр

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

    • Zerox

      Вот тут есть пример автообнаружения - https://serveradmin.ru/monitoring-bekapov-s-pomoshhyu-zabbix/#i-4
      Скрипт backup-discovery.sh
      Ну и в целом пример построен с использованием автообнаружения.

      • Аватар
        Александр

        Спасибо посмотрел.Но интересует если json такой вид и как при этом создавать автообнаружения и ITEM
        { "data": [
        {
        "{#Name}": "System Idle Process",
        "{#WorkingSet}": 8192
        },
        {
        "{#Name}": "chrome.exe",
        "{#WorkingSet}": 3296219136
        }
        ]}

  4. Аватар

    Подскажите как решить момент с тем потоком данных что идут по основному ключу? они же бд засирают сильно

  5. Аватар
    Руслан

    Здравствуйте. Не могли бы вы показать как осуществить передачу json данных в Zabbix с помощью http агента?

    • Zerox

      Не пробовал еще работать с http агентом.

    • Аватар

      С HTTP агентом почти то же самое, что и Zabbix agent, только в JSONPath необходимо к ключам добавлять $.body. - так как мы парсим страницу (body) в RAW и потом конвертим в JSON (почему-то в чистом JSON у меня не получилось извлекать данные по HTTP)

  6. Аватар
    Евгений

    Не понял, в данном случае забикс и битчейнода должны стоять на одном сервере?

    • Zerox

      Нет. Данные можно забирать с любого сервера, где установлен агент заббикса, если сама служба позволяет удаленный запрос json данных. В данном случае у меня на серверах везде стоит агент, поэтому я собирал локально. Но если бы агента не было, я бы через удаленные запросы забирал json с какого-нибудь другого сервера.

Добавить комментарий

Ваш адрес email не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.