随手写个网络通讯情况监控“微系统”

我尽量长话短说,大家能理解中心思想即可。

事件背景

公司有国际业务,现有数据中心在UCLOUD 香港,国内和香港的网络掉包严重。所以考虑换数据中心,于是要测现有国内外服务器和供选择的新数据中心的网络情况。主要测试网络时延和丢包情况。这可能有现有工具(如果你们知道请评论留言)1是我懒得去弄zabbix,zabbix应该是可以通过UserParams来收集各个节点到指定IP的网络情况。2主要是我想练一下django,试一下highchart怎么用。因为我本身web前端都不在行,平常都弄运维了。所以就有自己写这件事情。

技术思路

各个节点的服务器运行一个agent.py进行网络情况的收集,并把数据通过web api POST到web服务器上。Web服务器使用django,提供一个收集数据的api,另外提供一个简单的查询页面,把取出的数据用highchart画图。  这个逻辑很简单。最终画出的图是这样的:

开发前的环境部署:

Server: ubuntu,django 1.8 ,python 2.7

技术关键点

我们从agent到web数据收集,到图形展示的顺序来讲:

1、agent数据收集,上传。2、服务器接口设计  3、服务器页面展示  4、nginx+uwsgi部署

1、  agent收集&上传数据

数据收集策略:通过ping –n –c 60  ip 然后获取最终的数据,min/max/avg  loss , ping 60个包约1分钟。即客户端1分钟取一个数据点,并上传给服务端。

以下是agent.py的内容(很粗略,Python刚入门)


import re,urllib2,urllib,datetime

import subprocess,json,time,sys

sourceip = "localip"

dest = sys.argv[1]

postapi = http://serverip/getping

#获取ping的数据并把数据post到指定的服务器api里面,主要通过urllib2来实现。

def Curlpost(web,data):

values =urllib.urlencode(data)

req =urllib2.Request(web,values)

response =urllib2.urlopen(req)

result =response.read()

#通过ping来获取具体的网络监测情况。Subprocess的作用是新建一个进程来执行我们提供的命令。然后把进行的输出重定向到PIPE,具体的建议大家自己到网络上去搜。然后从获取的输出out中读取我们需要的东西。这个步骤通过re(正则)模块来完成,具体的功能同样建议到网络搜索。主要功能是通过正则表达式来匹配出我们需要的内容如匹配数字123.123 \d+\.\d+ ,我比较少使用正则一些复杂的不会使用。(如果有人有去测试的话,有比较好的匹配方法,请留言)

def getpingdata():

try:

