本次分享的内容是基于开源组件的监控报警系统搭建及二次开发。自接受公司监控报警系统二期开发需求以来,我们完成了监控数据的补全、报警系统的搭建与调试、报警规则配置接口的开发。下图是监控报警系统的架构图。除业务数据采集器外,其余均基于原生开源组件或二次开发。整个系统采用TICK(telegraf+influxdb+chronograf+kapacitor)架构,用go语言实现。influxdb时序数据库influxdb数据库是一个时序数据库,它会对每一行数据进行标记,即使数据是并发写入的,也会按照时间顺序存储。同时也是关系型数据库,可以通过sql语言进行增删改查,学习成本低。官方提供了简单实用的web界面,非常人性化。在工程实践中,我们发现了一个陷阱。查询大量数据时会崩溃,重启后即可恢复。这个问题还需要研究。不用担心,因为监控系统中没有数据量特别大的query,生产环境中influxdb的性能非常好。TelegrafDataCollectorTelegraf是一个数据收集器,负责收集所有的原始数据,格式化后存储在influxdb中。Telegraf内置了大量的数据输入输出分析插件,可以采集php-fpm、nginx、accesslog、mysql、redis等组件的监控数据。Telegraf具有很强的可扩展性,开源社区也很活跃。来自世界各地的开发者将不断贡献新的插件。基于其插件架构,我们开发了redis队列输入插件和访问日志解析器插件来收集和分析Laravel框架队列和访问日志数据。collector业务数据采集器collector是整个系统中唯一自主研发的组件。由于业务监控数据查询规则复杂多变,我们开发该组件从MySQL查询业务数据,支持配置SQL语句、采集频率、时延等,并以格式发送给telegraf数据采集器涌入数据库。Kapacitoralarmkapacitor是一款可以实时订阅influxdb数据或者按照预先写好的规则批量查询数据,并进行告警(email、SMS、log、exec等)的工具。官方为它设计了tickscript语言,可以轻松编写规则脚本。我们的主要工作是tickscript的学习和调试,报警规则的设计,报警周期(每个字段)的调整和数据窗口(周期字段)的调整。我们将修改和重启告警脚本、查询告警脚本运行状态、查询influxdb数据订阅状态等命令写成shell脚本,方便后期维护和自动化。grafana数据可视化接口grafana是一个数据可视化组件,类似于大名鼎鼎的ELK架构中的kibana组件,支持多种数据源(influxdb、zabbix、elasticsearch等),并且有很多插件可供安装,添加在最新版本增加了简单提醒和电视模式等新功能。特别需要分享的是,有些监控数据是随着时间的推移不断积累的,在展示的时候要应用聚合函数(difference、max、min等)进行处理。同时,还可以为单个图表配置超链接,增强交互性和易用性。还有很多有趣的功能,留给大家去研究和发现。Chronograf可视化界面Chronograf是influxdata官方提供的数据可视化组件。可视化功能没有grafana强大。亮点是带有kapacitor组件的web界面,可以轻松配置报警规则,自动生成并启用tickscript,查询报警历史。我们对其进行了修改,美化了报警邮件的模板,增加了报警时间段(每个字段)和报警时间段的配置,使邮件内容更加友好,可以自由调整报警时间段。综上所述,我们基于TICK开源架构,结合自身业务特点和需求,开发了包括数据采集格式化、可视化监控、自动报警功能在内的一整套监控报警系统。未来,我们将不断调整优化,更好地为公司业务发展和技术研发团队服务。
