说起Python这门编程语言的作用,可以列举很多方面,其实每一门流行的编程语言都可以列举很多方面,但是要说起Python的主要领域,莫过于运维监控方面,在这方面有大量优秀的开源运维系统。
虽然有很多优秀的开源运维监控系统,如Nagios、Zabbix、Prometheus、Grafana,但是当你真正在线上企业环境面对各种各样实际需求时,总感觉不够自己需要,这些系统提供的二次开发功能,要么自己不喜欢这些语言,要么自己不喜欢这种具体的模式,总想自己弄一个简单的、自己随意想怎么开发就怎么开发的系统来,所选择的主要语言自然是Python,因为Python简单,但又不像shell脚本那么过于简单。
在我的运维经验里,基础资源的监控其实不重要,如CPU,内存,磁盘和网络等,这些不是说不要监控,而是随便用一个开源的系统就监控到了,如我们用Prometheus+Grafana就解决了,只要正常就行,其它部门对这个根本没特殊需求。但是,对业务系统的监控,对业务数据的监控和分析,这个需求就多了,各个部门可能都需要一些数据,严格讲这些数据应该是数据分析人员去做的,但是中小功能哪里有那么多岗位细化,在客户现场环境,公司驻点的唯一工程师就是运维工程师,他必须搞定一切,如果这些数据每次提取都是手工去用各种系统提供的命令行去做,速度可想而知,比如mysql表用sql查询一下,elasticsearch索引数据在kibana上查询一下,milvus特征向量数据统计用pymilvus脚本去统计,每天运维工作中这种比率将很大。
上图给出了一种运维监控平台架构的设想,DataOps是一个通俗的名字,现在DevOps、DataOps、AIOps,到处都是概念,但是我感觉用数据说话的思路是最靠谱的,最基本的指标数据容易做的到,运维人员也容易理解,也容易去执行。AIOps太高级,运维人员未必能理解;DevOps太难搞,毕竟多个部门协作说的好听,效果能到哪里很难。
这个架构的一个想法就是把各种指标数据推送到数据库里存储起来,然后前端来查询,技术上就这么简单,提倡的是一个个细节要做好,就是能不能真正去采集各种各样的有用的数据指标,能不能及时提供监测业务系统正确性的数据指标,是不是能做到,上线一个业务功能,运维部门能及时开发一个采集组件及时的配套上业务功能。
有时候功能强大的运维监控系统对一个中小企业就是一个废品,架构师和主管组织上马了一个强大的运维监控系统让运维部门去使用,之后到底效果怎么样谁也不管,最后运维人员还是习惯用手工命令操作一下,搞几个他认为重要的,或者公司同事要他查询的,其它的一切不理。当然不光是运维系统,好多业务系统也是一样。
我的DataOps系统核心还是把各种指标数据写入MySQL数据库,其实和Prometheus是一样的,都是采集时序数据指标,那为什么不直接用Prometheus呢? 其实我们已经用了Prometheus系统,但是运维人员就是搞不明白它,上线了也没真正用上,更不会用Prometheus客户端库写探针功能,而且我们也不喜欢Prometheus主动去连接各个探针的模式,开防火墙规则都麻烦死。
opsstash就是承担了Prometheus的角色,只是opsstash是服务器,让各种beat来主动连接,一般采取短连接方式,数据封装采用JSON格式,尽量的简单,比如Python编写beat的话,用request库就搞定了,一般运维人员都能搞定,比Prometheus的客户端库和模式简单多了。opsstash用Flask框架实现一个API接口就行,支持各种指标数据推送即可,加上安全令牌身份证认证,一个服务接口就解决了所有的时序指标数据入库。
opsapi提供各种指标数据项的查询接口,供运维前端系统调用,可能各个指标的查询条件、排序字段、显示字段的要求各不相同,这个就必须一个指标项一个API接口,但是基于Flask+SQlAlchemy框架,可以用Python写一个自动生成API接口模块的Python代码的工具程序,这个目前已经实现。
opsweb是运维前端web系统,所有指标数据都要在这里展示,运维人员主要在这个系统界面上每日观察分析数据。运维人员99%都是在看运维指标数据,所以分页表格展示是最常用的,选择Amis低代码框架来实现前端web系统,只需要去生成JSON文件就可以轻松得到一个web界面,大大减少了开发门槛,因为中小公司的运维团队,不大可能擅长vue、react等,jquery系列库也搞不定,Javascrip语法都未必能学习好,唯一JSON语法是最简单的。而且,我也用Python写了一个自动生成简单web界面的工具程序,实现了对一张MySQL表数据进行分页表格显示,提供过滤条件和排序功能等,在这个基础上手工加JSON配置来实现更多特有功能,还是很简单的,百度开源的Amis低代码框架确实不错。
opsmobile是一个想法,毕竟用手机监控是比较常见的,一套API服务接口给多种前端使用也是很正常的。另一个重要原因是我司的系统部署特点,基本都是在客户封闭的内网里部署,互联网是不可以访问的,只有客户颁发给我们特有的手机才可以访问这个内部网络,只能用这种手机才能远程监控系统。
总之,DataOps系统是侧重于指标数据要多要强大,而使用的技术越简单越好,希望能用Python全部解决,不需要用Go、Java、C/C++等比较难的语言来实现。DataOps也需要和Promethues、Loki、ELK对接,那些现成的基础通用的数据指标采集,用这些开源组件实现就好了,比如CPU、内存、磁盘和网络等,没必要自己用Python写一通,我们写各种beat主要是针对业务系统指标,对业务数据进行统计分析采集,业务数据监控其实比基础资源数据更重要。