返回列表 发帖

Zabbix调用Python3脚本监控MSSQL

笺注:这是在 使用Navicat远程管理MSSQL2014 的基础上进行的。


在CMD命令行中,查看本机的MSSQL的版本信息:
sqlcmd -S localhost -U sa -P Jacky888 -Q "select @@VERSION as 'MSSQL_Version:'"
图片2.png
2022-9-18 09:31

注释:
用户名 sa
用户密码 Jacky888
SQL语句 "select @@VERSION as 'MSSQL_Version:'"

sqlcmd -S localhost -U zhuohua -P 123 -Q "select @@VERSION as 'MSSQL Version:'"
图片3.png
2022-9-18 09:32

注释:
用户名 zhuohua
用户密码 123
SQL语句 "select @@VERSION as 'MSSQL Version:'"



查看MSSQL的最大用户连接数:
C:\Users\Administrator>sqlcmd -S localhost -U sa -P Jacky888 -Q "select @@MAX_CONNECTIONS as '最大用户连接数:'"
最大用户连接数:
-----------
      32767

(1 行受影响)


C:\Users\Administrator>


C:\Users\Administrator>sqlcmd -S localhost -U zhuohua -P 123 -Q "select @@MAX_CONNECTIONS as '最大用户连接数:'"
最大用户连接数:
-----------
      32767

(1 行受影响)


C:\Users\Administrator>



查看MSSQL的当前连接数:(这里使用数据库管理员sa才够权限)
C:\Users\Administrator>sqlcmd -S localhost -U sa -P Jacky888 -Q "SELECT cntr_value AS 'User_Connections:' FROM master.dbo.sysperfinfo WHERE counter_name = 'User Connections'"
User_Connections:
--------------------
                   9

(1 行受影响)

C:\Users\Administrator>



查看MSSQL的当前进程数:(这里使用数据库管理员sa才够权限)
C:\Users\Administrator>sqlcmd -S localhost -U sa -P Jacky888 -Q "select count(*) as '当前进程数:' from master.dbo.sysprocesses"
当前进程数:
-----------
         46

(1 行受影响)


C:\Users\Administrator>





测试用的表和数据:
图片4.png
2022-9-18 09:35



查询表data1.dbo.table1中字段id的最大值:
C:\Users\Administrator>sqlcmd -S localhost -U sa -P Jacky888 -Q "SELECT max(id) FROM data1.dbo.table1"

-----------
          3

(1 行受影响)


C:\Users\Administrator>


查询表data1.dbo.table1中某个符合条件的字段的值:
C:\Users\Administrator>sqlcmd -S localhost -U zhuohua -P 123 -Q "SELECT id FROM data1.dbo.table1 Where name = '李大杰'"
id
-----------
          2

(1 行受影响)


C:\Users\Administrator>


查询表data1.dbo.table1中某个符合条件的字段的值:
C:\Users\Administrator>sqlcmd -S localhost -U zhuohua -P 123 -Q "SELECT name FROM data1.dbo.table1 Where id = 1"
name
--------------------
Python

(1 行受影响)


C:\Users\Administrator>



############

被监控主机上安装第三方库(pyodbc),可参考:Python3脚本管理MSSQL2014

查看pyodbc的版本:
C:\Users\Administrator\Desktop>pip3 freeze
pyodbc==4.0.30

C:\Users\Administrator\Desktop>



######

在被监控主机上创建Python3脚本:(输出MSSQL的当前进程数)

### d:\xx.py

#coding=utf-8
import pyodbc

def db_connect():

        #打开数据库连接;本地连接(localhost)、端口号(1433)、其中一个库的名称(master)、用户名、密码:
        db = pyodbc.connect(DRIVER='{SQL Server}',SERVER='localhost',PORT='1433',DATABASE='master',UID='sa',PWD='Jacky888')
       
        cursor = db.cursor()
       
        SQL_1 = "select count(*) from sysprocesses" #SQL语句
        cursor.execute(SQL_1) #执行SQL语句
       
        Result_1 = cursor.fetchone() #使用fetchone只能获取一个元素

        #print(Result_1) # (46, )
        #print(type(Result_1)) # <class 'pyodbc.Row'>
       
        print(Result_1[0])
        #print(type(Result_1[0])) # <class 'int'>

        db.close()

def main():
        try:
                db_connect()
        except Exception as e:
                print(e)

if __name__ == "__main__":
        main()


脚本运行的结果:
C:\Users\Administrator\Desktop>python d:\xx.py
46

C:\Users\Administrator\Desktop>



######

在被监控主机上创建Python3脚本:(输出MSSQL的当前连接数)

### d:\yy.py

#coding=utf-8
import pyodbc

