IT技术学习之开发(四)

先声个明:

我陆续写技术文章的目的可能是因为有点上瘾,而且最近几个月都在钻研技术。既然花费了大量精力来搞技术,那么把这个过程记录下来也很重要。技术大牛估计看不上眼,初学者可能也摸不着头脑,就是个个人学习成长血泪史,兴许可以替同路人铺个把个坑儿。

下面继续挖坑儿......

上回书说到我拿到了倚天剑和屠龙刀,即将称霸武林。。。对,没错,你听错了。之前两篇里我即掌握了Python调用数据库的皮毛,又了解了zabbix数据库里我需要的数据在哪些表里,那么我就可以写Python脚本来提取zabbix数据库了。

为了提高代码的可移植性和易维护性,我在getkey文件里添加了登陆数据库的主机信息,这样即使脚本放在其他机器上,也能远程登陆zabbix数据库,当然网络得通。

下面第一个提取的是groups表。

定义了groupid和gname两个全局列表,for循环里的if判断里的正则表达式匹配的是非字母数字下划线,因为我们zabbix里的主机组是按项目来的,名称都是中文,而zabbix自带的一些组都是英文的,所以这样一来就把我需要的主机组名和对应的组ID取出来,并分别放到两个全局列表里。

第二个提取的是hosts表,但从SQL语句可以看出,条件里还调用了hosts_groups表,这里其实就省下了单独调这个表的一个脚本,潜台词是:可以省下很多脚本,只在一个脚本里写一句很长的SQL语句,就能调用最终的数据。这也是我把脚本都写完了,同事告诉我的。。。在写脚本的过程中我就察觉到了这点,但之所以没那样写,是因为正是由于那样调出的数据是最终的,当形成报告时,分不出来对应的监控项、主机、主机组(即项目)是哪个。话说回来,我要写那样的一长句SQL语句,就要先知道我要查哪些主机组、主机、监控项,最终还是得通过脚本得到这些信息。另外还有个利弊的区分,调用的分层(逐层下查)和分块(每层单独写成脚本和函数)能让我在后面写主程序时方便使用,易于操作。

这个脚本提取的是items表,原本一条的SQL语句,被我拆成三条,为了是区分出CPU、内存和硬盘的数据,如果还要查询更多的监控项,逐条添加就可以了。

脚本下面被注释掉的紫色部分,包含了一个很有意思的功能——二维列表的转置,就是行列互换,我是从网上找来的方法,很好奇它中间的for循环的写法在编译时是怎么执行的,以前好像在c++里也见过类似的写法。

仔细观察还可以发现,除了groups的脚本,其他脚本里定义的列表都在函数里,这是更好的模块化,在最终整合调用时只作为输入输出管道,而不存储数据。

最后,一路查下来到了监控数据这里,就有四项数值,时间戳、最大、最小和平均值。变量lastmouth是用当前时间减去30天,为的是得到一个月前的时间。函数里的if判断其实并没有卵用,因为一开始导出的数据有些是空的,我试着分别在trends和trends_uint里查询某些item的数据,都没有结果。我想找出是那些主机或主机组没有数据,看看是不是特定的模板收不到数据,于是定义了nodataiid,即没数据的itemid,还套用这些脚本写了反向查询的脚本,但最后查出的结果是,有不少item没有数据,涉及了大量主机,包含了所有的主机组,于是我就放弃了,这个还得和监控的同事讨论,最后我要是做出了成果,它第一依赖的就是zabbix的数据,充实完整的数据才能撑起内容。

这篇里就能看出我学习的过程中有不足、有漏洞,有反复修改的痕迹,之前的摸索中也有很多这样那样的问题,只是我没有提到,因为都是琐碎的小坑,上网查查就能解决的。之后几篇里大家会看到我多次碰壁,不得不换了几次路线。搁置问题虽然不提倡,但为了不半途而废而另谋出路也能彰显生生不息的拼搏精神。我同事说看我这几个月一直不懈钻研的劲感到很欣慰,我能得到同事的认可我也很欣慰。不过还是得说,后面文章可能会越来越显现出我丑陋的技术能力不足的囧态(窘态)。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180602G1BBS900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券