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编写的,这使得它们易于构建和部署为静态二进制文件。
工作流程:
- Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
- Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
- Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
- 在图形界面中,可视化采集数据。
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 的架构及其一些生态系统组件:
Prometheus 从检测作业中直接或通过中间推送网关从短期作业中抓取指标。它在本地存储所有抓取的样本,并对这些数据运行规则,以从现有数据聚合和记录新的时间序列或生成警报。Grafana或其他 API 使用者可用于可视化收集的数据。
架构图:
Prometheus 的典型监控平台由多个工具组成:
- 通常在受监控主机上运行以导出本地指标的多个导出器。
- Prometheus 集中和存储指标。
- Alertmanager 根据这些指标触发警报。
- Grafana 用于生成仪表板。
- PromQL 是用于创建仪表板和警报的查询语言。