Ad Widget

Collapse

Items для MSSQL - из запроса

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Alexey.Kuzmin
    Member
    • Jun 2017
    • 47

    #1

    Items для MSSQL - из запроса

    Всем - здравствуйте!
    Есть задача - мониторить некоторый процесс в MSSQL: выполняем запрос, получаем набор строк (ограниченный, количество - заранее известно).
    На основе этого, понимаем, работает бизнес-процесс или нет.
    Хочется делать это в zabbix.
    Агент на сервер мы поставить можем.
    Как сказать агенту выполнить произвольный скрипт, возвращающий данные в нужном формате, и отправить результаты на сервер?
    В общем, хочется сделать, как при использовании питоновского скрипта для мониторинга Oracle, только - для мониторинга MSSQL.
    Есть ли подобные инструменты?
  • aib
    Senior Member
    • Jan 2014
    • 1615

    #2
    На первый взгляд, типичная задачка для


    На второй взгляд, могут (!) возникнуть проблемы с долгим выполнением скрипта - тогда асинхронные проверки по cron, возвращающие результат на сервер с использованием zabbix_sender.

    Действуйте по шагам. Попробуйте сначала Userparameters в конфигурации агента на сервере MSSQL. Потом будете думать и действовать дальше.
    Sincerely yours,
    Aleksey

    Comment

    • Alexey.Kuzmin
      Member
      • Jun 2017
      • 47

      #3
      Спасибо!
      Пошёл по пути UserParameters:
      1. Создал файл C:\S.sql:
      set nocount on;
      select 2;
      go
      2. В конфиге прописал:
      UserParameter=S,sqlcmd -S SRV-SQLTST1-DCB -i C:\S.sql
      3. Во время тестового запуска:
      C:\Zabbix\Scripts> C:\Zabbix\zabbix_agentd -t S

      S [m|ZBX_NOTSUPPORTED] [Unsupported item key.]

      Всё уже перепроверил. Где может быть ошибка?

      Comment

      • Alexey.Kuzmin
        Member
        • Jun 2017
        • 47

        #4
        заработал скрипт.

        Comment

        • Alexey.Kuzmin
          Member
          • Jun 2017
          • 47

          #5
          Сделал так:
          1. В конфиге:
          UserParameter=S,chcp 65001>nul && sqlcmd -S S1 -h -1 -i C:\S.sql -f 65001
          2. S.sql:
          set nocount on;
          select 'test' as val;

          Теперь хочу, чтобы была не одна метрика (item), а - несколько.
          Запрос из файла S.sql возвращает несколько строк.

          Как за один запрос выбрать несколько метрик?

          Есть вариант
          UserParameter=S1,chcp 65001>nul && sqlcmd -S S1 -h -1 -i C:\S.sql -f 65001 |findstr /N ".*"| findstr ^1
          UserParameter=S2,chcp 65001>nul && sqlcmd -S S1 -h -1 -i C:\S.sql -f 65001 |findstr /N ".*"| findstr ^2
          UserParameter=S3,chcp 65001>nul && sqlcmd -S S1 -h -1 -i C:\S.sql -f 65001 |findstr /N ".*"| findstr ^3

          Но он - плохой, потому что один и тот же скрипт выполняется много раз, возвращая одни и те же строки.

          Есть возможность выполнить скрипт один раз и послать на zabbix-server всё сразу?

          Comment

          • Semiadmin
            Senior Member
            • Oct 2014
            • 1625

            #6
            Если у вас v3.4, то можно использовать Dependent items

            Comment

            • aib
              Senior Member
              • Jan 2014
              • 1615

              #7
              А можно написать свой скрипт, стартующий независимо по крону, и отсылающий данные с использованием zabbix_sender.
              Sincerely yours,
              Aleksey

              Comment

              • Alexey.Kuzmin
                Member
                • Jun 2017
                • 47

                #8
                Появилась такая идея:
                На клиенте (mssql) сделать некую процедуру, которая бы возвращала результаты переданного ей запроса. На сервере конфигурится метрика (item), запрос, который должен возвращать её значение, он передаётся процедуре на клиенте, та возвращает значение метрики. Таким образом, мы получаем, что для всех клиентов - одинаковый набор для развёртывания агента, а сами метрики мы конфигурим на zabbix-сервере.
                Так можно сделать? В какую сторону копать?

                Comment

                • kernbug
                  Senior Member
                  • Feb 2013
                  • 330

                  #9
                  Originally posted by Alexey.Kuzmin
                  Появилась такая идея:
                  Так можно сделать? В какую сторону копать?
                  Здравствуйте,
                  UserParameter позволяет использовать переменные, передаваемые сервером, например:
                  Code:
                     
                   UserParameter=mysql.ping[*],mysqladmin -u$1 -p$2 ping | grep -c alive  
                   [FONT="Open Sans"][/FONT]
                  где $1 и $2 учетные данные для MySQL, ключ который следует задать в конфигурации элемента данных mysql.ping[zabbix,our_password] Вы можете написать один универсальный скрипт, который в зависимости о переданных переменных будет возвращать данные, настроить одинаковый шаблон и разнести идентичную конфигурацию по серверам.

                  Comment

                  • Alexey.Kuzmin
                    Member
                    • Jun 2017
                    • 47

                    #10
                    Спасибо, буду пробовать.

                    Comment

                    • Alexey.Kuzmin
                      Member
                      • Jun 2017
                      • 47

                      #11
                      Сделал так:
                      sql_cmd.cmd:
                      sqlcmd -v dbname = $args[0] -h -1 -y 30 -Y 30 -f 65001 -Q $args[1]

                      вызов в командной стоке - проходит:
                      > sql_cmd.ps1 mater "set nocount on select @@servername"
                      SRV-SQLTST1-DCB

                      В конфиге прописано:
                      UserParameter=userdata, C:\Scripts\sql_cmd.ps1 $1 $2

                      Но при создании item с параметром:
                      userdata[master, "set nocount on; select @@version;"]
                      возникает сообщение, что "Item does not allow parameters"

                      Где я ошибся?

                      Comment

                      • aib
                        Senior Member
                        • Jan 2014
                        • 1615

                        #12
                        UserParameters с параметрами описывается чуть-чуть по-другому

                        Коротко: после ключевого слова userdata должны стоять скобки со звездочкой внутри
                        UserParameter=userdata[*], C:\Scripts\sql_cmd.ps1 $1 $2
                        Sincerely yours,
                        Aleksey

                        Comment

                        • Alexey.Kuzmin
                          Member
                          • Jun 2017
                          • 47

                          #13
                          Да, спасибо большое, понял.
                          Теперь другая проблема: как передать в качестве параметра строку с пробелами: ни двойные, ни одинарные кавычки он не понимает:

                          > .\zabbix_agentd -t userdata[master, "select @@version"]
                          zabbix_agentd.exe [10972]: invalid parameter "select @@version"
                          zabbix_agentd.exe [10972]: invalid parameter "]"
                          > .\zabbix_agentd -t userdata[master, 'select @@version']
                          zabbix_agentd.exe [9008]: invalid parameter "select @@version"
                          zabbix_agentd.exe [9008]: invalid parameter "]"

                          Comment

                          • aib
                            Senior Member
                            • Jan 2014
                            • 1615

                            #14
                            По той ссылке прочитайте примечание о параметре UnsafeUserParameters в конфигурационном файле агента
                            Там чётко написано, что некоторые символы (включая @) запрещены в параметрах до тех пор, пока UnsafeUserParameters=0
                            Sincerely yours,
                            Aleksey

                            Comment

                            • aib
                              Senior Member
                              • Jan 2014
                              • 1615

                              #15
                              Кстати - вы уже достаточно набрали опыта для перехода на следующий уровень
                              Почитайте о zabbix_sender и посмотрите в Интернете примеры такой конфигурации.
                              Кратко:
                              - на контролируемом сервере по CRON стартует скрипт, собирающий всю информацию, которая вам нужна и отправляющий её на сервер "пакетом"
                              - на Zabbix-сервере информация накапливается и отображается.

                              В таком случае у вас пропадает необходимость опрашивать агента 100500 раз, и вы можете устроить такую преобработку данных, какая вам нравится.
                              Sincerely yours,
                              Aleksey

                              Comment

                              Working...