[go-monitor]开源一个大部分golang项目都可能会用到的服务质量监控分析告警组件

开源是一种精神,不仅在于分享,也在于交流改进。

go-monitor的雏形来自于公司的一个web项目,由于严重依赖于外部服务(接口),所以对于这些调用的服务状态如何,需要有及时的反馈,在这样的背景下,有几种成熟的方案供我们选择,要么自己搭建一个监控告警平台,开源的也不少,但综合考量下也并没有满意的;要么使用专门提供服务的监控平台,例如听云,但费用方面以及是否灵活匹配我们的需求,有待商榷。除此之外,我们其实还可以选择自己开发一套告警平台,但这并非一朝一夕,更需要人力和精力的投入。

在这样的僵持下,我们决定从小处着手,先做一个能完整满足当前需求的,不考虑太大的范围,基于golang,能实现应用内上报、收集、分析统计、告警即可。

于是go-monitor就诞生了,就跟一个日志组件一样,开箱即用。

go-monitor的上报仅简单提供了三个参数:命名、耗时、状态。

上报类型可以包括外部接口、应用本身对外提供的接口、函数、各类服务(数据库)等等。

耗时是它们成功时的统一属性,而状态可以帮助我们断定失败的类型。

例如对于简单的接口来说,url+method可以作为我们的命名(需要格式化路径参数和请求参数、确保唯一,或者直接特殊命名为”xxx接口”),而接口的耗时以及请求状态(或使用统一错误码)就可以作为我们的监控依据了。

go-monitor的职责很简单,在每个设定的统计周期内,收集统计并输出该周期具体某个上报条目的调用总次数、成功次数、成功率、失败次数、总耗时、平均耗时、最大耗时、最小耗时、耗时达标率、耗时分布状态、失败分布状态等指标。

并按照设定的规则,在连续若干个统计周期内成功率或耗时达标率不如预期时,发出告警(连续若干个统计周期恢复也会发出恢复通知)。

除此之外,go-monitor提供了大量灵活的配置,期待在绝大多数golang项目中,都可以通过配置调整来适应具体的需要。

性能方面也是go-monitor努力的方向,原始版本尝试过使用并发锁,但加入了队列优化,使锁的竞争极低,所以实测的性能在MBP 2012标准版本上,500万次花费了1.9s,约320ns/op,后面完全抛弃了并发锁,全部采用无锁队列,500万次执行提升到了1.6s,约260ns/op。当然,后续还有优化的空间,但目前的水准已经比大多数日志组件还快了,并且不需要担心日志组件大并发之后缓写磁盘的IO压力,可以完全放心地对go-monitor上报你所关心的服务。

目前go-monitor的统计数据输出以及告警、恢复通知都默认打印到控制台,提供定制(当然,在我们的项目中,数据是写库的,告警通知也接入了公司自己的微信告警平台)。

可以想到,大部分项目都需要对这几个能力进行定制,对于统计数据输出是否写到日志或数据库,go-monitor来提供这种能力并不合适,每个项目的日志组件、数据库类型都不一致,或者已经在web中使用数据库,对于这些项目来说,提供定制反而很灵活,go-monitor不好提供也确实不应该提供。

至于告警,go-monitor将在后续实现一些有大范围适用性的告警能力,例如邮箱告警、短信告警、接口告警等。希望本次开源能收多些star,多点动力去提升go-monitor的能力,谢谢大家。

详细及使用文档点击请点击 -> github

共 0 个回复