ping = subprocess.Popen(["ping", "-n", "-c60", dest], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

out, error = ping.communicate()

if out:

data={}

#通过re,正则来匹配出我们想要的内容。以后的data[]=m[x] 就是取出具体的哪些数据。

m=re.findall(r"\d+\.\d+",out)

a=re.findall(r"\d+\%",out)

data[‘min‘]=m[-4]

data[‘avg‘]=m[-3]

data[‘max‘]=m[-2]

data[‘loss‘]=a[0].split(‘%‘)[0]

#此处获取当时的时间搓,并通过time生成当天的日期和时间,这三个数据都会存放在服务器上。

t=time.time()

data[‘time‘]=t

data[‘day‘]=time.strftime("%Y-%m-%d",time.localtime(t))

data[‘hour‘]=time.strftime("%H:%M:%S",time.localtime(t))

#存储源IP和目标IP

data[‘destip‘]=dest

data[‘sourceip‘]=sourceip

#所有需要的数据都装到data{}里面了。

returndata

else:

print ‘Noping‘

except:

print "no data"

#无限循环来进行获取,提交数据。

while 1:

data = getpingdata()

Curlpost(postapi,data)

2、  服务器接口设计

服务器端通过django实现,数据存在MySQL中。

2.1环境准备

#apt-get install python-dev python-MysqlDB  django

#wget https://www.djangoproject.com/download/1.8.7/tarball/

# tar –zxvf  Django-1.8.7.tar.gz

#cd  django-1.8.7

#pythonsetup.py install

#可能需要安装setuptools

#Python

> import django  #测试django已经安装完成

#说明这里django我是跟着官文一步一步跟着学习,实践它本身的例子。所以这里的app和官文一样用polls,我也懒得换。

#创建djnago项目

#cd /data

#django-admin startproject dos  #会帮我们自动穿件一个dos目录。

#创建app

#django-adminstartapp polls

接下来要做的步骤是,设置数据库连接参数,同步数据库,测试django是否可以运行,在setting配置静态模模板template路劲,激活polls app 。

#设置数据库连接  编辑setting.py

#在INSTALLED_APPS 添加polls

静态模板设置:

数据库设置:

#进行数据库同步

#cd /data/dos/

#python manage.py makemigrations

#python manage.py migrate

#以上两部完成后django会自动帮我们创建出相应的一些初始化的表,可以在库中看到。

以上基本的环境准备完毕,开始设计我们的数据存储的表(model)和我们具体的接口(view)

#如果大家对django不熟悉,就阅读下文档。https://docs.djangoproject.com/en/1.8/  这个有几个part,总的6的看完就可以写。

2.2 服务端接受数据的接口设计:

数据表model.py 

#这些字段都很好理解,IP,ping的数据,agent数据的采集时间点。(分为日期,时间,时间戳)具体出现的datatime,time大家自行实践都能明白。


class PingData(models.Model):

sourceip = models.IPAddressField(null=True)

destip = models.IPAddressField(null=True)

min = models.FloatField(default=1)

max = models.FloatField(default=1)

avg = models.FloatField(default=1)

loss = models.IntegerField(default=0)

day = models.CharField(null=True,max_length=50,default=datetime.datetime.now().strftime("%Y-%m-%d"))

hour =models.CharField(null=True,max_length=50,default=datetime.datetime.now().strftime("%H:%M:%S"))

time = models.FloatField(null=True,default=time.time())

接受数据的接口views.py,这样我们的客户端上传上来的数据就已经能够存到数据库中了。


@csrf_exempt

def getpingdata(request):

if request.method == ‘POST‘:

data=request.POST

datamode =PingData(min=float(data[‘min‘]),max=float(data[‘max‘]),avg=float(data[‘avg‘]),sourceip=str(data[‘sourceip‘]),destip=str(data[‘destip‘]),loss=int(data[‘loss‘]),day=str(data[‘day‘]),hour=str(data[‘hour‘]),time=float(data[‘time‘]))

datamode.save()

return HttpResponse("OK")

3、服务器页面展示

前端页面用bootstrap简单的做了个,通过ajax来请求后端web的接口然后在前端页面进行highchart画图。

3.1 jquery获取前端页面的数据,通过ajax POST给后端的api接口,其中我用了一个bootstrap的时间插件,这个插件用法可以自行查看文档。http://www.htmleaf.com/jQuery/Calendar-Date-Time-picker/201503041458.html

设定时间插件的显示格式

<script type="text/javascript">

$(function () {

$(‘#datetimepicker1‘).datetimepicker({

locale: ‘ru‘,

format:‘YYYY-MM-DD HH:m:s‘

});

$(‘#datetimepicker2‘).datetimepicker({

locale: ‘ru‘,

format:‘YYYY-MM-DD HH:m:s‘

});

});

</script>

3.2 通过jQuery+ajax+highcha来完成前端页面数据的获取提交,并从服务端请求数据,完成highchart的展示

timejs.html:


<div>

<form>

<div>

<label for="sourceip">Source IP</label>

<input type="text"id="sourceip" placeholder="eg:192.168.1.1" >

</div>

<div>

<labelfor="destip">Dest IP</label>

<input type="text"id="destip" placeholder="eg:192.168.1.1" >

</div>

<div>

<label for="starttime">Start time</label>

<div class=‘input-group date‘ id=‘datetimepicker1‘>

<input type=‘text‘class="form-control" id="starttime"name="time"  />

<spanclass="input-group-addon"><span></span></span>

</div>

</div>

<div>

<label for="endtime">End time</label>

<div class=‘input-group date‘ id=‘datetimepicker2‘>

<input type=‘text‘class="form-control" id="endtime"name="time"  />

<spanclass="input-group-addon"><span></span></span>

