小米Open-Falcon监控系统自2015年开源以来,以其丰富的插件,灵活的架构,良好的性能表现,高效的告警策略等特性,赢得的众多互联网公司的青睐。
汽车之家也一直关注着Open-Falcon的发展,系统平台团队通过对Open-Falcon的二次开发,打造了汽车之家的监控系统。这套系统负责了汽车之家所有服务器基础监控,URL监控,日志监控等重要功能。作为公司基础系统,稳定高效的支撑了近万台服务器的监控,告警工作。
初衷
汽车之家除Linux服务器外,还有很多业务运行在Windows机器上,所以对Windows服务器基础监控,IIS,SQL Server等Windows服务的监控也非常重要。但是Open-Falcon未全面覆盖Windows系统,没有官方的Windows Agent去做数据的采集。社区中开源的脚本都是通过计划任务的方式采集。而我们希望的是Open-Falcon在Windows下的Agent采集的逻辑和架构与Linux下保持一致,方便监控平台管理,控制Agent。
目标
我们的设计目标有以下几点:
-
可以服务的形式运行在Windows服务器上,不用配置计划任务
-
支持采集Windows服务器基础监控项
-
支持采集IIS,SQL Server的监控项采集
-
提供和Linux Agent一样的push数据接口,支持第三方push数据
-
与Linux Agent其他功能保持一致
基于以上几点我们自研了之家的
Open-Falcon Windows Agent
。
实现
1 代码架构
Windows-Agent
的代码架构如上图所示。程序启动后,会启动5个线程。每个线程都会按照配置好的时间间隔定时采集所需信息。
-
basic thread
基础监控项采集线程,通过
psutil
这个跨平台的库,可以轻松获取操作系统进程和系统利用率等信息。
-
IIS thread
IIS数据采集线程,通过
winstats
这个库,定时的采集IIS站点的连接数,IIS站点的cpu使用率等数据。
-
SQL Server thread
SQL server数据采集线程,同样通过
winstats
, 获取到SQLServer内存和I/O相关数据。
-
status thread
Agent自身状态线程。这一点和
Linux Agent
的功能一样, 定时向
HearbeatServer
汇报自己Agent的状态。这样在我们的监控平台上就可以向管理Linux服务器一样的管理这些Windows服务器。
-
HTTP
HTTP线程会开启一个HTTP服务提供push接口,和LinuxAgent一样,用户可以选择通过该push接口,把自定义的数据push给Agent。方便第三方数据的接入。
2
数据的传输
Open-Falcon Linux下的Agent启动之后,会和transfer组件建立长连接,通过
Transfer.Update
这个RPC调用,把Agent采集到的监控数据传输给transfer,后面的事情就全部交由Open-Falcon处理。Agent自身状态的汇报也同样方式,通过
Agent.ReportStatus
这个RPC调用和
Hearbeat Server
交互,上报自身状态。在Windows下,我们要采用同样的方式和
transfer
组件,
Hearbeat Server
组件进行数据的传输,不同的是,Linux下的Agent是golang实现,可以方便的使用golang原生的JSONRpc处理RPC调用,而我们Windows下的Agent使用python开发,所以我们自己实现了jsonrpc的client,来模拟Linux下的处理。保证我们的Agent行为和Linux下的Agent一致
3 如何变身Windows服务
Windows Agent通过
pypiwin32
这个库,把python代码变成了服务安装到了Windows服务器上。这个库怎么用呢?Demo如下:
首先要继承
win32serviceutil.ServiceFramework
这个类,然后分别实现构造方法,停止运行方法
SvcStop
, 以及启动方法
SvcStop
。最后在主方法中调用
win32serviceutil.HandleCommandLine(AppServerSvc)
。
就可以通过
python agent.py install
安装服务,
python agent.py start
启动服务,有兴趣的同学不妨可以自己试试。
4 配置文件
Windows Agent的配置文件也和Linux Agent一下保持一致,如果你熟悉了Linux下的配置,甚至可以直接copy到Windows服务器下。具体的配置解释如下
目前Windows Agent运行在汽车之家上千台Windows服务器下2年多时间,始终保持了稳定,可靠的数据采集,同时对资源的消耗也非常小。
下图为Agent作为服务运行