监控指标
机器维度
机器维度的监控指标包括CPU、Load、内存、网络、IO、磁盘等相关指标,详细指标可以参考Liux监控命令对应的指标数据:https://linux.cn/article-9373-1.html?pr (主要可以参见top、vmstat 、free、iostat、netstat 、iptraf等命令相关的核心指标)。
应用维度
应用维度的监控指标包括JVM使用情况、线程池使用情况:JVM情况主要包括YGC次数、时间,FullGC次数、时间,新生代老年代占比;线程池情况主要包括的线程池大小、最大线程数、活跃线程数、队列大小等。
服务维度
服务维度的监控指标包括error日志报错情况、服务接口调用量、耗时、成功率,调用接口调用量、耗时、成功率,dal层操作调用量、耗时、成功率。
外部依赖维度
外部依赖维度主要指应用系统常见的外部依赖的监控情况,主要包括数据库、缓存、消息队列等,这些一般情况都会独立进行部署,对应的机器监控同上面列举的机器维度监控;另外数据库还需要关注连接数、内存使用、SQL调用量、耗时、成功率,慢SQL等;缓存需要关注调用量、成功率,命中率、内存使用等;消息队列需要关注调用量、成功率,队列积压情况、死信队列等
整体监控维度
整体上的监控指标包括可用性监控(服务是否可用)、访问量监控(PV/UV)、负载监控(限流、熔断情况)、自定义的业务监控(异常业务场景、服务统计等)
监控系统设计
实现思路
要想实现完整的监控系统设计应该包括如下几步:数据采集—》数据整理存储—》数据展示;
其中数据采集可以通过在机器上安装客户端或者应用中引入客户端方式进行采集,应用日志可以使用统一的AOP拦截方式进行打印,然后通过独立线程定时扫描上传到服务端,上传方式可以使用消息中间件进行数据传输,服务端消费队列消息进行数据的整理存储;
监控服务端接收到上送的监控数据后,应该对数据进行清洗,然后对数据进行存储;由于监控数据会比较庞杂且是非结构化数据,这里最好使用非关系数据库进行存储,并对数据建立合适的索引,以便于监控数据的查询展示;
监控数据存储好后还需要有个便于监控数据查看,界面友好的展示系统进行数据的可视化报图表展示,而且这个图表最好可以支持自定义的格式配置。
注意事项
系统监控除了常规监控外,还需要支持可配置的监控指标,例如自定义日志告警、成功率告警等
数据展示除了常规数据展示外,还需要支持自定义的监控数据展示,例如数据的各种组合图表、统计图表等
分布式系统监控发现问题,还需要能够快速定位,这个时候就需要应用有分布式追踪的实现,另外日志尽量有统一规范格式便于解析
具体实现
现有开源的常见监控系统实现有zabbix,ELK(ElasticSearch+Logstash+Kibana ),大众点评的CAT,另外在监控快速定位问题这块大厂的实现有Google的Drapper、阿里的鹰眼、京东的hydra、Twitter的OpenZipkin,详细介绍可见网上博文《各大厂分布式链路跟踪系统架构对比》