特别是以下这个光头哥就像在控制着全部的流量,多潇洒!
(当然不是做运维做到没头发滴。。。哈哈)
这个画风在外行人看来,还是颇有傲娇范的。(反正你不懂,看起来就是高大上)
灵感源于“看电视”
随着我们网络和流量越来越复杂,对外的情况越来越多,在网络报障时候,从最原始的ping和mtr情况到smokeping、cacti监控,然后到zabbix监控图,虽然一直在进步,但始终感觉不够专业。
怎么做的更专业点呢,过年时候看到央视新闻联播的“据”说过年,春节期间的迁徙地图,有点焕然一新的感觉:
灵感来了!
我们虽然没有那么多显示器,但是内容还是可以做好的。我们从软实力来开始装饰我们的监控图,为什么是说“装饰”呢,我们现在大部分依赖的是zabbix监控网络流量和服务器情况,自建机房间监控系统来监控网络间质量,这两个系统的优点是又快又准,我们这次是把成果进行可视化,来“装饰”一下。
我们的机房遍布全国,同时面对全国玩家,该怎么把全国的网络质量情况尽收眼底呢?经过多年的技术沉淀,我们不再纠结监控方案用开源的还是商用的,打算自己来开发。
这个效果得感谢新闻联播“’据’说中国”给的灵感了,先来一个动态效果图
用的是百度echarts的模拟迁徙效果,度娘这次挺赞的,这个插件感觉很不错,参考地址:http://echarts.baidu.com/echarts2/doc/doc.html
我们是用python做的后端,下面简单记录下开发时候碰到的一些细节问题供大家参考。
tooltip : {
trigger: 'item',
formatter: function (params){
var r="";
if(params.value == 1){
var r="ping正常";
}
return params.name + '<br/>'+r
}
2、dataRange里面用splitList字段分了3个等级,我们的参考值:
splitList: [
{start: 90, label: '严重(loss=>18% or ms =>150)'},
{start: 40, end: 60, label: '警告(10%<loss<18% or 80<ms<150)', color: 'orange'},
{end: 10,label:'正常(loss<=10% and ms <= 80ms)'}
],
color: ['#ff3333', 'orange', 'yellow','lime','#51D645'],
3、series里面提供的data是我们后端提供的,原始数据是由各个机房的fping汇总得来的。
4、series里面的geoCoord是通过百度地图提供的坐标来定义。
这个效果做出来之后,在对外的时候可以非常形象的体现出网络具体情况。
Map监控可以代表当地省份玩家访问我们的游戏(机房)是否有问题,从而不用无头苍蝇一样的去定位问题。
重点在于如何去采集各个省份可靠和稳定的IP,我们这里结合很多种方法来采集,最大限度避免IP缺少或者不稳定的情况
上图是一个采集的样本,从图中可以看到分为手动和自动,自动代表脚本采集,手动代表人为填充,自动的方法如下:
Zabbix比较简单相信大家都有用,自身默认就带有“筛选”界面,在那里添加我们需要的图到一个大页面即可。在组态->筛选界面即可进行管理,这里有个技巧,手工来汇总肯定是特别麻烦,可以先创建个模版,然后汇出所选的,然后在导出的xml文件里面进行shell批量处理即可。
另外也可以安装Zatree这个插件,会自动进行监控图的汇总。
Zabbix装饰出来的样子大概就可以分多个页面放显示器了,类似这种:
其实也就类似于文章前面光头哥在看的那个界面了。
这个插件原先是cacti上的,同样也可以用取zabbix的数据源,期待的效果是在普通的拓扑图上加上动态的流量数据,先来个效果图:
下面简单概述一下安装过程。(相关配置下载可自行上weathermap官网)
下载weathermap的独立程序https://network-weathermap.com/#download,这是个web程序,解压之后搭建个php站点到这个目录。
下载weathermap-zabbix这个接口模块,地址:
https://github.com/amousset/php-weathermap-zabbix-plugin
解压出来就是一个lib目录里面包含3个php文件,把这个lib目录复制到Weathermap的站点目录即可。
然后对weathermap进行简单的配置,让他的接口可以从cacti那里独立出来单独的通过页面来画图。修改editor-config.php里面的ignore_cacti参数改为TRUE,然后让这个目录让web用户可读写,访问http://net.example.com/weathermap/editor.php 这个接口即可进行图形界面画拓扑图,注意这个接口原先存在安全漏洞,一定要用最新版。
我们可以选下面的simple.conf查看默认的拓扑图:
比较简洁和难看,我们可以创建个新的文件(configs/test.conf),然后即可进行add node(添加节点)和add link(添加链路),添加之后是实时保存的,但是要实现画图需要我们用crontab定时来运行脚本,在weathermap运行:
php weathermap --config configs/test.conf --htmloutput test.html --output test.png
这样就生成了个html文件,然后用web访问即可。
虽然有图形界面来画图,但是想画个工整美观的图还是建议直接编辑配置,用里面的配置进行尝试自动化添加,不难,就几个关键词,坐标和流量接口。
上面生成的图片是静态的,因为没有调用带宽的数据,所以我们的关键点还是在weathermap里面怎么调用到zabbix里面的数据。
调用zabbix的数据是通过api_jsonrpc.php这个接口来实现,语法参考自带的介绍:
General configuration
SET zabbix_user username SET zabbix_password password SET zabbix_url http://zabbix/zabbix/api_jsonrpc.php
# Graph configuration
SET post_zabbix_graphs 1
SET post_zabbix_graph_link 1
SET post_zabbix_graph_base_url https://zabbix/zabbix SET post_zabbix_graph_width 420
SET post_zabbix_graph_height 150
SET post_zabbix_graph_period 86400
然后用语TARGET的zabbix:语法来获取流量数据:
TARGET zabbix:name:switch-1:GigabitEthernet0/1-IN:GigabitEthernet0/1-OUT
里面有个关键点,主要是前面的set zabbix相关的数据,我们修改为自己的zabbix地址和用户密码即可。但是这个是怎么调用数据的呢。关键点来了,是link字段里面的TARGET配置:
TARGET zabbix:name:switch-1:GigabitEthernet0/1-IN:GigabitEthernet0/1-OUT
以冒号为区分分别代表的意思如下:
第一个字段zabbix是个关键词
第二个字段的name可以是name/key_/itemid
第三个是zabbix里面设置的主机的主机名
第四个是第二个字段设置的值的in流量
第五个是第二个字段设置的值的out的流量
当第二个是name的时候,第四个就是我们zabbix里面设置的某个接口名称,当是key_的时候就是zabbix里面的key值,如下:
第一个是用name时候调用的字段名,第二个就是key时候的,分别有各自的用处,但都是指向某个接口的流量。
这里碰到过问题,我们的核心交换机不能用name来表示,需要设置精准的键值,也就是要用key_来表示,其余的用了交换机的模版的交换机可以直接用接口名称。
另外怎么用接口获取zabbix的数据是通过zabbix的api_jsonrpc.php这个接口文件,我们也可以用别的工具来实现数据获取,具体流程如下:
1、先获取认证的auth值:
curl -i -X POST -H 'Content-Type:application/json' -d'{"jsonrpc":
"2.0","method":"user.authenticate","params":{"user":"用户","password":"密码"},"auth": null,"id":0}'
http://net.example.com/zabbix/api_jsonrpc.php
2、可以通过返回的auth值来获取某个主机的字段:
curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":
"2.0","method":"host.get","params":{"output":["hostid"],"filter": {"host":"目的IP地址"}},"auth": "获
取的auth值","id": 0}' http://net.example.com:8080/zabbix/api_jsonrpc.php
意思就是过滤主机名为目的IP地址的主机,返回它的id值。
3、对上面返回的id值进行主机的监控项的搜索:
curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":
"2.0","method":"item.get","params":{"output":"itemids","hostids":"10366","search":{"key_":"Gigabit
Ethernet1"}},"auth": "auth值","id": 0}' http://net.example.com:8080/zabbix/api_jsonrpc.php
然后会返回这个主机关于GigabitEthernet1的监控项的id值。
再来,接口就对这个itemid进行获取数据。
上面的curl调试是在之前监控项有空格时候出现故障的调试过程,原先是通过抓包来看他的调用过程,之后发现网络上有zabbix接口api_jsonrpc.php的详细介绍。这里是通过php-weathermap-zabbix-plugin里面的3个php文件来获取。
最终的配置就是围绕这NODE节点和LINK链路来做,类似这样:
NODE DEFAULT
LABELFONT 100
AICONFILLCOLOR 25 25 112
LABELBGCOLOR 225 215 245
MAXVALUE 100
LINK DEFAULT
WIDTH 3
BWFONT 100
COMMENTFONT 100
BWBOXCOLOR 212 212 190
BWLABEL bits
BANDWIDTH 100M
#下面是节点NODE_1信息
NODE NODE_1
LABEL test
ICON images/c.png
POSITION 100 600
#下面是NODE_1和NODE_2之间的流量信息配置
LINK NODE_1-NODE_2
TARGET
zabbix:key_:SWITCH_XXX:ifInOctets[GigabitEthernet1/3/1]:ifOutOctets[GigabitEthernet1/3/1]
NODES NODE_1 NODE_2
BANDWIDTH 300M
想要展现出来的图美观一点,我们只需要把POSITION坐标定义整齐,然后用ICON替换掉原先的设备图即可。另外如果脚本处理起来麻烦,可以先用web界面生成,然后手动修改坐标即可对齐。
开篇那两个高大上的办公环境,只要有硬件,加上我们这3个监控系统的装饰,估计可以更加高大上。一句话,只要我们有原始数据,在web端就比较容易帅气地进行展现了。