def db_connect():

        db = pyodbc.connect(DRIVER='{SQL Server}',SERVER='localhost',PORT='1433',DATABASE='master',UID='sa',PWD='Jacky888')       
        cursor = db.cursor()
       
        SQL_1 = "SELECT cntr_value FROM sysperfinfo WHERE counter_name = 'User Connections'"
        cursor.execute(SQL_1)
       
        Result_1 = cursor.fetchone()

        #print(Result_1) # (9, )
        #print(type(Result_1)) # <class 'pyodbc.Row'>
       
        print(Result_1[0])
        #print(type(Result_1[0])) # <class 'int'>
       
        db.close()

def main():
        try:
                db_connect()
        except Exception as e:
                print(e)

if __name__ == "__main__":
        main()


脚本运行的结果:
C:\Users\Administrator\Desktop>python d:\yy.py
9

C:\Users\Administrator\Desktop>



######

在被监控主机上创建Python3脚本:(输出MSSQL的最大用户连接数)

### d:\zz.py

#coding=utf-8
import pyodbc

def db_connect():

        db = pyodbc.connect(DRIVER='{SQL Server}',SERVER='localhost',PORT='1433',DATABASE='data1',UID='zhuohua',PWD='123')       
        cursor = db.cursor()
       
        SQL_1 = "select @@MAX_CONNECTIONS"
        cursor.execute(SQL_1)
       
        Result_1 = cursor.fetchone()

        #print(Result_1) # (32767, )
        #print(type(Result_1)) # <class 'pyodbc.Row'>
       
        print(Result_1[0])
        #print(type(Result_1[0])) # <class 'int'>
       
        db.close()

def main():
        try:
                db_connect()
        except Exception as e:
                print(e)

if __name__ == "__main__":
        main()


脚本运行的结果:
C:\Users\Administrator\Desktop>python d:\zz.py
32767

C:\Users\Administrator\Desktop>



######

在被监控主机上创建Python3脚本:(输出表data1.dbo.table1中字段id的最大值)

### d:\kk.py

#coding=utf-8
import pyodbc

def db_connect():

        db = pyodbc.connect(DRIVER='{SQL Server}',SERVER='localhost',PORT='1433',DATABASE='data1',UID='zhuohua',PWD='123')       
        cursor = db.cursor()
       
        SQL_1 = "Select Max(id) FROM table1"
        cursor.execute(SQL_1)
       
        Result_1 = cursor.fetchone()

        #print(Result_1) # (3, )
        #print(type(Result_1)) # <class 'pyodbc.Row'>
       
        print(Result_1[0])
        #print(type(Result_1[0])) # <class 'int'>
       
        db.close()

def main():
        try:
                db_connect()
        except Exception as e:
                print(e)

if __name__ == "__main__":
        main()


脚本运行的结果:
C:\Users\Administrator\Desktop>python d:\kk.py
3

C:\Users\Administrator\Desktop>





###############

被监控主机的Agent的安装可参考:Zabbix使用Agent监控Windows2012R2


修改被监控主机的Agent配置文件:
C:\Program Files\Zabbix Agent\zabbix_agentd.conf

# UnsafeUserParameters=0
修改为:
UnsafeUserParameters=1


接着插入:
UserParameter=Command_1,C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe D:\xx.py

UserParameter=Command_2,C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe D:\yy.py

UserParameter=Command_3,C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe D:\zz.py

UserParameter=Command_4,C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe D:\kk.py

如下图:(截图有省略)
图片5.png
2022-9-18 09:42



保存好配置文件后,重启Zabbix Agent服务:
图片6.png
2022-9-18 09:42



备注:这相当于在被监控主机上进行本地监控,所以被监控主机无需打开防火墙的TCP 1433端口。


######

