目录

Prometheus

/pro’miθɪəs/ 普罗米修斯(希腊神话中人名,为人类盗火种甘受罚)

Prometheus 是一个云原生计算基金会项目,是一个系统和服务监控系统。它以给定的时间间隔从配置的目标收集指标,评估规则表达式,显示结果,并在观察到指定条件时触发警报。

Prometheus 是用于事件监控和警报的免费软件应用程序。[2]它在使用HTTP拉取模型构建的时间序列数据库(允许高维)中记录实时指标,具有灵活的查询和实时警报。

该项目是用Go编写的,并在 Apache 2 许可下获得许可,源代码可在GitHub 上获得,是云原生计算基金会的毕业项目,与 Kubernetes 和 Envoy 一起毕业。

Prometheus 于2016年正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。

Prometheus 将其指标收集并存储为时间序列数据,即指标信息与记录时的时间戳以及称为标签的可选键值对一起存储。

特性

Prometheus 与其他指标和监控系统的区别在于:

  • 多维数据模型(由指标名称和键/值维度集定义的时间序列)
  • PromQL,一种强大且灵活的查询语言,可利用此维度
  • 不依赖分布式存储;单个服务器节点是自治的
  • 用于时间序列收集的 HTTP拉取模型
  • 通过用于批处理作业的中间网关支持推送时间序列
  • 通过服务发现或静态配置发现目标
  • 图形和仪表板支持的多种模式
  • 支持分层和水平联合

什么是指标(metrics)?

用外行的话来说,指标是数字测量,时间序列意味着随着时间的推移记录变化。用户想要测量的内容因应用程序而异。对于 Web 服务器,它可能是请求时间,对于数据库,它可能是活动连接数或活动查询数等。

指标在理解为什么您的应用程序以某种方式工作方面起着重要作用。假设您正在运行一个 Web 应用程序并发现该应用程序很慢。您将需要一些信息来了解您的应用程序发生了什么。例如,当请求数量很高时,应用程序可能会变慢。如果您有请求计数指标,您可以找出原因并增加服务器数量来处理负载。

Metrics指标类型以及使用场景:

  • Counter(计数器),只增不减的计数器
  • Gauge(仪表盘),可增可减的仪表盘
  • Histogram(直方图),自带 buckets 区间用于统计分布统计图
  • Summary(摘要), 客户端定义的数据分布统计图

组件

Prometheus 生态系统由多个组件组成,其中许多是可选的:

  • 主要的 Prometheus Server,用于抓取和存储时间序列数据
  • Client Library: 为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server
  • Push Gateway: 主要用于短期的jobs
  • exporters: 用于暴露已有的第三方服务 HAProxy、StatsD、Graphite 的 metrics 给 Prometheus。
  • alertmanager: 用于处理告警
  • 各种支持工具

大多数 Prometheus 组件都是用Go编写的,这使得它们易于构建和部署为静态二进制文件。

工作流程:

  1. Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
  2. Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
  3. Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
  4. 在图形界面中,可视化采集数据。

Prometheus Server

Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。 Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。其次Prometheus Server需要对采集到的监控数据进行存储,Prometheus Server本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。最后Prometheus Server对外提供了自定义的PromQL语言,实现对数据的查询以及分析。

Prometheus Server内置的Express Browser UI,通过这个UI可以直接通过PromQL实现数据的查询以及可视化。

Prometheus Server的联邦集群能力可以使其从其他的Prometheus Server实例中获取数据,因此在大规模监控的情况下,可以通过联邦集群以及功能分区的方式对Prometheus Server进行扩展。

Exporters

Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。

一般来说可以将Exporter分为2类:

  • 直接采集:这一类Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
  • 间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。

AlertManager

在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。在AlertManager中我们可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。AlertManager即Prometheus体系中的告警处理中心。

PushGateway

由于Prometheus数据采集基于Pull模型进行设计,因此在网络环境的配置上必须要让Prometheus Server能够直接与Exporter进行通信。 当这种网络需求无法直接满足时,就可以利用PushGateway来进行中转。可以通过PushGateway将内部网络的监控数据主动Push到Gateway当中。而Prometheus Server则可以采用同样Pull的方式从PushGateway中获取到监控数据。

架构

此图说明了 Prometheus 的架构及其一些生态系统组件:

/images/cloud-native/prometheus/architecture.png

Prometheus 从检测作业中直接或通过中间推送网关从短期作业中抓取指标。它在本地存储所有抓取的样本,并对这些数据运行规则,以从现有数据聚合和记录新的时间序列或生成警报。Grafana或其他 API 使用者可用于可视化收集的数据。

架构图:

/images/cloud-native/prometheus/prometheus.svg

Prometheus 的典型监控平台由多个工具组成:

  • 通常在受监控主机上运行以导出本地指标的多个导出器。
  • Prometheus 集中和存储指标。
  • Alertmanager 根据这些指标触发警报。
  • Grafana 用于生成仪表板。
  • PromQL 是用于创建仪表板和警报的查询语言。