Ad Widget

Collapse

Триггер для элемента ODBC?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Ilushko
    Junior Member
    • Nov 2019
    • 18

    #1

    Триггер для элемента ODBC?

    Всем привет.

    Хочу мониторить работу джобов на MSSQL.
    Запрос возвращает имена джобов, которые завершились с ошибкой:

    1. Выявление несоответствий содержимого заказников и какрт сбора
    2 .Формирование индексов списаний

    Могу ли я создать такой триггер, который будет срабатывать, когда этот запрос возвращает >0 строк и вывести эти строки на дошборд?
  • Scorpey
    Member
    • Oct 2010
    • 97

    #2
    Originally posted by Ilushko
    Всем привет.

    Хочу мониторить работу джобов на MSSQL.
    Запрос возвращает имена джобов, которые завершились с ошибкой:

    1. Выявление несоответствий содержимого заказников и какрт сбора
    2 .Формирование индексов списаний

    Могу ли я создать такой триггер, который будет срабатывать, когда этот запрос возвращает >0 строк и вывести эти строки на дошборд?
    можешь.
    Делай запрос count - он вернет количество строк.
    На дашборд выводи текст из другого запроса, который отдает джобы.

    Comment

    • Ilushko
      Junior Member
      • Nov 2019
      • 18

      #3
      Originally posted by Scorpey

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

      Comment

      • Kos
        Senior Member
        Zabbix Certified SpecialistZabbix Certified Professional
        • Aug 2015
        • 3404

        #4
        Zabbix работает со скалярными значениями, он не работает с Result Set-ом неопределённой размерности.
        Поэтому тут возможны два подхода:
        • либо использовать механизм низкоуровневого обнаружения (LLD) и для каждой возвращаемой строки создавать из прототипов свои объекты - элемент данных и триггер;
        • либо весь Result Set обрабатывать как одно (возможно, большое) текстовое значение.
        Конкретно для данной задачи я бы выбрал второй вариант. Для него нужно:
        • грамотно сформулировать сам SELECT, чтобы он возвращал минимум полей. В идеале - просто одно поле строкового типа, в которое объединить все требующиеся поля; обязательно с явным указанием имени этого возвращаемого поля (например, RESULT);
        • для элемента данных указать тип данных: "Text" (чтобы позволить сохранять многострочные значения);
        • использовать для запроса метрику db.odbc.get, которая полученный Result Set преобразует в JSON;
        • далее этот JSON с помощью препроцессинга преобразовать в одно многострочное значение (пример такой обработки - ниже).
        • на всё это дело навесить триггер, который будет срабатывать по условию "strlen()>0", т.е. когда вернулось непустое значение.
        Пример преобразования JSON-а в многострочный текст:
        Предполагаем, что исходный SELECT сформулирован так, что возвращается одно поле с именем RESULT.
        Добавляем шаг препроцессинга с типом "JavaScript" и таким скриптом:
        Code:
        //transform source string into JSON object
        val_json=JSON.parse(value);
        //extract needed parts only into array
        val_array=[];
        for (i in val_json) {
          val_array.push(val_json[i]["RESULT"]);
        }
        //return array as a string using NL as a separator
        return val_array.join('\n');
        Last edited by Kos; 10-03-2021, 15:54.

        Comment

        • Ilushko
          Junior Member
          • Nov 2019
          • 18

          #5
          • грамотно сформулировать сам SELECT, чтобы он возвращал минимум полей. В идеале - просто одно поле строкового типа, в которое объединить все требующиеся поля; обязательно с явным указанием имени этого возвращаемого поля (например, RESULT);
          • для элемента данных указать тип данных: "Text" (чтобы позволить сохранять многострочные значения);
          • использовать для запроса метрику db.odbc.get, которая полученный Result Set преобразует в JSON;
          Выполнил эти шаги

          Результатом получается вот такая строка: [{"Result":"Выявление несоответствий содержимого заказников и какрт сбора;Формирование индексов списаний;"}]

          Создал шаг предобработки типа JavaScript и вставил ваш скрипт как обработчик.

          Далее запускаю тест шага:
          В результате вижу такую строку:
          Выявление несоответствий содержимого заказников и какрт сбора;Формирование индексов списаний;

          Comment

          • Kos
            Senior Member
            Zabbix Certified SpecialistZabbix Certified Professional
            • Aug 2015
            • 3404

            #6
            Originally posted by Ilushko
            Выполнил эти шаги

            Результатом получается вот такая строка: [{"Result":"Выявление несоответствий содержимого заказников и какрт сбора;Формирование индексов списаний;"}]
            Ну, скрипт-обработчик выполняет поставленную задачу: возвращает значение в виде текста.
            Для меня не очень понятно, почему SELECT возвращает одну строку - из первоначального сообщения я понял так, что имя каждого проблемного джоба возвращается отдельной строкой Result Set-а.
            Собственно, JavaScript и нужен был, чтобы все эти строки слепить в одно многострочное значение.

            Если же SELECT изначально возвращает всегда только одну строку (возможно, пустую), то всё, о чём я писал, - излишне: достаточно эту строку принимать через db.odbc.select[] (безо всякого препроцессинга), а результат сравнивать с пустой строкой (например, при помощи той же триггерной функции strlen()).

            Comment

            • Ilushko
              Junior Member
              • Nov 2019
              • 18

              #7
              Originally posted by Kos
              Ну, скрипт-обработчик выполняет поставленную задачу: возвращает значение в виде текста.
              Для меня не очень понятно, почему SELECT возвращает одну строку - из первоначального сообщения я понял так, что имя каждого проблемного джоба возвращается отдельной строкой Result Set-а.
              Собственно, JavaScript и нужен был, чтобы все эти строки слепить в одно многострочное значение.

              Если же SELECT изначально возвращает всегда только одну строку (возможно, пустую), то всё, о чём я писал, - излишне: достаточно эту строку принимать через db.odbc.select[] (безо всякого препроцессинга), а результат сравнивать с пустой строкой (например, при помощи той же триггерной функции strlen()).
              Я перестроил запрос так, что-бы он возвращал одно поле основываясь на вашей рекомендации:

              В идеале - просто одно поле строкового типа, в которое объединить все требующиеся поля; обязательно с явным указанием имени этого возвращаемого поля (например, RESULT);

              Comment

              Working...