随着分布式系统架构的普及,系统越来越复杂,常常被切分为多个独立子系统并以集群方式部署在数十甚至成百上千的机器上。为掌握系统运行状态,确保系统健康,我们需要一些手段去监控系统,以了解系统行为,分析系统的性能,或在系统出现故障时,能有能力发现问题、记录问题、定位问题。也可以根据监控数据发现系统瓶颈,提前感知故障,预判系统负载能力等。
因此「微盟APM系统」(链接:https://developers.weixin.qq.com/community/develop/article/doc/000aaed6f98b28093f3a5265151c13)应运而生,在微盟各业务线投入时候后,微盟各个业务线的小程序的公众号的流量也从2020年初的日均百万级别提升了2倍多。之前APM系统的主要功能是进行日志、打点、报错等信息的采集和汇总,并以调用链的形式展现出来,方便开发、运营人员直观查询并根据报错、耗时等性能指标来排查异常或进行功能点优化。但随着流量的不断提升,另一个课题摆在了面前。在发现错误或者异常行为的情况下,如何能够在第一时间得知这样的情况并作出应对,故我们基于APM系统打造了告警能力。
以上是我们的设计流程图,在我们对APM进行优化后 (链接:https://developers.weixin.qq.com/community/develop/article/doc/00006209434c506bc31cc3c4454c13),我们引入了Ckafka,利用消息队列的高吞吐、低延迟的特点,达到更高的消息处理速度。基于Ckafka,我们将告警设计成为一种数据消费的过滤条件,由用户在APM中创建的报警策略,通过 Redis 的 pub/sub 功能告知 kafka-consumer ,在consumer中会根据该报警策略生成新的过滤规则,在消费数据中进行过滤判断,若触发过滤条件则通过令牌桶算法(基于Redis)记录触发次数,从而保证在分布式的架构中也能完成阀值统计,一旦触发阀值后,则会进行对应的告警。
在告警策略方面,我们也进行一系列的设计,用以能够支持不同需求的告警,例如简单的过滤是否存在错误、消息的具体类型,是网络请求还是卡顿信息等等,甚至是某些页面的访问频次,都可以进行相关的策略配置并进行告警。具体可以查看「微盟APM系统告警能力的设计与实现 (下)」,我们下次再见