背景

  目前国内各家云联网跨区域数据传输,会将数据流通过哈希运算负载到不同的底层链路上,而底层链路质量差异较大,这种情况导致的现象就是,使用传统的icmp监控线路正常,但是业务一直不稳定,所以才有了使用TCP监控的需求

  使用TCP测试链路质量各RS厂商都有类似的功能,如RPM,NQA等,但缺陷是不能进行绘图,不能准确掌握线路整个周期内的质量,所以考虑使用zabbix自定义脚本来实现TCP监控

zabbix-tcpping脚本如下

#!/usr/bin/env python3
#-*-coding:utf-8-*-
import os,sys,subprocess
import re,datetime,time
import logging,argparse dir_path = os.path.dirname(os.path.abspath(__file__))
tcp_line = dir_path + '/tcping.py {0} {1} 20 '
ping_type = {'tcp':tcp_line} log_name = dir_path + '/log/' + time.strftime('%Y-%m-%d',time.localtime()) + '.log'
def logger():
logger = logging.getLogger()
fh = logging.FileHandler(log_name)
formater = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formater)
logger.setLevel(logging.DEBUG)
logger.addHandler(fh)
return logger
logger = logger() def value(type,value_type,dip,dport):
cmd_line = type.format(dip,dport)
res = subprocess.Popen(cmd_line,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()
# return(res[0]) #python2中使用
return(str(res[0],'utf8'))
def get_value(item,res):
res_value = {'pkloss':'100','restime':'0'}
value_cache = re.findall('\d+%',res)[0]
res_value['pkloss'] = re.findall('\d*',value_cache)[0]
restime_cache = re.findall('\d+[.]\d+\s',res)
if item == 'restime':
count = len(restime_cache)
first = 0
for x in restime_cache:
x = float(x)
first+=x
res_value['restime'] = round(float((first/count)),1)
logger.info('%s:%s'%(item,round(float(res_value[item]),1)))
return(round(float(res_value[item]),1)) def main(type,value_type,dip,dport):
s = value(ping_type[type],value_type,dip,dport)
print(get_value(value_type,s)) if __name__ == "__main__":
parser = argparse.ArgumentParser(description='tcp for monitor')
parser.add_argument('-T',action='store', dest='ping_type',default='tcp')
parser.add_argument('-t',action = 'store',dest='tip')
parser.add_argument('-p',action='store',dest='dport')
parser.add_argument('-i',action='store',dest='item')
args= parser.parse_args() type = args.ping_type
tip = args.tip
dport = args.dport
item = args.item main(type,item,tip,dport)

脚本使用方法

$ python3 zabbixtcp.py -T tcp -t 8.8.8.8 -p 53 -i restime
35.5$ python3 zabbixtcp.py -T tcp -t 8.8.8.8 -p 53 -i pkloss
0.0

zabbix配置

编辑zabbix-agent配置文件,允许使用自定义脚本并添加key
vi /etc/zabbix/zabbix_agentd.conf UnsafeUserParameters=1 UserParameter=tcp_loss[*],/etc/zabbix/monitor/tcploss.py -T tcp -t $1 -p $2 -i pkloss
UserParameter=tcp_restime[*],/etc/zabbix/monitor/tcploss.py -T tcp -t $1 -p $2 -i restime

zabbix前端页面添加item

添加graphs

等待一段时间就可以看到图像了

后端log如下

后续需求,当线路丢包率超过10%时自动执行mtr并保存记录,实现很简单,加一段if语句执行一段shell就行,代码如下(只适用于linux)

    if item =='pkloss' and 100 > round(float(res_value[item]),1)  > 9:
global tip
mtr = '/etc/zabbix/bin/mtr_bash %s'%tip
subprocess.Popen(mtr,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

shell如下

#!/usr/bin/env bash
IP=$1
mtr -r -n -c 30 -w -b $IP >> /etc/zabbix/bin/log/$1-$(date +%Y-%m-%d)

手动触发下看看效果

代码中使用的tcping.py文件下载链接

https://github.com/yantisj/tcpping/blob/master/tcpping.py

2021-04-16

基于原始代码增加指定源ip功能,

#!/usr/bin/env python3
"""
TCP Ping Test (defaults to port 80, 10000 packets)
Usage: ./tcpping.py host [port] [maxCount]
- Ctrl-C Exits with Results
""" import sys
import socket
import time
import signal
from timeit import default_timer as timer host = None
port = 80 maxCount = 10000
count = 0 try:
sip = sys.argv[1]
except IndexError:
print("Usage: tcpping.py host [port] [maxCount]")
sys.exit(1) try:
host = sys.argv[2]
except IndexError:
print("Usage: tcpping.py host [port] [maxCount]")
sys.exit(1) try:
port = int(sys.argv[3])
except ValueError:
print("Error: Port Must be Integer:", sys.argv[4])
sys.exit(1)
except IndexError:
pass try:
maxCount = int(sys.argv[4])
except ValueError:
print("Error: Max Count Value Must be Integer", sys.argv[4])
sys.exit(1)
except IndexError:
pass passed = 0
failed = 0 def getResults():
""" Summarize Results """ lRate = 0
if failed != 0:
lRate = failed / (count) * 100
lRate = "%.2f" % lRate print("\nTCP Ping Results: Connections (Total/Pass/Fail): [{:}/{:}/{:}] (Failed: {:}%)".format((count), passed, failed, str(lRate))) def signal_handler(signal, frame):
""" Catch Ctrl-C and Exit """
getResults()
sys.exit(0) signal.signal(signal.SIGINT, signal_handler) while count < maxCount: count += 1 success = False s = socket.socket(
socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) s_start = timer() try:
s.bind((sip,0))
s.connect((host, int(port)))
s.shutdown(socket.SHUT_RD)
success = True except socket.timeout:
print("Connection timed out!")
failed += 1
except OSError as e:
print("OS Error:", e)
failed += 1 s_stop = timer()
s_runtime = "%.2f" % (1000 * (s_stop - s_start)) if success:
print("Connected to %s[%s]: tcp_seq=%s time=%s ms" % (host, port, (count-1), s_runtime))
passed += 1 if count < maxCount:
time.sleep(1) getResults()

适配以上代码zabbix脚本需要做以下变更

#!/usr/bin/env python3
#-*-coding:utf-8-*-
import os,sys,subprocess
import re,random,datetime,time
import logging,argparse dir_path = os.path.dirname(os.path.abspath(__file__))
tcp_line = dir_path + '/tcping.py {0} {1} {2} 10 '
ping_type = {'tcp':tcp_line} log_name = dir_path + '/log/' + time.strftime('%Y-%m-%d',time.localtime()) + '.log'
def logger():
logger = logging.getLogger()
fh = logging.FileHandler(log_name)
formater = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formater)
logger.setLevel(logging.DEBUG)
logger.addHandler(fh)
return logger
logger = logger() def value(type,value_type,sip,dip,dport):
cmd_line = type.format(sip,dip,dport)
res = subprocess.Popen(cmd_line,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()
# return(res[0]) #python2中使用
return(str(res[0],'utf8'))
def get_value(item,res):
res_value = {'pkloss':'100','restime':'0'}
value_cache = re.findall('\d+%',res)[0]
res_value['pkloss'] = re.findall('\d*',value_cache)[0]
restime_cache = re.findall('\d+[.]\d+\s',res)
if item == 'restime':
count = len(restime_cache)
first = 0
for x in restime_cache:
x = float(x)
first+=x
res_value['restime'] = round(float((first/count)),1)
logger.info('%s:%s'%(item,round(float(res_value[item]),1)))
return(round(float(res_value[item]),1)) def main(type,value_type,sip,dip,dport):
s = value(ping_type[type],value_type,sip,dip,dport)
print(get_value(value_type,s)) if __name__ == "__main__":
parser = argparse.ArgumentParser(description='tcp for monitor')
parser.add_argument('-T',action='store', dest='ping_type',default='tcp')
parser.add_argument('-s',action = 'store',dest='sip')
parser.add_argument('-t',action = 'store',dest='tip')
parser.add_argument('-p',action='store',dest='dport')
parser.add_argument('-i',action='store',dest='item')
args= parser.parse_args() type = args.ping_type
sip = args.sip
tip = args.tip
dport = args.dport
item = args.item main(type,item,sip,tip,dport)

  zabbix 定义key

UserParameter=tcp_pkloss[*],/etc/zabbix/monitor/tcploss.py -T tcp  -s $1 -t $2  -p $3  -i pkloss
UserParameter=tcp_restime[*],/etc/zabbix/monitor/tcploss.py -T tcp -s $1 -t $2 -p $3 -i restime

使用python脚本+zabbix前端监控云联网底层TCP数据流所负载的链路质量,并在丢包时联动保存MTR记录的更多相关文章

  1. 使用shell+python脚本实现系统监控并发送邮件

    1.编辑shell脚本 [root@web03 ~/monitor_scripts]# cat inspect.sh #!/bin/bash # 设置磁盘的阀值 disk_max=90 # 设置监控i ...

  2. Python脚本收集腾讯云CDN日志,并入ELK日志分析

    负责搭建公司日志分析,一直想把CDN日志也放入到日志分析,前些日志终于达成所愿,现在贴出具体做法: 1.收集日志 腾讯云CDN日志一般一小时刷新一次,也就是说当前只能下载一小时之前的日志数据,但据本人 ...

  3. 使用python脚本批量删除阿里云oss中的mp4文件

    #encoding:utf-8 ''' oss中有一些mp4文件需要删除,首先定位出这些文件放在txt文本中 然后通过python操作oss进行批量删除 ''' import oss2 auth = ...

  4. 使用python脚本配置zabbix发送报警邮件

    #前提得在zabbix_server配置文件中配置触发脚本的目录,例如,我配置的在/usr/local/zabbix/server/scripts目录下 编写python脚本如下 因为我的服务器在腾讯 ...

  5. 计算python脚本的运行时间

    首先说一下我遇到的坑,生产上遇到的问题,我调度Python脚本执行并监控这个进程,python脚本运行时间远远大于python脚本中自己统计的程序执行时间. 监控python脚本执行的时间是36个小时 ...

  6. 通过python脚本和zabbix配合监控zookeeper的节点数

    通过python脚本和zabbix配合监控zookeeper的节点数 需求描述: 在日常zabbix监控zookeeper的时候,无法通过shell来获取zookeeper的具体节点信息,没有开放具体 ...

  7. zabbix 调用python脚本监控 磁盘剩余空间(创建模版,创建监控项,创建触发器)

    主要 记录一下  使用zabbix 自己创建模版.监控项.触发器,并调用python脚本. 需求: 监控备份机磁盘剩余空间(windows系统) 一.安装zabbix_agent 比较简单 修改配置文 ...

  8. zabbix增加手机短信、邮件监控的注意要点,SSL邮件发送python脚本

    1.短信接口文档: URL http://xxx.com/interfaces/sendMsg.htm Method POST Description 文字短信调用接口 Request Param L ...

  9. 阿里云zabbix的python脚本

    由于阿里云只能用465端口.所以这个zabbix的脚本修改成了465端口的python脚本. 修改于https://www.jianshu.com/p/9d6941dabb47 #!/usr/bin/ ...

随机推荐

  1. MySQL怎么用命令修改字段长度

    MySQL怎么用命令修改double字段长度 1 alter table 表名 modify column 列名 类型(要修改的长度) COMMENT 备注信息; 2 alter table t_ov ...

  2. 巧用CSS3:target 伪类制作Dropdown下拉菜单(无JS)

    原文链接:http://devework.com/css3-target-dropdown.html :target 是CSS3 中新增的一个伪类,用以匹配当前页面的URI中某个标志符的目标元素(比如 ...

  3. js中DOM事件探究

    事件 纲要 理解事件流 使用事件处理程序 不同的事件类型 javascript和html的交互是通过事件实现的.事件就是文档或浏览器窗口发生的一些特定交互瞬间.可以使用侦听器(事件处理程序)预定事件, ...

  4. 【weex开发】vue-swipe 滑动组件的使用

    一,vue-swipe简介 vue-swipe 是饿了么团队开发的vue专用的轮播图插件: 可以实现简单的图片和view轮播,可控制动画时长,可限制手动滑动: 简而言之,可以实现轮播,也可以实现ppt ...

  5. Python Django项目日志查询系统

    该项目适合中小型公司日志查询工作.大型公司可以使用elk等.该系统其实就是调用了absible命令去查日志,然后把输出的信息输到页面查看. 日志查询系统 维护手册 作者:陈土锋 日期:2020年6月1 ...

  6. 设计模式学习笔记(十六)迭代器模式及其在Java 容器中的应用

    迭代器(Iterator)模式,也叫做游标(Cursor)模式.我们知道,在Java 容器中,为了提高容器遍历的方便性,把遍历逻辑从不同类型的集合类中抽取出来,避免向外部暴露集合容器的内部结构. 一. ...

  7. 如何查看k8s相关日志

    一.看系统日志cat /var/log/messages 二.用 kubectl 查看日志 # 注意:使用Kubelet describe 查看日志,一定要带上 命名空间,否则会报如下错误[root@ ...

  8. Hyperledger Fabric定制联盟链网络工程实践

    总体来看,网络上成体系的可用的 Fabric 教程极少--不是直接在 Fabric 官网复制内容大谈基础理论就是在描述一个几乎无法复现的项目实践,以至于学习 Fabric 的效率极低,印象最深刻的就是 ...

  9. RTSP可用网络流

    推荐个音视频学习的网站 https://www.zzsin.com,里面有音视频学习资料和测试视频提供下载B站搜乔红 rtsp://wowzaec2demo.streamlock.net/vod/mp ...

  10. 面试官:ZAB协议是什么?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 这天是越来越热了,但是还是有很多 ...