监控的发展历史和监控的应用
一、概述
上篇中写到了ELFK,顺着应用监控的方向,将对监控体系的基础知识、原理做一次整理。
二、日志监控
ElasticSearch 、 Logstash、Filebeat、 Kibana 参考ELFK
三、监控的对象和指标
监控已然成为了整个产品生命周期非常重要的一环,运维关注硬件和基础监控,研发关注各类中间件和应用层的监控,产品关注核心业务指标的监控。可见,监控的对象已经越来越立体化。
1、硬件服务器
- CPU的利用率,单个CPU以及整体的使用情况
- 内存使用率,已用内存、可用内存
- 磁盘IO效率,磁盘使用率、磁盘读写的吞吐量
- 网络带宽,出口流量、入口流量、TCP连接状态
注意目前大多都是云服务器很少有自建机房,所以机房里电源状态、机器温度、风扇状态等硬件指标基本上不在关注。
2、数据库
- 数据库连接数、QPS、TPS、并行处理的会话数
- 缓存命中率
- 主从延时
- 锁状态
- 慢查询
3、中间件
- Nginx:活跃、等待、丢弃连接数,请求量、耗时,5xx错误率
- Tomcat:最大线程数、当前线程数、请求量、耗时、堆内存使用情况、GC次数和GC耗时
- 消息队列:连接数、队列数、生产速率、消费速率、消息堆积量
- Nacos:服务的实例的健康状态
4、应用监控
- HTTP/RPC接口:请求量、耗时、异常量
- JVM :GC次数、GC耗时、各个内存区域的大小、当前线程数、死锁线程数
- 数据库连接池:总连接数、活跃连接数
- redis连接池:总连接数、活跃连接数
- 线程池:活跃线程数、任务队列大小、任务执行耗时、拒绝任务数
- 日志监控:访问日志、错误日志
- 业务指标:视业务来定,比如PV、业务量等
四、监控的目标
这些所谓的监控对象、指标、阈值、告警等方法,最核心的目的一定是让开发者能够快速
- 发现问题, 通过告警方式通知给相关人员,先一步比客户更早发现隐藏的bug。
- 定位问题, 比如故障邮件中,详细的说明故障发生的服务器和应用,以及故障的具体内容,然后根据错误内容及时作出修复方案。比如CPU利用率过高导致程序无法响应(快速重启),网络通信延迟导致大量请求超时(带宽过小?限流?OOM等)。
- 解决问题, 了解了故障原因,就需要根据问题的严重级别快速解决问题,核心目标是先保证线上业务能用,然后再逐步排查问题的根源。
- 问题复盘, 故障复盘分为两个方面,一个是故障定责,其次就是故障分析和总结,避免后续再遇到类似问题。
五、监控的核心实现
1、数据采集
-
探测式 , Spring Boot Actuator , Endpoint(Metrics(JVM/内存/线程…))提供REST API
-
业务埋点, 在接口中插入采集点, 进行指标数据的上报(通过Logstash、Filebeat等进行上报和解析)
- JMX标准接口输出
- Javaagent
- Metrics( 是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控)
-
日志监控(采集业务日志)
对于监控目标对象数据采集,其实从整个后端架构的来枚举,可以分为几个部分:
- 基础数据,主要表示服务器状态的基础指标,包括CPU、内存、网络、磁盘IO等
- 应用数据,主要指运行在服务器上的应用程序的状态数据,比如应用的运行状态、JVM内存使用情况、GC详情
- 业务数据,上述两个指标分别是对基础数据以及部署在机器上的应用的资源利用率数据的反馈,作为业务系统,我们不仅仅通过服务器的运行状态来判断应用存活情况,还需要了解应用的请求流量、接口响应速度、错误率等去判断应用的运行状态,所以我们还需要三个重要指标:流量、错误率、延迟 来多维度判断业务的运行状态
2、数据传输**
将采集的数据以TCP、UDP或者HTTP协议的形式上报给监控系统,有主动Push模式,也有被动Pull模式。
3、数据存储和展示
有使用MySQL、Oracle等RDBMS存储的,也有使用时序数据库InfluxDB存储的,还有使用HBase存储的。
然后数据指标的图形化面板展示(kibana、 zipkin+Sleuth、skywalking 、 Pinpoint 、Grafana、Prometheus(报警、存储、展示))
4、监控告警
灵活的告警设置,以及支持邮件、短信、IM等多种通知通道。
六、主流监控开源技术
- Zabbix,核心组件,C语言编写,是一个基于WEB界面的提供分布式系统监视以及网络监视功能 的企业级的开源解决方案,它属于老牌监控系统中的优秀代表,监控功能很全面,使用也很广泛,它和Prometheus是同类型的组件。
- Open-falcon, 是小米2015年开源的企业级监控工具,采用Go和Python语言开发,这是一款灵活、高性能且易扩展的新一代监控方案,目前小米、美团、滴滴等超过200家公司在使用它。
- Prometheus(普罗米修斯),Google2015年正式发布的开源监控系统,采用Go语言开发,目前Prometheus在业内使用非常广泛,所以社区的活跃度也非常高。同时,Prometheus性能也足够支撑上万台规模的集群。数据采集是基于Pull模式的。
- Grafana,Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并根据设定阈值来触发告警通知。
说实话我目前只是用过Prometheus ,所以简单介绍一下Prometheus 核心组件
- Prometheus Server:核心组件,用于收集、存储监控数据。它同时支持静态配置和通过Service Discovery动态发现来管理监控目标,并从监控目标中获取数据。此外,Prometheus Server 也是一个时序数据库,它将监控数据保存在本地磁盘中,并对外提供自定义的 PromQL 语言实现对数据的查询和分析。
- Exporter:用来采集数据,作用类似于agent,区别在于Prometheus是基于Pull方式拉取采集数据的,因此,Exporter通过HTTP服务的形式将监控数据按照标准格式暴露给Prometheus Server,社区中已经有大量现成的Exporter可以直接使用,用户也可以使用各种语言的client library自定义实现。
- Alert Manager:当告警产生时,Prometheus Server将告警信息推送给Alert Manager,由它发送告警信息给接收方。
- UI:Prometheus内置了一个简单的web控制台,可以查询配置信息和指标等,而实际应用中我们通常会将Prometheus作为Grafana的数据源,创建仪表盘以及查看指标。
Prometheus 优势:
- 轻量、架构简单、灵活的数据模型、更成熟的时序数据库、强大的告警功能,监控方面的标配,有Google和k8s加持。
- 到中后期,随着机器数据增加和个性化需求增多(比如希望统一监控平台、打通公司组织架构关系),往往需要二次开发或者通过监控系统提供的API做集成,Prometheus可以很好的支持这点。
用合适的监控系统解决相应的问题即可,可以多套监控同时使用,这种在企业初期很常见。
常用的监控组合方案:
- Prometheus+Grafana+Spring Boot Actuator
- JMX Exporter(还有redis_exporter,mysqld_exporter,)+Prometheus+grafana监控