Ad Widget

Collapse

Perl Zabbix API: всё одной командой и море документаци

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • DRVTiny
    Senior Member
    • Sep 2011
    • 162

    #31
    Нужно включить режим отладки в веб-интерфейсе Zabbix (добавьте своего пользователя в группу Debug), перезайти в интерфейс, получить наверху справа ссылку "Debug"|"Отладка", ткнуть в неё после получения соотв. результатов на странице - там будут запросы API и запросы напрямую в СУБД.

    Comment

    • DRVTiny
      Senior Member
      • Sep 2011
      • 162

      #32
      По сути Zabipi: если у кого-то есть желание, готов реализовать объектно-ориентированным образом или хотя бы с претензией на ОО-подобность.

      Сейчас явное ограничение Zabipi - можно одновременно использовать только одно "подключение" к Zabbix-фронтенду. В ООП эта проблема бы решилась, но мне крайне неудобно то, что всё окружение объекта нужно хранить в $self->{'variable_name'}. Я уже пытался переписать код Zabipi на ООП с хитрыми замыканиями, чтобы всё-таки использовать локальные переменные уровня объекта, но там тоже возникли проблемы.

      Comment

      • Jimson
        Senior Member
        • Jan 2008
        • 1327

        #33
        Попытки натянуть на Перл ОО логику других языков ни чем хорошим не заканчивается. Большинство ОО "выкрутасов" не более чем просто ограничения компиляторов, удобно, но если речь не идет о проекте разрабатываемом сотней девелоперов, то без этих удобств можно обойтись.
        А еще рекомендую прочитать про лямбда-выражения в java, сколько они ходили кругами вокруг, но в конце концов добавили в язык ссылки на функции, а все эти годы просто думали как бы это представить в таком виде что вроде как это это и не ссылки.
        Короче, не мучай тебе голову и мягкое место, $self->{} ни чем не хуже, ты же не фреймворк собираешься разрабатывать.

        P.S. если будешь писать переписывать, то обрати внимание на реализацию неблокируемого коннекта, она не очевидна
        Last edited by Jimson; 18-01-2016, 15:40.

        Comment

        • DRVTiny
          Senior Member
          • Sep 2011
          • 162

          #34
          Пофиксил баг с удалением по списку. Баг довольно забавный... Не очень понятно, как он мог существовать столько времени и никто его, включая и меня, не замечал.

          Comment

          • alex5678
            Junior Member
            • Dec 2015
            • 6

            #35
            Originally posted by drvtiny
            Нужно включить режим отладки в веб-интерфейсе zabbix (добавьте своего пользователя в группу debug), перезайти в интерфейс, получить наверху справа ссылку "debug"|"Отладка", ткнуть в неё после получения соотв. результатов на странице - там будут запросы api и запросы напрямую в СУБД.
            Спасибо большое за совет. Отладка сильно облегчает понимание.

            Comment

            • DRVTiny
              Senior Member
              • Sep 2011
              • 162

              #36
              Закоммитил поддержку сохранения authToken'а (он же zabbix session id) в cookie-файл после успешной авторизации.

              Для того, чтобы сохранить токен в куки-файл, добавьте путь к файлу куки после login и password - параметров в методе zbx('auth')

              Пример:
              Code:
               zbx('auth', 'admin', 'zabbix', '/tmp/cookies.txt');
              Но более жизненным является пример, в котором авторизация (создание новой сессии) осуществляется только после неудачной авторизации с использованием куки-файла:

              Code:
              Monitoring::Zabipi->new($host_or_url,$apiPars);
              unless ( zbx('cookieAuth', 'cookies.txt') ) {
               zbx('auth',$login,$pass) or die "I cant authorize you on ${host_or_url}, reason: ".zbx_last_err();
              }
              Для чего это нужно? Для того, чтобы не засорять базу данных записями для новых сессий и вообще по возможности не писать в базу даже тогда, когда в этом нет никакой необходимости (каждый auth, он же user.login приводит к созданию новой сессии). Также такой подход избавляет от необходимости удалять сессию явным образом после работы с API (если не удалять, таблица sessions в базе очень скоро вырастет до неприличных размеров).

              Comment

              • araneon
                Junior Member
                • Apr 2016
                • 28

                #37
                Подскажите, при помощи Zabipi можно создать отчёт о котором я спрашивал в этой теме?
                P.S. Прошу прощения за корявый пост, с телефона пишу.
                Last edited by araneon; 14-12-2016, 17:22.

                Comment

                • yukra
                  Senior Member
                  • Apr 2013
                  • 1359

                  #38
                  Для неискушенных в перле(хотя могут ли быть такие среди пользователей):
                  Monitoring::Zabipi->new нужно вызывать либо с просто с адресом хоста (если не используете https), либо с полным путем до api_jsonrpc.php (если используете перенаправление с http на https
                  То есть или
                  Code:
                  Monitoring::Zabipi->new('zabbix.example.org');
                  или
                  Code:
                  Monitoring::Zabipi->new('https://zabbix.example.org/zabbix/api_jsonrpc.php');
                  Зы не забывайте мониторить что ваши API вызовы отрабатывают. А то я как-то внезапно на https переехал, а потом пару дней не мог понять "вроде все ок, но чего-то не зватает", оказалось Zabipi ругается
                  Code:
                  ** POST http://zabbix.logol.ru ==> 200 OK
                  Cant get API version info: Unknown content-type in response headers
                  API not initialized yet, use "new" method with the correct parameters and check its return code
                  Пулреквеста сейчас к сожалению не будет, глянул код и быстро поправил ссылку, может быть как-нить потом найду времени сделать, если до меня никто не пришлет.

                  Зы Андрей, спасибо за отличную штуку.

                  Comment

                  • Alex_UUU
                    Senior Member
                    • Dec 2018
                    • 541

                    #39
                    Господа, приветствую.
                    Столкнулся с такой штукой в использовании данного модуля.
                    Если указать такой запрос
                    Code:
                    zbx('user.get',
                        {
                        "countOutput" => "true",
                        "filter"=>{"alias"=>э123э},
                    то он должен возвратить не хеш, а количество найденных.
                    Но это вызывает ошибку
                    Can't use string ("1") as an ARRAY ref while "strict refs" in use at /usr/lib/zabbix/alertscripts//Monitoring/Zabipi.pm line 338.
                    Т.к. Андрей жестко считает, что переменная - ссылка на массив my ($ans,$flags)=@_; и or !@$ans;
                    Никто не изменял, чтобы можно было получить кол-во?

                    Пока ждал авторизации решил,
                    перед 338 строкой доьавил
                    Code:
                    if(ref($ans) ne 'ARRAY'){$ans=[$ans]};

                    Comment

                    • DRVTiny
                      Senior Member
                      • Sep 2011
                      • 162

                      #40
                      Несмотря на древность модуля и его ограничения, в нём что-то уже столько всего полезного накопилось, что жалко отказываться.
                      Так что продолжаю потихоньку развивать от случая к случаю.
                      Теперь есть Monitoring::Zabipi::SetEnv для чтения конфига подключения в shell-формате (обратите внимание на расстановку кавычек):

                      ZBX_URL='https://zabbix.example.com/api_jsonrpc.php'
                      ZBX_LOGIN=api-user
                      ZBX_PASS='Strong Password "Yeah!"'
                      PERL_LIBS="/opt/perl5/lib"


                      При этом PERL_LIBS применяется в самом начале скрипта, так что можно не экспортировать специально переменные окружения и не писать use lib .
                      Также doItemNameExpansion в Monitoring::Zabipi::Common стал делать свою работу по замене позиционных макросов намного качественнее (что весьма актуально при переходе с Zabbix 5.x на 6 b выше).

                      Comment

                      Working...