Ad Widget

Collapse

Мониторинг работы скрипта

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • pirate
    Junior Member
    • Sep 2015
    • 15

    #1

    Мониторинг работы скрипта

    Доброго времени суток.
    Помогите советом или реализацией мониторинга. При стандартной схеме оповещения через действие, в условиях используются триггеры, скрипт получает 3 параметра. Как в Zabbix проверить, что скрипт получил эти параметры? Т.е. нужна проверка работоспособности скрипта.
    Мое виденье этого, что после получения скриптом параметров записать их в определенные метрики из самого скрипта с помощью zabbix_sender. Но как потом сделать сравнение последнего значения метрики со значениями в журнале действий?
  • karik-himik
    Senior Member
    • Oct 2015
    • 116

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

    Можно еще работу скрипта логировать, а заббиксом мониторить этот лог.

    Или Вы хотите видеть какие конкретно параметры получил скрипт и использовалилсь ли именно эти параметры при выполнении действия ?

    Comment

    • pirate
      Junior Member
      • Sep 2015
      • 15

      #3
      Originally posted by karik-himik
      Не совсем понятно, зачем Вам сравнивать значения из журнала действий с входными параметрами скрипта ?
      Достаточно ведь просто выполнить проверку получения входных параметров и результат вернуть заббиксу в отдельный ключ.

      Можно еще работу скрипта логировать, а заббиксом мониторить этот лог.

      Или Вы хотите видеть какие конкретно параметры получил скрипт и использовалилсь ли именно эти параметры при выполнении действия ?
      Если скрипт не отработает, то как понять что в него данные попали? Так же с логами, в них ничего не запишется если скрипт не отработал. Вернуть данные из скрипта в Zabbix не получится в случае неработающего скрипта.
      Вернуть значения в какой-либо ключ не проблема. Я не понимаю с чем их сравнить, что бы в случае несовпадения отправленных и возвращенных данных срабатывал триггер.
      Возможно ли через API получить список выполненных действий?

      Comment

      • sadman
        Senior Member
        • Dec 2010
        • 1611

        #4
        Originally posted by pirate
        Возможно ли через API получить список выполненных действий?
        Как бы да: https://www.zabbix.com/documentation...ference/action

        Comment

        • pirate
          Junior Member
          • Sep 2015
          • 15

          #5
          Originally posted by sadman
          action.get - возвращает список действий и их настройки. Может быть Вы имели введу alert.get, Список выполненных действий там можно посмотреть.

          Comment

          • sadman
            Senior Member
            • Dec 2010
            • 1611

            #6
            Originally posted by pirate
            action.get - возвращает список действий и их настройки. Может быть Вы имели введу alert.get, Список выполненных действий там можно посмотреть.
            Да, действительно, что это я...

            Впрочем, мне всё равно непонятно, как можно достоверно заключить, что какой-либо alert относится к проблемному запуску. Разве что по eventid выслеживать или сообщать вообще о всех неудачных попытках.

            Comment

            • pirate
              Junior Member
              • Sep 2015
              • 15

              #7
              Может кому пригодится "костыли".
              Имеется скрипт на python который отправляет инфу о событиях, данные он получает через API. Необходима проверка его работоспособности.
              При вызове скрипта, через функцию zabbix_sender записывается eventid обработанного события в предварительно настроенный узел сети с метрикой типа zabbix траппер. Так же настроена веб проверка, при вызове url так же через zabbix_sender возвращается в тот же узел сети, во вторую метрику с типом zabbix траппер, последний eventid из журнала событий использующий определенный способ оповещения. В условии триггера сравниваются 2 этих значения.
              Если кому-то интересно, могу выложить код.

              Comment

              • pirate
                Junior Member
                • Sep 2015
                • 15

                #8
                Originally posted by sadman
                Да, действительно, что это я...

                Впрочем, мне всё равно непонятно, как можно достоверно заключить, что какой-либо alert относится к проблемному запуску. Разве что по eventid выслеживать или сообщать вообще о всех неудачных попытках.
                Попытка может быть удачна, но скрипт не отработает.

                Comment

                • sadman
                  Senior Member
                  • Dec 2010
                  • 1611

                  #9
                  Originally posted by pirate
                  через zabbix_sender возвращается в тот же узел сети, во вторую метрику с типом zabbix траппер, последний eventid из журнала событий использующий определенный способ оповещения. В условии триггера сравниваются 2 этих значения.
                  Вы бы реальный пример из жизни привели, а то как-то в общем смысле непонятно куда это прикладывать (может быть только мне, конечно).

                  Comment

                  • pirate
                    Junior Member
                    • Sep 2015
                    • 15

                    #10
                    Используется https://github.com/confirm/PhpZabbixApi.
                    URL -
                    Code:
                    http://localhost/lasteventid.php?exec_path=zbx2bsm.py&host=selfcheck&key=lastidact
                    lasteventid.php
                    exec_path - имя скрипта в способах оповещения. Выбрано для того, что бы не править скрипт при смене имени скрипта и не заморачиваться с mediatypeid.
                    host - имя узла сети для zabbix_sender
                    key - ключ для zabbix_sender

                    PHP Code:
                    <?php

                    if (!isset($_GET['exec_path']) || !isset($_GET['host']) || !isset($_GET['key'])) {
                       echo 
                    'exit';
                       exit;
                    }

                    $exec_path $_GET['exec_path'];
                    $host $_GET['host'];
                    $key $_GET['key'];

                    require_once 
                    'config.php';
                    require_once 
                    'zabbix_sender.func.php';
                    require_once 
                    'zbx_api/ZabbixApi.class.php';
                    use 
                    ZabbixApi\ZabbixApi;

                    try
                    {
                        
                    // connect to Zabbix API
                        
                    $api = new ZabbixApi($apiurl$apiuser$apipass);
                        
                    $mediatype $api->mediatypeGet([
                            
                    'filter' => ['exec_path' => $exec_path]
                        ]);
                        
                    $mediatypeid $mediatype[0]->mediatypeid;

                        
                    $alert $api->alertGet([
                            
                    'filter' => ['mediatypeid' => $mediatypeid],
                            
                    'sortfield' => ['eventid'],
                            
                    'sortorder' => ['DESC'],
                            
                    'limit' => 1
                        
                    ]);

                        
                    $lasteventid $alert[0]->eventid;
                    }
                    catch(
                    Exception $e)
                    {
                        
                    // Exception in ZabbixApi catched
                        
                    echo $e->getMessage();
                    }

                    zabbix_sender($zbx_server$zbx_port$host$key$lasteventid);

                    ?>
                    config.php
                    PHP Code:
                    <?php

                    $apiuser    
                    'api';
                    $apipass    'password';
                    $apiurl     'http://localhost/zabbix/api_jsonrpc.php';
                    $zbx_server '127.0.0.1';
                    $zbx_port   10051;

                    ?>
                    zabbix_sender.func.php - взял с этого форума и переделал функцию под свои нужды
                    PHP Code:
                    <?php

                    function zabbix_sender($zbx_server,$zbx_port$host$key$value ) {

                       
                    $body = (object)[
                          
                    'request' => 'sender data',
                          
                    'data' => [(object)['host' => $host'key' => $key'value' => $value]]
                       ];

                       
                    $json_body json_encode$body );

                       
                    $size strlen$json_body );
                       
                    $request pack'a4CV2a*''ZBXD'1$size, ( $size >> 32 ), $json_body );

                       
                    $s=fsockopen($zbx_server,$zbx_port,$errnum,$errstr,15);
                       
                    fputs($s,$request);
                       
                    fclose($s);

                    }

                    ?>
                    в python
                    Code:
                    def zabbix_sender(host, key, value):
                       buf = ''
                       data = []
                       clock = int(time())
                       json_data = {'request': 'sender data'}
                       data.append({'host':host,'key':key,'value':value,'clock':clock})
                       json_data['data'] = data
                       json_data = json.dumps(json_data)
                       data_len = struct.pack('<Q', len(json_data))
                       packet = 'ZBXD\1' + data_len + json_data
                       try:
                          zsock = socket.socket()
                          zsock.connect(('127.0.0.1', 10051))
                          zsock.sendall(packet)
                          while len(buf) < 13:
                             chunk = zsock.recv(13 - len(buf))
                             if not chunk:
                                resp_hdr = buf
                             buf += chunk
                          resp_hdr = buf
                          resp_body_len = struct.unpack('<Q', resp_hdr[5:])[0]
                          zsock.recv(resp_body_len)
                          zsock.close()
                       except Exception, e:
                          zsock.close()
                          raise Exception("Failed sending data.\nERROR: %s" % e)

                    Comment

                    Working...