监控指标
- 谷歌针对分布式系统监控的经验总结,
四个黄金信号:延迟、通信量、错误和饱和度
- 延迟指的是请求的响应时间,包括接口、访问数据库和缓存。
- 通信量可以理解为吞吐量,也就是单位时间内请求量的大小。比如访问第三方服务的请求量、访问消息队列的请求量。
- 错误表示当前系统发生的错误数量,包括http状态码不正确,或者业务错误。
- 饱和度指的是服务或者资源达到上限的程度,也叫资源的利用率,比如CPU的使用率、内存使用率、磁盘使用率、缓存数据库的连接数等等。
- 其他一些组件特有的指标,比如数据库主从延迟、消息队列的数据积压、缓存的命中率等等。
如何采集
Agent
- 通过在数据源的服务器上,部署自研或者开源的Agent来收集数据,发送给监控系统。
- 在采集数据源上的信息时,Agent会依据数据源上提供的接口获取数据。
- 比如监控Memcached,就可以在Agent上连接这个Memcached服务器,并发送status命令,从返回的信息中挑选重要的指标,发送给监控服务器。
代码埋点
- 可以在代码中直接打点,计算调用服务的耗时和调用量,并且发送给监控服务器。
- 不过,埋点最好要汇总,否则会因为PV过高,打垮监控服务器。
日志
- 通过开源的日志采集工具,比如Flume、Filebeat等。
监控数据的处理和存储
- 一般先用消息队列来承接数据,主要作用是削峰填谷
- 然后启动队列处理程序:
- 一个负责把数据写入es,然后在kibana上展示,主要用于原始数据的查询。
- 一个是一些流式处理的中间件,比如Spark,从消息队列里接收数据后做一些处理,
- 比如解析数据格式,提取出请求量、响应时间等数据。
- 还会做聚合运算,可以计算同一个 URL 一段时间之内的请求量、响应时间分位值、非 200 请求量的大小等等。
- 将数据存储在时间序列数据库中。这类数据库的特点是,可以对带有时间标签的数据做更有效的存储,而我们的监控数据恰恰带有时间标签,并且按照时间递增,非常适合存储在时间序列数据库中。目前业界比较常用的时序数据库有 InfluxDB、OpenTSDB、Graphite。
- 最后,就可以通过 Grafana 来连接时序数据库,将监控数据绘制成报表
报表
访问趋势报表
。这类报表接入的是 Web 服务器,和应用服务器的访问日志,展示了服务整体的访问量、响应时间情况、错误数量、带宽等信息。它主要反映的是服务的整体运行情况,帮助你来发现问题。- 性能报表。 这类报表对接的是资源和依赖服务的埋点数据,展示了被埋点资源的访问量和响应时间情况。它反映了资源的整体运行情况,当你从访问趋势报表发现问题后,可以先从性能报表中,找到究竟是哪一个资源或者服务出现了问题。
资源报表
。 这类报表主要对接的是,使用 Agent 采集的资源的运行情况数据。当你从性能报表中,发现某一个资源出现了问题,那么就可以进一步从这个报表中,发现资源究竟出现了什么问题,是连接数异常增高还是缓存命中率下降。这样可以进一步帮你分析问题的根源,找到解决问题的方案。