公司最近要做一个服务监控的工具,包括 调用次数、成功率、响应时长、失败明细等信息,正好还在用阿里的edas,想着通过api的方式全都搞定了,可是公司用的专有云,没有监控的api,只能从头来做了。
要求:不能对之前的代码有侵入,并且 最重要的是不能影响性能。
思路:以切面方式来实现对应用程序无感知,并加入mq异步消息方式 解决性能问题。
mq与输出日志两种方式均可以记录访问信息,但是输出日志在大并发下会有性能问题,而且核心应用的日志级别一般都是ERROR的,一般会屏蔽INFO级别日志, 再一个对于一个一天调用量6-7亿次的应用来说,日志记录的话文件也会非常大,占用空间不说,处理起来也会非常耗时;利用mq异步的话,在内存中只会利用非常小的空间来存储对应接口的调用记录即可,而且不是实时发送,所以性能影响更小。
设计:
服务分为两个:监控服务、统计服务
监控服务 是以jar的方式集成到各个应用里的,定时器 每到整分钟时会发送 上一分钟统计的所有数据,这些数据包括接口名、成功数,失败数,耗时,主机IP,调用来源等信息,而异常信息是实时发送的,只要有异常,就发送一个消息,通过mq的tag与统计消息进行区分,异常明细包括:接口名,参数,异常明细,调用来源、时间等。
统计服务 是独立的服务,接收到 正常的消息后 会存入数据库,并进行各维度的展示;异常消息 会存入到文件,然后通过beam对异常文件进行梳理,对指定的服务配上策略进行告警。
效果如图:
监控服务中还有硬件的一些监控,与edas的重叠了,所以也没展示出来, 后续还有gc监控等,方便排查线上问题。