在Zabbix服务器测试,验证能否获取被监控主机(192.168.168.133)的键值:
[root@centos8 ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.168.133 -k Command_1
ZBX_NOTSUPPORTED: Timeout while executing a shell script.
[root@centos8 ~]#

解决方法:
修改被监控主机的Agent配置文件:
C:\Program Files\Zabbix Agent\zabbix_agentd.conf
图片7.png
2022-9-18 09:43

修改为 Timeout=30
图片8.png
2022-9-18 09:43



保存好配置文件后,重启Zabbix Agent服务:
图片9.png
2022-9-18 09:43




在Zabbix服务器可以获取被监控主机(192.168.168.133)的键值了:
[root@centos8 ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.168.133 -k Command_1
46
[root@centos8 ~]#

[root@centos8 ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.168.133 -k Command_2
9
[root@centos8 ~]#

[root@centos8 ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.168.133 -k Command_3
32767
[root@centos8 ~]#

[root@centos8 ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.168.133 -k Command_4
3
[root@centos8 ~]#



##################Zabbix添加被监控主机:

配置》主机》创建主机:(主机名称无需与被监控主机的真实主机名一致;群组可以随便选;IP地址那里要输入被监控主机的IP地址;端口为10050)
图片10.png
2022-9-18 09:44

注释:
使用agent代理程序的接口。
使用 TCP 10050 端口。


主机MSSQL2014添加成功:(主机可以不用模板的)
图片11.png
2022-9-18 09:45




给“MSSQL的当前进程数”创建监控项:
自定义名称: MSSQL Command_1
键值: Command_1
信息类型: 数字(无正负)
单位: !个
图片12.png
2022-9-18 09:46

备注:其他地方保持默认,点击底下的“添加”按键。


给“MSSQL的当前连接数”创建监控项:
自定义名称: MSSQL Command_2
键值: Command_2
信息类型: 数字(无正负)
单位: !个
图片13.png
2022-9-18 09:46

备注:其他地方保持默认,点击底下的“添加”按键。


给“MSSQL的最大用户连接数”创建监控项:
自定义名称: MSSQL Command_3
键值: Command_3
信息类型: 数字(无正负)
单位: !个
图片14.png
2022-9-18 09:46

备注:其他地方保持默认,点击底下的“添加”按键。


给“表data1.dbo.table1中字段id的最大值”创建监控项:
自定义名称: MSSQL Command_4
键值: Command_4
信息类型: 数字(无正负)
图片15.png
2022-9-18 09:48

备注:其他地方保持默认,点击底下的“添加”按键。



######

给监控项“MSSQL Command_1”创建图形:
图片16.png
2022-9-18 09:49

监控项:
图片17.png
2022-9-18 09:49



给监控项“MSSQL Command_2”创建图形:
图片18.png
2022-9-18 09:49

监控项:
图片19.png
2022-9-18 09:50



给监控项“MSSQL Command_3”创建图形:
图片20.png
2022-9-18 09:50

监控项:
图片21.png
2022-9-18 09:50



给监控项“MSSQL Command_4”创建图形:
图片22.png
2022-9-18 09:50

监控项:
图片23.png
2022-9-18 09:51




######

查看图形:

监测》图形:
图片24.png
2022-9-18 09:51


图片25.png
2022-9-18 09:51


图片26.png
2022-9-18 09:52



图片27.png
2022-9-18 09:52


图片28.png
2022-9-18 09:52


图片29.png
2022-9-18 09:52



图片30.png
2022-9-18 09:52


图片31.png
2022-9-18 09:53


图片32.png
2022-9-18 09:53



图片33.png
2022-9-18 09:53


图片34.png
2022-9-18 09:53


图片35.png
2022-9-18 09:53






######

给主机MSSQL2014的监控项“MSSQL Command_4”创建一个触发器:(返回值大于5就告警)

自定义名称: ID is bigger than 5 (当前值: {ITEM.VALUE})
严重性: 一般严重
图片36.png
2022-9-18 09:54

注释: {ITEM.VALUE} 是预定义变量,即触发状态时监控项的值。

插入表达式:( 监控项 MSSQL2014: MSSQL Command_4
图片37.png
2022-9-18 09:54


自动生成的表达式:(触发器的表达式要用到监控项中的键值)
{MSSQL2014:Command_4.last()}>5
图片38.png
2022-9-18 09:54


本页拖下去:
图片39.png
2022-9-18 09:55




主机MSSQL2014的图形“MSSQL Command_4 image”会自动发生改变:
图片40.png
2022-9-18 09:55






############

先在被监控主机的表data1.dbo.table1中再插入三条记录,至此,一共有六条记录。

在被监控主机本地测试:
C:\Users\Administrator>python d:\kk.py
6

C:\Users\Administrator>


在Zabbix服务器远程测试:
[root@centos8 ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.168.133 -k Command_4
6
[root@centos8 ~]#


主机MSSQL2014的图形“MSSQL Command_4 image”中看到的效果:
图片41.png
2022-9-18 09:56

注释:图形中的数据线是从右往左延伸的。

图片42.png
2022-9-18 09:56



主机MSSQL2014的监控项“MSSQL Command_4”的返回值大于5时,仪表板会如下图显示:(显示对应触发器的名称)
ID is bigger than 5 (当前值: 6)
图片43.png
2022-9-18 09:57


图片44.png
2022-9-18 09:57






############

主机MSSQL2014的监控项“MSSQL Command_4”的返回值继续增大至8个后,在图形“MSSQL Command_4 image”中看到的效果:
图片45.png
2022-9-18 09:58


图片46.png
2022-9-18 09:58

注释:在图形中可以看到预定义变量{ITEM.VALUE}的值会随着监控项的返回值的变化而变化。


但在仪表板却没有看到预定义变量{ITEM.VALUE}的值随着监控项的返回值的变化而变化,只是一直显示当初触发状态时的值:
图片47.png
2022-9-18 09:58




############

主机MSSQL2014的监控项“MSSQL Command_4”的返回值小于或等于5个后,在仪表板的告警会自动消失:
图片48.png
2022-9-18 09:58






相关文章:
Zabbix调用Python3脚本监控Linux下的MySQL
Zabbix创建模板监控Windows下的MariaDB

Zabbix使用Agent监控Windows2012R2

Zabbix5.0.12_调用Python3脚本监控Windows下的MSSQL

返回列表