聚合度量

聚合度量是指将多个数据点按照特定规则进行组合、合并或计算,从而得到有意义的统计指标的过程。

这一概念广泛应用于数据分析、系统监控。

聚合度量是对原始数据的提炼,通过数学运算 (如求和、平均值等) 将大量数据压缩为关键指标。例如计算服务器 CPU 使用率的平均值。输出的数据为监控和预警作决策支持。

通常我们在聚合度量领域要使用 Prometheus 这个工具,它是一个开源的系统监控和警报工具包。

通常来说,我们认为聚合度量是一种对业务的一种监控我们之前说的 APM 也就是链路追踪其实是一种对技术层面的监控。业务监控 vs 技术层面的监控

举个例子,我这网页怎么跳出去这么高,都到百分之 40 了,这就叫聚合度量,也就是业务层面的监控。我这个服务为什么内存占用这么高?这就是链路追踪要搞定的事情,技术层面的监控 vs 业务层面的监控

prometheus 架构分为客户端指标收集、服务端存储查询、终端监控预警。

客户端指标收集

prometheus 通过客户端指标收集的方式,收集到我们的指标数据,然后存储到 prometheus 的存储中。

prometheus 主要收集以下指标数据:

  • 计数类的数据:比如库存数量,职工数量等计算数量的数据
  • 瞬态数据:比如网站在线人数,网站访问人数,也属于计数类的数据,但是强调顺时。
  • 吞吐率数据:比如 QPS TPS,是一种在单位时间内的吞吐量
  • 直方图数据:比如横坐标是时间,纵坐标是访问人数,这是一种二维统计图
  • 采样点分布数据,比如正态分布的数据,等强调数据分布的数据

数据传输方法

这里主要是讲从客户端传递到服务端时传输的方法,推和拉,推就是客户端主动上报数据到服务端,拉就是服务端主动上报数据到客户端。

prometheus 一般是采用先推后拉的方式,先收集数据,数据主动上报到一个中转站,叫做 push gateway,然后 prometheus 再从 push gateway 拉取数据。这主要是为了某些场景而做的特殊设计,比如一些短生命周期的任务,比如一些离线任务,这些任务的生命周期很短,不适合一直保持连接,所以 prometheus 就设计了这种先推后拉的方式。或者 prometheus 的客户端处于内网状态,无法去拉数据,那么就需要 prometheus 的客户端主动推送到 gateway,gateway 再上报给 prometheus server。

prometheus 提出一种 exporter 的概念,这个 exporter 是一个中间件,可以将各种各样的数据转换成 prometheus 可以识别的数据格式,然后再上报给 prometheus server。只要你的软件集成了 prometheus client lib,那么就是一个 exporter。你也可以把 exporter 理解为 prometheus 客户端。

常见的 Exporter:

范围 常用Exporter
数据库 MySQLExporter、RedisExporter、MongoDBExporter、MSSQLExporter等
硬件 ApcupsdExporter、IoTEdisonExporter、IPMIExporter、NodeExporter等
消息队列 BeanstalkdExporter、Kafka Export、NSQ Explorer、RabbitMQExporter等
存储 Ceph Exporter、Gluster Exporter、HDFS Exporter、ScaleIOExporter等
HTTP服务 ApacheExporter、HAProxyExporter等
API服务 AWS ECS Exporter、Docker Club Explorer Hub Exporter、GitHub Exporter等
日志 FluentdExporter等
监控系统 CollectdExporter、GraphiteExporter、InfluxDB Exporter等
其它 Blackbox Exporter、JIRA Exporter、Jenkins Exporter、Confluence Exporter等

服务端存储查询

对于采集到的数据,他们拥有非常独特的特征,都是以时间为单位排列的,数据相对来说非常的简单,并不存在复杂的结构,比如:

{
  // 时间戳
  "timestamp": 1599125492,
  // 指标名称
  "metric": "total_website_visitors",
  // 标签
  "tags": {
    "host": "steamaple",
    "job": "greenbird"
  },
  // 指标值
  "value": 10110
}

但同时数据量又是海量的,所以对于这种数据,首先我们的数据库需要支持海量数据的存储以及查询,其次,我们允许丢失非常早期的数据,毕竟我们要分析的数据都是最新的数据,所有的数据都是多写少读,都是顺序增加,不会乱序,支持再采样,也就是支持对数据进行分析加工来减少数据存储占用的空间。

那么这样的数据库就是时序数据库,prometheus 本身就可以当做一种时序数据库来使用。

终端监控预警

当我们收集数据并且存储数据之后,最重要的就是数据的分析以及监控预警,因为这是分析的结果,也是我们要的结果

大多是 Prometheus 配合 Grafana 来进行展示数据的,Grafana 是一个可视化工具,可以展示数据,并且可以进行数据分析,当然你可以使用 ELK 中的 Kibana,也可以使用其他的可视化工具,比如 Tableau,PowerBI 等。

另一个重要的功能就是预警,Prometheus 提供了专门用于预警的 Alert Manager,可以设置某个指标在多长时间内、达到何种条件就会触发预警状态,在触发预警后,Alert Manager 就会根据路由中配置的接收器,比如邮件接收器、Slack 接收器、微信接收器,或者 WebHook 接收器来自动通知