zabbix最重要的五个组成部分:Item、Trigger、Action、Media、User(其实应该还有个Event,不过这个表现的不直观),翻译一下就是监控元素、触发器、动作、报警介质、用户 item监控采集的项目,如agent端的cpu、内存等,但是更加具体的来说,比如cpu使用率,或者是cpu某个核的使用率或者是cpu的空闲率,item应该是这样一个十分具体的项 Trigger顾名思义触发器,也就是将采集来的item值进行一定的判断,需要注意的点有两个,一个是serverity,即报警等级,还有一个是判断的逻辑,判断逻辑分单机判断和触发依赖 action就是server对事件响应(Event)需要做相应的措施了,关键点是四个,一是如何触发action,二是action具体使用什么方式,三是发送的内容,四是动作的对象。action支持的Event有四种:Trigger触发时、discover rule文件生效时、自动发现新服务器时以及server本身出问题时。最主要的就是Trigger触发来产生action。Media即action使用的媒介。包括发送邮件,即使通讯(jabber等),执行脚本,
配置监控的流程大致可分为
创建主机组创建主机创建监控项创建触发器创建告警动作创建test组 添加host 100 添加监控项(item)(这里是监视/etc/passwd文件是否变化)
添加触发器
之后在客户机上随意添加用户,会在监控栏(monitor)的问题(problem)看到通知
但是这个通告仅会存在30s(一次刷新时间),因为上面设置的触发器只检测最新的和上一次的数据,所以passwd文件变更但又稳定后告警就消失了。 为了不错过告警,我们还需要设置告警动作。这里采用的是发邮件。服务端主机一定要装mailx。 在管理(administration)的媒介(media)设置 然后选择一个用户(user),在其报警媒介栏添加
修改客户机的passwd文件,然后可以在邮箱收到邮件 稍等一会报警结束后还会再来一封告知报警结束的邮件
这里使用zabbix监控mysql主从
先搭建好mysql主从,192.168.161.200为从,192.168.161.110为主。
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.161.110 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 194 Relay_Log_File: mysql-relay-bin.000006 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes .......配置192.168.161.200的zabbix_agentd,添加用户自定义key
[root@ashen1 ~]# vim /usr/local/etc/zabbix_agentd.conf ..... ### Option: UnsafeUserParameters # Allow all characters to be passed in arguments to user-defined parameters. # The following characters are not allowed: # \ ' " ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @ # Additionally, newline characters are not allowed. # 0 - do not allow # 1 - allow # # Mandatory: no # Range: 0-1 # Default: UnsafeUserParameters=1 //将这行的注释取消并设为1 ..... # TLSPSKFile= //在文件末尾添加 UserParameter=ckmysqlms,mysql -e "show slave status\G" | grep "Running" |awk '{print $NF}' | grep -c "Yes" //查看从数据库的IO线程和SQL线程是否均正常运行来确定主从是否正常 [root@ashen1 ~]# pkill zabbix [root@ashen1 ~]# zabbix_agentd //重启服务 //在zabbix服务端确认key是否可用 [root@zabbix ~]# zabbix_get -s 192.168.161.200 -k ckmysqlms 2添加监控项
手动关闭主从观察效果
mysql> stop slave; Query OK, 0 rows affected (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.04 sec)图形效果 也收到了报警邮件 监控mysql主从的延迟,与上面的步骤相同,这次过滤"Seconds_Behind_Master"词条
[root@ashen1 ~]# vim /usr/local/etc/zabbix_agentd.conf UserParameter=mysql.delay,mysql -e "show slave status\G" 2>/dev/null|egrep 'Seconds_Behind_Master'|awk '{print $2}' [root@zabbix ~]# zabbix_get -s 192.168.161.200 -k mysql.delay 0zabbix的web操作略 脚本插入100w条数据的效果
注:监控日志用shell脚本难以实现记录之前已经看过的日志,为了解决这个问题,我们用python来监控
编写Python程序,可以点击查看 说明:第一个参数为日志文件名(必须有,相对路径、绝对路径均可) 第二个参数为“记录之前所看位置”的文件路径(可选项,若不设置则默认为/tmp/logseek文件。相对路径、绝对路径均可) 第三个参数为搜索关键字,默认为 Error #放脚本路径和上一个例子一样,如果不做上一个例子,自行创建目录,更改属主属组
vim /scripts/log.py #!/usr/bin/env python3 import sys import re def prePos(seekfile): global curpos try: cf = open(seekfile) except IOError: curpos = 0 return curpos except FileNotFoundError: curpos = 0 return curpos else: try: curpos = int(cf.readline().strip()) except ValueError: curpos = 0 cf.close() return curpos cf.close() return curpos def lastPos(filename): with open(filename) as lfile: if lfile.readline(): lfile.seek(0,2) else: return 0 lastPos = lfile.tell() return lastPos def getSeekFile(): try: seekfile = sys.argv[2] except IndexError: seekfile = '/tmp/logseek' return seekfile def getKey(): try: tagKey = str(sys.argv[3]) except IndexError: tagKey = 'Error' return tagKey def getResult(filename,seekfile,tagkey): destPos = prePos(seekfile) curPos = lastPos(filename) if curPos < destPos: curpos = 0 try: f = open(filename) except IOError: print('Could not open file: %s' % filename) except FileNotFoundError: print('Could not open file: %s' % filename) else: f.seek(destPos) while curPos != 0 and f.tell() < curPos: rresult = f.readline().strip() global result if re.search(tagkey, rresult): result = 1 break else: result = 0 with open(seekfile,'w') as sf: sf.write(str(curPos)) finally: f.close() return result if __name__ == "__main__": result = 0 curpos = 0 tagkey = getKey() seekfile = getSeekFile() result = getResult(sys.argv[1],seekfile,tagkey) print(result) [root@yh ~]# chmod +x /scripts/log.py [root@yh ~]# chown zabbix.zabbix log.py #修改客户端/usr/locla/etc/zabbix_agentd.conf文件 UnsafeUserParameters=1 UserParameter=ck_log[*],/usr/bin/python /scripts/log.py $1 $2 $3 #创建日志文件(有,则不需要创建),创建存放读取记录的目录并设置属主和属组为zabbix cat >> /tmp/zabbix_agentd.log << EOF sklfs sfkfnkslf error errorksdm Error failed failed qwszc EOF #重新启动服务 [root@yh ~]# pkill zabbix [root@yh ~]# zabbix_agentd #在服务端手动执行脚本 [root@zabbix ~]# zabbix_get -s 192.168.19.128 -k ck_log[/tmp/zabbix_agentd.log,/tmp/qwszc,failed] 1