互联网故障一般表现为丢包和时延增大,持续性故障不难排查,难的是间歇性或凌晨故障,后者往往来不及等我们测试就已经恢复正常,得不到异常时的mtr无法判断故障点在哪里
故此有了根据丢包率和时延变换联动mtr的需求,丢包联动mtr在另一篇文章中有分享,今天分享下时延变化联动mtr
环境
python3.6以上版本,pip3(pip 9.0.1以上版本),mysql,pymysql库
使用zabbix自定义脚本获取线路时延丢包率不做介绍,参考上一篇zabbix文章
如果系统当前python版本是python3.5,升级3.6时有两个注意事项
1 先升级python至3.6再升级pip3否则会导致pip3无法正常使用
2 python3.5升级到3.6后需要把lsb_release.py
文件复制到python3.6的lib里,否则pip3无法正常使用
3 上两步完成后再进行pip3升级
思路
zabbix监控脚本执行完后调用restime_mtr.py把目标ip和探测结果做为参数传入
restime_mtr.py把目标ip第一次的时延结果写入数据库
第二次接收到该目标ip时延结果时从数据库取该ip上一次时延进行计算,计算结果超出允许波动范围后调用shell
shell执行mtr并记录
show_mtr进行遍历log文件夹,获取当天数据传给zabbix前端展示
mysql相关
#安装 sudo apt install mysql-server #初始化,初始化过程中需要设置密码和是否禁止远程登录(当前建议禁止) mysql_secure_installation #创建pingvalues数据库 create database pingvalues default charset utf8; #创建表 create table pingvalue(nid int not null auto_increment primary key, num int,ipaddress varchar(64) ) engine=innodb default charset=utf8;
查看表
zabbix脚本相关
#!/usr/bin/env python3 #-*-coding:utf-8-*- import pymysql,subprocess def ping_value(value,tip): value = int(value) conn = pymysql.connect(host=‘127.0.0.1‘,port = 3306,user = ‘root‘,passwd = ‘test‘, db=‘pingvalues‘,charset=‘utf8‘) coursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #筛选出此次探测ip并根据自增id列倒序,获取最后一组数据 coursor.execute(‘select num from pingvalue where ipaddress like %s order by nid desc limit 1;‘,tip) #try防止新建item从数据库select不到数据报错 try: history_value = coursor.fetchone()[‘num‘] #在此处控制波动范围 if value - history_value > 20: mtr = ‘/etc/zabbix/bin/mtr_bash %s‘%tip #满足条件调用shell,实测使用python调用系统mtr获取结果会有部分丢失,所以调用shell脚本 subprocess.Popen(mtr,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) except Exception as a: pass #写入最新数据 coursor.execute(‘insert into pingvalue(num,ipaddress) values(%s,%s)‘,(value,tip)) conn.commit()
#shell脚本 #!/usr/bin/env bash IP=$1 mtr -r -n -c 30 -w -b $IP >> /etc/zabbix/bin/log/$1-$(date +%Y-%m-%d)
#前端展示 #!/usr/bin/env python #-*-coding:utf-8-*- from time import strftime, localtime import argparse,os local_time = strftime(‘%Y-%m-%d‘,localtime()) def op(filename): with open(filename) as a: return(a.read()) #只在前端展示当天数据 if __name__ == "__main__": for i in os.listdir(‘/etc/zabbix/bin/log‘): if i[-10:] == local_time: filename = ‘/etc/zabbix/bin/log/%s‘%i print(op(filename))
测试
select * from pingvalue
item目标ip和时延结果已写入数据库
zabbix前端展示配置
页面路径monitoring----latest data相关敏感信息已打码
zabbix自定义脚本,实现线路时延波动超出允许范围时联动mtr,并前端展示mtr结果
原文:https://www.cnblogs.com/darkchen/p/14710140.html