</div>

</div>

<button type="button" id="Goquery"class="btn  btn-primarybtn-sm">查询</button>

</form>

</div>

<div>

<div id="container1"style="min-width:800px;height:400px"></div>

<div id="container2"style="min-width:800px;height:400px"></div>

</div>

#  定义两个highchart对象.

Highchart的话请参考此链接http://blog.csdn.net/splendid_java/article/details/9186681

<script>

在图中对应的是上方的图

function showMscChart(hour,max,min,avg){

$(‘#container1‘).highcharts({

chart: {

type: ‘line‘,

},

title: {

text: ‘Network Responce‘

},

xAxis: {

type:‘datetime‘,

categories: hour  #这边标示x坐标轴,我们通过参数hour来自定义

},

yAxis: {

title: {

text: ‘Network responce:ms‘

}

},

plotOptions: {

line: {

dataLabels: {

enabled: true

},

enableMouseTracking: false

}

},

#series是具体需要显示的数据。我们同样通过传参来进行赋值。

series: [{

name: ‘max‘,

data: max

}, {

name: ‘min‘,

data: min

}, {

name: ‘avg‘,

data: avg

}]

});

}

#在显示的图中对应的是下方的图

function showLossChart(hour,loss){

$(‘#container2‘).highcharts({

chart: {

type: ‘line‘,

},

title: {

text: ‘Network responce‘

},

xAxis: {

type:‘datetime‘,

categories: hour

},

yAxis: {

title: {

text: ‘Network loss:%‘

}

},

plotOptions: {

line: {

dataLabels: {

enabled: true

},

enableMouseTracking: false

}

},

series: [{

name: ‘loss‘,

data: loss

},]

});

}

</script>

#当我们按查询的时候会触发这段js代码:(js代码更是现搜现用,忘大家帮改善)


<script>

$("#Goquery").on("click",function(){

#从我们前端html页面中获取数据。

var Qureydata = {}

Qureydata[‘starttime‘]=$(‘#datetimepicker1‘).data()[‘date‘]

Qureydata[‘endtime‘]=$(‘#datetimepicker2‘).data()[‘date‘]

Qureydata[‘sourceip‘]=$("#sourceip").val()

Qureydata[‘destip‘]=$("#destip").val()

//console.log(Qureydata)

$.ajax({

type:"POST",

url:"testping",  #我们要提交的api接口的url

dataType:"json",

data:Qureydata,   #我们提交的数据

success:function(data){

console.log(data)

$.each(data,function(item,i){

if (item =="max"){max=i }

if (item=="min"){min=i}

if (item=="hour"){hour=i}

if(item=="avg"){avg=i}

if(item=="loss"){loss=i}

})

#进行具体的highchart的实例化。

showMscChart(hour,max,min,avg)

showLossChart(hour,loss)

},

})

})

</script>

基本上到此所有的功能就基本上都实现了。

4、部署Nginx+uwsgi

参考http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html官网

或者自强学堂的部署文档也是很详尽简单,再次不多累述

时间: 2024-10-04 03:27:03

随手写个网络通讯情况监控“微系统”的相关文章

搭建Ntopng监控网络流量情况

ntopng是高速的基于Web的流量分析与集流工具.ntopng是ntop的新一代版本,官方原先版本的ntop已经不再更新.用户可以使用网页浏览器浏览查看网络中的流量信息,从而分析网络瓶颈. 1. 环境描述: 本文使用操作系统CentOS6.4-64bit,采用源码(Source code)的方式安装,本文使用ntop-1.1版本,ntopng下载地址:ntopng下载 http://www.ntop.org/get-started/download/. 2.安装依赖 rpm -ivh epel

CentOS6.5下使用NetHogs监控进程网络使用情况

Nethogs 是一个终端下的网络流量监控工具,它的特别之处在于可以显示每个进程的带宽占用情况,这样可以更直观获取网络使用情况.它支持 IPv4 和 IPv6 协议.支持本地网卡及 PPP 链接. 下载: 从SourceForge上下载nethogs-0.8.0.tar.gz 使用wget下载: wget http://sourceforge.net/projects/nethogs/files/nethogs/0.8/nethogs-0.8.0.tar.gz/download 安装: 安装之前

Linux服务器利用Nethogs监控每个进程的网络使用情况

Nethogs是一款开源的网络流量监控工具,它可以显示每个进程的带宽占用情况,这样可以更直观获取网络使用情况.Nethogs支持IPv4和IPv6协议.支持本地网卡及PPP链接. 其中,PID列显示程序的进程号,USER列显示程序的所属用户,PROGRAM列显示程序的具体名称,DEV列提示当前监控的设备(eth0),Sent列显示程序发送请求的流量,Received列显示程序接收请求的流量 用户可以通过ifconfig核实具体哪个设备(eth1.eth0)对应公网网卡.以eth1对应公网网卡为例

使用NetHogs监控进程网络使用情况

Nethogs 是一个终端下的网络流量监控工具,它的特别之处在于可以显示每个进程的带宽占用情况,这样可以更直观获取网络使用情况.它支持 IPv4 和 IPv6 协议.支持本地网卡及 PPP 链接. 使用wget下载: wget http://sourceforge.net/projects/nethogs/files/nethogs/0.8/nethogs-0.8.0.tar.gz/download 安装: yum install  ncurses*  libpcap-dev libncurse

[转] C#.Net Socket网络通讯编程总结

1.理解socket1).Socket接口是TCP/IP网络的应用程序接口(API).Socket接口定义了许多函数和例程,程序员可以用它们来开发TCP/IP网络应用程序.Socket可以看成是网络通信上的一个端点,也就是说,网络通信包括两台主机或两个进程,通过网络传递它们之间的数据.为了进行网络通信,程序在网络对话的每一端都需要一个Socket. 2).TCP/IP传输层使用协议端口将数据传送给一台主机的特定应用程序,从网络的观点看,协议端口是一个应用程序的进程地址.当传输层模块的网络软件模块

