2.3 监控报警系统

监控报警对于提升系统的稳定性和可用性有着重要意义,它为运维人员提供了一个中心化的、可观测的和可扩展的操作平台。特别是在大规模微服务架构下,监控报警系统在辅助运维人员进行故障的预警、定位和分析等过程中具有不可替代的作用。本节将针对监控报警系统的通用架构、指标计算模型和开源解决方案进行讨论。

2.3.1 通用系统架构

目前业界有许多监控报警的开源解决方案,而且不少公司内部都有自研的监控报警体系,我们可以用图 2-15 来表示通用的监控报警系统架构,它主要由指标计算、指标持久化和可视化、告警系统这几个核心组件构成。

● 指标计算:它可以分为本地实时计算和日志聚合计算两种模式。本地实时计算模式通过内置的计算框架来完成本地指标的实时更新,并提供指标的实时访问接口。这种模式适合大部分业务指标的计算,但是由于数据覆盖度和计算资源的限制,它无法实现跨越进程边界的指标统计。此外,在这种模式下,指标数据分布在不同的服务节点上,因此它也需要借助辅助工具来完成指标的持久化和可视化。日志聚合计算模式通常又可以细分为离线计算和流式计算两种类型,前者通常需要借助 Hive 和 Spark 等大数据计算平台,后者则需要利用 Flink 和 Storm 等流式计算引擎。日志聚合计算模式的好处是可以实现全域的、异步的、复杂的指标计算操作。举例来说,在计算集群整体的 QPS 指标、广告点击率指标以及需要和第三方数据进行联合计算的指标时,我们需要依赖该种指标计算模式。

● 指标持久化和可视化:指标持久化的前提是对指标数据进行收集。针对本地实时计算模式生产的数据,我们可以利用Prometheus等框架提供的指标访问接口来主动爬取;而针对日志聚合计算模式生产的数据,我们可以提供数据推送接口和数据加载接口来被动地接收。无论是主动爬取还是被动接收,当数据被持久化到时序数据库后,系统都需要提供一个可视化界面让使用者对指标进行观察。

● 告警系统:它会依据使用方设置的告警规则进行及时的指标监控和告警通知。通常来说,与指标持久化服务深度耦合的告警系统可以按照触发模式来进行工作,而那些相对独立的告警系统,则会进行周期性的指标查询来判断是否满足告警设置。部分告警管理系统也提供了更为精细的告警策略和可视化平台,它们往往可以提供趋势预测、通知合并等功能。

图2-15 监控报警系统的通用架构

2.3.2 指标计算模型

无论是基于日志计算的方式还是基于本地实时计算的方式,监控报警系统都需要对原始打点数据进行抽象来形成具有统计意义和可观测性的指标计算模型。图 2-16 展示了一个通用的指标计算模型体系,以及它在本地指标管理器系统中的定位。

图2-16 通用的指标计算模型体系

常见的指标计算模型有如下几类。

● Gauges 瞬时类型:该类型主要反映的是某个指标的瞬时值,例如当前时刻的内存占用量和当前时刻的请求队列长度等。

● Counter 计数类型:该类型主要反映的是某个指标的累计值,例如累计的请求数和累计的 CPU 使用时间等。

● Meter 速率类型:该类型主要反映的是某个指标的变化趋势,它一般会根据可配置的时间窗口来进行指标统计。例如,系统可以统计最近 1 分钟、5 分钟和 30 分钟的平均 CPU 负载和平均 QPS 等指标。

● Histograms 直方图类型:该类型主要反映的是某个指标的数据分布,例如1 分钟内请求响应时间的数值分布。这种类型可以统计如响应时长等关键指标的平均值、P99 值和 P999 值。

● Timers 性能类型:作为一种复合型的指标类型,它通常借助 Meter 和 Histogram 来完成具体的功能实现。我们可以利用 Timers 统计出诸如 QPS 和响应时间等核心数据的细粒度指标。

一般来说,指标管理器会提供打点接口来接收应用程序的打点数据,然后依据配置来进行指标的实时计算和数据的格式化操作,最后会暴露指标访问接口以提供给指标持久化和指标观察系统使用。

2.3.3 开源解决方案

目前市面上有InfluxDB、Druid、OpenTSDB、Prometheus、Grafana 、RRDTool 等与监控报警相关的开源解决方案,其中Prometheus 和Grafana 的组合最为常见,前者负责指标数据的收集、存储、查询和告警,后者则提供了指标数据和监控报警的可视化操作界面。图 2-17 展示了基于 Prometheus 和 Grafana 所构建的监控报警系统,它主要由如下几个组件构成。

● Service Discovery 组件:它负责为 Prometheus 提供目标服务和指标访问接口的寻址功能,因此Prometheus 会依赖该组件主动到目标服务上拉取指标数据。

● Prometheus 组件:作为整个架构中的核心组件,它除了利用内置的时序数据库对指标数据进行持久化存储,也负责指标数据的获取并提供指标数据的查询接口。

● Pushgateway 组件:对于部分无法提供指标数据获取接口的服务来说,它们也可以选择主动推送的模式来交付指标数据。这些应用服务首先将指标数据推送到 Pushgateway 服务中,然后 Pushgateway 会将数据转发给 Prometheus 组件。

● AlertManager 组件:它提供了功能强大的告警管理功能,使用者可以利用它来配置灵活的告警规则和通知规则。

● Grafana 组件:作为一个功能强大的可视化系统,它为指标数据和监控报警提供了完善的图表界面和操作平台。不仅如此,Grafana 还能集成数十个数据源并支持数据源之间的级联查询,此项功能有助于将第三方数据引入可视化界面中。

图2-17 基于Prometheus和Grafana构建的监控报警系统