Ad Widget

Collapse

обработка json данных

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • d00m178
    Junior Member
    • Jun 2016
    • 12

    #1

    обработка json данных

    доброго времени суток.

    необходимо обрабатывать метрики, передаваемые из хоста по http протоколу в формате JSON.

    например есть URL:



    по этому URL можно получить список метрик сервиса service1:

    Code:
    {
    mem: 172948,
    mem.free: 27311,
    heap: 253440,
    jvm.memory.heap.used: 45630488,
    uptime: 68205963,
    }
    каким образом можно загрузить эти данные в zabbix, чтобы можно было построить графики повыбранному параметру и создать триггеры?

    например построить график по параметру mem - чтобы было видно как со временем он изменяется.
    и создать триггер на него же - например если mem больше 300000 - выдать алерт на дашборде zabbix.

    я уже полдня занимаюсь поиском в гугле, и пока вроде нашел два варианта - создать скрипт, который будет парсить этот JSON и будет передавать в zabbix уже нужные пары - key:value
    но не могу понять КАК скрипт будет передавать эти значения..
    и еще говорят про LLD - вроде с помощью discovery можно еще как то это сделать, но тут я совсем не понимаю - надо же как-то сделать запрос моего URL чтобы получить данные сначала..

    Было бы неплохо прочитать что-то вроде пошагового руководства как это делается.
    Спасибо.
  • aib
    Senior Member
    • Jan 2014
    • 1615

    #2
    Могу посоветовать посмотреть на скрипты типа Zabbix Weather
    Zabbix has proven itself successful as an IT monitoring solution when there is a need to oversee the health of hundreds and thousands of servers. However, there is no reason to think that such a powerful system can only do just that – monitor computers. In the first such post today, we will try to […]

    Он делает практически то, что вам нужно:
    - Каждый час по cron запускает скрипт, который
    • - запрашивает указанный веб-сайт
    • - разбирает полученный XML
    • - отсылает данные на Zabbix Server, используя утилиту zabbix_sender.

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

    На основе этой статьи вполне возможно чуть подправит шаблон для ваших нужд и подкорректировать скрипт, чтобы разбирался с JSON вместо XML.

    А вообще, тут на форуме обсуждалась тема мониторинга JAVA машин. Возможно, уже есть готовые решения - а вы просто не обратили на них внимания?
    Sincerely yours,
    Aleksey

    Comment

    • d00m178
      Junior Member
      • Jun 2016
      • 12

      #3
      спасибо, посмотрел этот пример.
      в принципе похожие штуки и сам находил - все равно чето не пойму как в моем случае парсить этот json и чем..
      готовых скриптов не нахожу..
      но все же интересно разобраться в вариантом с lld - там похоже никакие скрипыт не нужны.

      Comment

      • aib
        Senior Member
        • Jan 2014
        • 1615

        #4
        Ну парсить json можно на любом языке программирования
        Уже есть способы для
        - perl (https://stackoverflow.com/questions/...ing-using-perl)
        - PHP (https://stackoverflow.com/questions/...-file-with-php)
        - C# (https://stackoverflow.com/questions/...se-json-with-c)

        Всё зависит от того, какой язык вы любите и умеете использовать.

        А вот с авто-дискавери не всё так прозрачно и однозначно. Я не уверен, что у вас получиться быстрее и легче разобраться с этим методом, чем с самописными скриптами.
        Sincerely yours,
        Aleksey

        Comment

        • d00m178
          Junior Member
          • Jun 2016
          • 12

          #5
          ok, значит я правильно понял:
          все таки есть ДВА подхода к решению моей задачи - один с помощью скрипта и zabbix_sender и второй - с помощью LLD.

          так?

          технически мне и то и то с нуля надо разбирать, но вот чувствую, что второй вариант будет "красивее" - без лишних скриптов, etc..
          только вот не понимаю как в этом случае в discovery правиле указывать что данные надо брать из http URL..

          Comment

          • aib
            Senior Member
            • Jan 2014
            • 1615

            #6
            Точнее, два ЭТАПА мониторинга нового устройства.
            Первый этап - начальное создание хоста/устройства.
            Может быть выполнен:
            - вручную, путем создания описания хоста и всех элементов
            - полуавтоматически, используя ручное создание хоста и LLD для создания элементов

            Второй этап - текущий мониторинг устройства.
            Может быть выполнен в вашей ситуации через создание скриптов:
            - вариант 1: один скрипт, вызывающий URL один раз, разбивающий всю информацию на пары имя:значение, и отсылающий данные на сервер
            - вариант 2: один скрипт, вызываемый с параметрами через UserAgent, вызывающий URL (curl), выбирающий нужную строку в соответствии с параметрами (grep), вытаскивая числовое значение параметра (awk)

            Так что все равно без скриптов не обойтись

            PS И всё равно не могу понять, почему вы не воспользуетесь хотя бы встроенными средствами Zabbix для мониторинга JAVA
            https://www.zabbix.com/documentation...x_monitoring?s[]=java
            Религиозные ограничения?
            Желание изобрести свой велосипед, с блэк-джеком и путанами?
            Что-то еще?
            Sincerely yours,
            Aleksey

            Comment

            • d00m178
              Junior Member
              • Jun 2016
              • 12

              #7
              странно что это сообщение вчера не отправилось..
              повторяю:

              хм... значит LLD нужен только на этапе СОЗДАНИЯ хоста/items?

              вот тут например:

              хттп obrivki. blogspot. ru/2015/12/zabbix-exchange-2010-low-level-discovery.html

              написано так:

              1. Мы по шедулеру на сервере Exchange выгружаем JSON с именами баз и пары "имя базы"-"статус"

              2. Мы создали Discovery rule, которое читает JSON через ключ на агенте.
              то есть понятно, что надо реализовать какойто способ доставки JSON на сервер - выше это сделано с помощью zabbix агента.
              но второй пункт говорит, что discovery rule както ЧИТАЕТ этот JSON!

              и вот применительно к моему примеру - мне непонятно как это сделать.

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

              UserParameter= app_metrics, jsondata.txt

              и сам файл jsondata.txt генерировать по расписанию.

              но как потом коректно скормить его в discovery rule - пока не понимаю.


              что касается JMX - я использую это активно для других хостов и сервисо, но в этом случае не получится.. есть разные причины, по которым необходимо, и похоже, будет проще реализовать загрузку JSON.. одна из проблем - zabbix и java gateway в DMZ, а хосты в локалке.. не представляю как передавать данные с jmx портов на gateway.. плюс еще не совсем ясно этот jmx правильно включить на всех java apps... а метрики уже есть.. и там не только java данные, а еще и другие, специфические для app..
              так что хочется все таки сделать как надо..

              Comment

              • aib
                Senior Member
                • Jan 2014
                • 1615

                #8
                Originally posted by d00m178
                странно что это сообщение вчера не отправилось..
                повторяю:

                хм... значит LLD нужен только на этапе СОЗДАНИЯ хоста/items?
                открываем документацию и читаем:

                Code:
                Низкоуровневое обнаружение (LLD) даёт возможность автоматического создания 
                элементов данных, триггеров и графиков для различных объектов на компьютере. 
                Например, Zabbix может автоматически начать мониторить файловые системы или 
                сетевые интерфейсы с вашего устройства, без необходимости создания вручную 
                элементов данных для каждой файловой системы или сетевого интерфейса.
                UserParameter= app_metrics, jsondata.txt
                и сам файл jsondata.txt генерировать по расписанию.

                но как потом коректно скормить его в discovery rule - пока не понимаю.
                Погодите-ка. У вас что, количество элементов в jsondata.txt плавающее и меняется время от времени?
                Если нет - то достаточно однажды создать этот набор элементов (Item's) и передавать только значения этих элементов.
                В этой ситуации по расписанию надо выполнять набор действий/скриптов для выборки значений и отсылки на сервер.

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

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

                А вот передачу значений можно сделать опять-таки двумя путями, как я уже объяснял.
                1) Единый скрипт, выполняющийся по расписанию на сервере с jmx и отправляющий значения на Zabbix Server
                2) Скрипт в UserAgent в конфигурации Zabbix Agent на сервере с jmx, выдергивающий только одно значение и возвращающий его на сервер. Zabbix сам будет опрашивать этот агент по заданным параметрам и с заданой цикличностью
                например:
                Code:
                UserParameter=jmx_data[*],curl http://192.168.0.10/service1/metrics/ | grep $1| sed 's/,//' | awk '{print $$2}'
                При этом на Zabbix Server будут уже существовать элементы:
                • jmx_data["mem:"]
                • jmx_data["mem.free:"]
                • jmx_data["heap:"]
                • jmx_data["jvm.memory.heap.used:"]
                • jmx_data["uptime:"]

                Когда подойдет время для опроса очередного элемента, Zabbix Server пошлет запрос на агент с указанием элемента, который ему нужен, и агент вставит это значение в строку для UserParameter.
                Получится что-то типа:
                Code:
                curl http://192.168.0.10/service1/metrics/ | grep "jvm.memory.heap.used:" | sed 's/,//' | awk '{print $$2}'
                и тогда агент последовательно :
                • запросит данные со странички метрик
                • выделит строку, содержащую "jvm.memory.heap.used:"
                • удалит запятую из строки
                • выделит только цифровое значение

                и вернёт полученное значение на сервер.

                Резюмируя, для мониторинга 5 параметров достаточно :
                • один раз создать руками соответствующие элементы и настроить периодичность их опроса
                • один раз написать правильно UserParameter

                Вот и всё
                Sincerely yours,
                Aleksey

                Comment

                Working...