《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 注:ServerSuperIO有可能被移植到Windows 10 IOT上,那么将来有可能开发一套设备驱动,可以支行在服务端.嵌入式设备中,将形成完整的解决方案.       现在已经调试通过部分代码,还得需要一段时间,一般都是晚上干,时间也有限.如下图: 目       录 4.如开发一套设备驱动,同时支持串口和网络通讯... 2 4.1           概述... 2 4.2          

个人第一个开源分布式项目distributeTemplate的实现三 网络通讯netty传输大文件

今天 我将讲讲网络通讯,这里我初始版本 由于采用的事Netty框架  所以 这里讲网络Netty在我们这里是怎么使用的,下周开始添加rpc lucene内容了 实现之后的0.2 0.3版本,后面将会去掉netty依赖 采用原生的NIO2 (aio) 异步非阻塞方式 实现自己网络通讯,也就是说 这部分可能会实现一个简单的但是比netty精简高效的网络框架,后期做出来 可能会单独开一个分支开源出来,netty说白了 就是 事件驱动 以及 NIO 加一些协议 以及 异常 处理,废话不多说了. 我最近

【通讯协议】动手解剖《中华人民共和国环境保护行业标准(HJ/T 212-2005):污染源在线自动监控(监测)系统数据传输标准》

记得几年前,看到<中华人民共和国环境保护行业标准(HJ/T 212-2005):污染源在线自动监控(监测)系统数据传输标准> 这个协议,当时看的头都大了,最终没有下手去设计支持他.直到最近,客户说:你们VOC仪器不错啊,要是能支持HJ212传输协议就好了... 头脑出现当年阅读那个协议时的纠结,如今居然真的有客户想要我支持这个麻烦的协议,没办法,必须的做啊,也许做出来还是独家呢?哈哈 令我惊喜的是这次读这篇传输协议标准,我居然很容易就懂了,觉得其实这个协议挺简单的,而且写的还不错,面面俱到.

Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)

最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/View是他认为Qt中最不好的一部分了.真的是这样吗?为了回馈开源社区,我写了这篇blog,写的是我认为比较有价值的东东.题目起得是解析,但也没有特别细节的介绍,点到为止,有兴趣的Tx可以继续讨论.我所看的资料有<C++ GUI Programming with Qt 4, Second Edition