Ad Widget

Collapse

вопрос по плагину zabbix-agent2-plugin-mssql

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • zabbix777
    Member
    • Nov 2023
    • 70

    #1

    вопрос по плагину zabbix-agent2-plugin-mssql

    Всем доброго дня. У меня установлен плагин https://www.zabbix.com/documentation...s/mssql_plugin для контроля джобов на МSSQL сервере, также подключен стандартный для этого плагина шаблон "MSSQL by Zabbix agent 2."
    Он находит все джобы на сервере и присылает их статусы выполнения на заббикс. все работает.
    Не могу понять как через него сделать следующее:
    Мне потребовалось настроить джобу, при успешном выполнении, которой бы приходил бы успешный статус на заббикс и триггер бы срабатывал на успешное выполнении, присылал уведомление по почте. Данная джоба выполняется раз в неделю и должна генерировать одно такое сообщение.
    При создании данной джобы в забиксе правилами обнаружения создаются 3 зависимых ЭД mssql.job.enabled, mssql.job.status_raw, mssql.job.runstatus, они зависят от ЭД mssql.job.status.get["{$MSSQL.URI}","{$MSSQL.USER}","{$MSSQL.PASSWO RD}"].
    Далее создаю триггер last(/PC/mssql.job.runstatus["Название джобы"])=1.
    Но так это не работает, так триггер срабатывает только один раз, и на след. неделе при выполнении данной джобы, он не отработает.
    Если ставить множественную сработку, то натыкаемся на внутреннюю работы всей это связки (см 4), здесь видно что ЭД mssql.job.runstatus, приходит каждые 20 мин, это происходит, т.к. у ЭД mssql.job.status.get стоит интервал 10 минут, а у ЭД mssql.job.runstatus​ в предобработке стоит (см 8). Итого видно что каждые 20 минут приходит событие из 4.png. Следовательно мне будет приходить сработки триггера last(/PC/mssql.job.runstatus["Название джобы"])=1, каждые 20 мин. А нужно сделать так чтобы они приходили лишь при выполнении джобы раз в неделю, а не проверке статуса каждые 20 мин.
    Заранее благодарен за помощь.
    Attached Files
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    Я думаю, что ставить параметр "Режим генерации событий ПРОБЛЕМА"="Множественный" в вашем случае не нужно.
    А нужно определиться с критериями того, каким образом вы хотите закрывать такую проблему после того, как она возникла. А также с уточнением критериев того, когда именно ей возникать, если она уже была закрыта.
    Тут возможны варианты.
    Самый простой вариант - закрывать проблему вручную (собственно, у вас так и настроено). Но при следующей проверке она будет открыта снова, т.к. проверяется лишь значение метрики mssql.job.runstatus, а она у вас всегда равна 1 (если всё ОК), кроме тех редких случаев, когда выполнение проверки выпадает на момент работы джоба (тогда там будет 4).
    На самом деле, хорошо бы посмотреть по истории: всегда ли значение этой метрики успевает измениться на 4. Если да, то самый простой вариант - дополнить триггер условием "а предыдущее значение было 4":
    Code:
    last(/PC/mssql.job.runstatus["Название джобы"],#1)=1
    and
    last(/PC/mssql.job.runstatus["Название джобы"],#2)=4
    В таком случае триггер будет срабатывать по окончании джоба, присылать уведомление, а вскоре после этого закрываться сам.
    Если же джоб отрабатывает быстро, и не всегда Zabbix успевает "поймать" значение "4 (Running)", то нужно придумывать что-то более сложное.
    Например, добавить условия "текущий день недели равен ..." и "текущее время больше чем...", чтобы статус джоба сравнивать только после того, как он завершит работу.
    Либо, как вариант, добавить сравнение значения параметра mssql.job.lastrundatetime (вы ведь этим шаблоном пользуетесь?) с текущим временем (нужно только проверить, в каком формате там приходит значение).

    Comment

    • zabbix777
      Member
      • Nov 2023
      • 70

      #3
      да джоба отрабатывает в течении 5-10 сек. значение 4 (Running) я ни разу в фиксировал. Пробовал ранее вариант с днем недели и временем
      Code:
      last(/узел/mssql.job.runstatus["джоба"])=1 and dayofweek()=3 and time()>065200 and time()<070000
      , это не работает как хотелось бы. при сработке джобы в этот интервал, ничего приходит, приходит только если в этот интервал попадет получение значения от mssql.job.runstatus (которое приходит каждые 20 мин, как я описывал ранее), т.е. само по себе выполнение джобы не провоцирует заббикс агент отправить данные о статусе. я так понял что ЭД mssql.job.runstatus каждые 20 мин показывает последний статус джобы, когда она была выполнена в последний раз. Вроде это можно использовать, если включить "Генерацию ОК события", т.к. без этого, если изменения статуса джобы не происходит, повторно это событие не прийдет.
      Второй вариант еще не пробовал. Да шаблон этот используется. ЭД " mssql.job.lastrundatetime " у меня отключен, т.к. мне он не нужен был до этого. Попробую напишу.

      Comment


      • zabbix777
        zabbix777 commented
        Editing a comment
        когда включаю "Генерацию ОК события" в значение "выражение", то почему-то приходят сразу несколько оповещений о восстановлении триггера, поэтому я вообщем-то и выставил значение "нет"
    • Kos
      Senior Member
      Zabbix Certified SpecialistZabbix Certified Professional
      • Aug 2015
      • 3404

      #4
      когда включаю "Генерацию ОК события" в значение "выражение", то почему-то приходят сразу несколько оповещений о восстановлении триггера, поэтому я вообщем-то и выставил значение "нет"
      Это следствие того, что у вас стояло "Режим генерации событий ПРОБЛЕМА"="Множественный". Новая проблема открывалась, не ожидая, когда закроется предыдущая, т.е. их было открыто несколько штук сразу. Поэтому при закрывании проблемы они и закрывались все сразу (с соответствующими оповещениями о восстановлении).
      Code:
      last(/узел/mssql.job.runstatus["джоба"])=1 and dayofweek()=3 and time()>065200 and time()<070000
      , это не работает как хотелось бы. при сработке джобы в этот интервал, ничего приходит, приходит только если в этот интервал попадет получение значения от mssql.job.runstatus (которое приходит каждые 20 мин, как я описывал ранее), т.е. само по себе выполнение джобы не провоцирует заббикс агент отправить данные о статусе. я так понял что ЭД mssql.job.runstatus каждые 20 мин показывает последний статус джобы, когда она была выполнена в последний раз.
      Да, именно так; удивлён тем, что это вас удивляет. Если новые значения приходят с интервалом 20 минут, то и условие триггера составляйте с учётом этого: оставьте промежуток между time()>... и time()<... больше этих 20 минут, чтобы в него попало хотя бы одно значение.
      Второй вариант еще не пробовал. Да шаблон этот используется. ЭД " mssql.job.lastrundatetime " у меня отключен, т.к. мне он не нужен был до этого. Попробую напишу.
      Насколько я понял, там приходит время в формате unixtime, т.е. в том же формате, что возвращается функцией now(). Тогда условие триггера можно сформулировать, например, так:
      Code:
      last(/узел/mssql.job.runstatus["джоба"])=1 and last(/узел/mssql.job.lastrundatetime["джоба"])>=(now() - 120)
      (т.е. последний раз задание завершилось не ранее 20 минут назад).

      Comment


      • zabbix777
        zabbix777 commented
        Editing a comment
        Да спасибо за помощь. в целом стало понятно как работает. Пойду донастрою.
    Working...