通常对于服务端程序来说,好的监控和告警系统,既是提高业务稳定性的有力保障,也常常作为系统优化的重要手段。最近一个月在我司推新的监控系统:Prometheus,当前尤其在docker生态比较的火。本文不是介绍proemtheus本身如何如何,而是侧重使用者如何去利用它来做监控系统。
废话不多说,我们主要谈谈监控的维度,我认为至少有5个维度是非常重要的。
- server端 无论是rpc server还是http server,我们都应该统计每个location或者rpc method的qps、延时、错误码。这是程序服务质量的最直观体现。
- client端 这里的client端专门指http或者rpc的client。同样包括qps、延时、错误率。qps特别高,是不是需要走批量协议?延时抖动了,是不是要找业务方查查问题?错误率呢?client端的统计是依赖的服务方的质量指标,也非常重要。
- lib client端 这里的lib client专门指通常的基础组件,如mc、redis、mysql,也是包括qps、延时。比如延时增大了,是不是有慢查询?熔断有没有生效?可以做监控!
- 程序内部状态 程序内部状态,这个一般是业务代码自己实现了,很灵活。我们基础库也支持了两种通用数据监控:熔断变化和更新缓存的异步channel的长度。任何你觉得重要的业务点都可以加个统计监控。
- 进程内部状态 对于我们golang进程来说,除了一般的内存、cpu,还包括goroutine数量,堆对象数。对于发现系统的整个压力情况、或者是设计问题、或者是bug也很有帮助。
通过这个监控平台,我们每天看一眼,基本上对整个系统的负载、性能、可能的瓶颈点、可以优化的点都有个比较清晰的把控。当然,如果想要追踪到具体请求的链路级别,可以参考google的dapper系统。另外,我们还可以基于监控做告警,比如延时、错误码告警。
刚来我司的时候一直用的statsd,而且一直没有client端的详细统计和监控,很多时候出问题要抓日志、深入分析,低效、耗时、不清真。刚好我们在docker化,运维希望用prometheus来做监控。所以刚好就推展开来了!
下面给出具体的图:
这是http server的接口统计:
这是依赖接口的统计:
这是依赖基础组件如cache、db的统计: