Prometheus 概念
Prometheus既是一个时序数据库,又是一个监控系统,更是一套完备的监控生态解决方案。
# Prometheus 的主要特点
最主要的特色:
- 通过PromQL实现多维度数据模型的灵活查询。
- 定义了开放指标数据的标准,自定义探针(如Exporter等),编写简单方便
- PushGateway组件让这款监控系统可以接收监控数据
- 提供了VM和容器化的版本
除了上述4种特色之外,Prometheus还有如下特点。
- 采用拉模式为主、推模式为辅的方式采集数据。
- 二进制文件直接启动,也支持容器化部署镜像。
- 支持多种语言的客户端。
- 支持本地和第三方远程存储,单机性能强劲,可以处理上千target及每秒百万级时间序列。
- 高效的存储。平均一个采样数据占3.5B左右,共320万个时间序列,每30秒采样一次,如此持续运行60天,占用磁盘空间大约为228GB。
- 可扩展。可以在每个数据中心或由每个团队运行独立Prometheus Server。也可以使用联邦集群让多个Prometheus实例产生一个逻辑集群,当单实例Prometheus Server处理的任务量过大时,通过使用功能分区(sharding)+联邦集群(federation)对其进行扩展。
- 精确告警。Prometheus基于灵活的PromQL语句可以进行告警设置、预测等,另外它还提供了分组、抑制、静默等功能防止告警风暴。
Prometheus也存在一些局限性,主要包括如下方面。
- Prometheus主要针对性能和可用性监控,不适用于针对日志(Log)、事件(Event)、调用链(Tracing)等的监控。
- Prometheus关注的是近期发生的事情,而不是跟踪数周或数月的数据。因为大多数监控查询及告警都针对的是最近(通常不到一天)的数据。Prometheus认为最有用的数据是最近的数据,监控数据默认保留15天。
- 本地存储有限,存储大量的历史数据需要对接第三方远程存储。
- 采用联邦集群的方式,并没有提供统一的全局视图。
- Prometheus的监控数据并没有对单位进行定义。
- Prometheus对数据的统计无法做到100%准确,如订单、支付、计量计费等精确数据监控场景。
- Prometheus默认是拉模型,建议合理规划网络,尽量不要转发。
# Prometheus 的架构
下图为 Prometheus 的架构图,它展现了 Prometheus 内部模块及相关的外围组件之间的关系。
Prometheus 主要由 Prometheus Server、Pushgateway、Job/Exporter、Service Discovery、Alertmanager、Dashboard 这6个核心模块构成。Prometheus通过服务发现机制发现target,这些目标可以是长时间执行的Job,也可以是短时间执行的Job,还可以是通过Exporter监控的第三方应用程序。被抓取的数据会存储起来,通过PromQL语句在仪表盘等可视化系统中供查询,或者向Alertmanager发送告警信息,告警会通过页面、电子邮件、钉钉信息或者其他形式呈现。
Prometheus的基本原理是通过HTTP协议周期性获取被监控组件的状态信息,任意组件只要提供HTTP接口就可以接入监控系统内,不需要如SDK的集成过程,这就使得Prometheus可以更好地适应虚拟化,如VM或Docker容器的环境集成。当使用者监控的服务出现故障时,它可以快速定位和诊断问题。每个Prometheus服务器都是独立的,不依赖于网络存储或其他远程服务。当基础架构的其他部分损坏时,可以快速恢复,并且不需要设置大量的基础依赖架构。
# 核心组件
# Prometheus服务器
Prometheus服务器 (server) 是Prometheus架构中的核心组件,基于Go语言编写而成,无第三方依赖关系,可以独立部署在物理服务器、云主机、Docker容器内。主要用于收集每个目标数据,并存储为时间序列数据,对外可提供数据查询支持和告警规则配置管理。
Prometheus服务器可以对监控目标进行静态配置管理或动态配置管理,它将监控采集到的数据按照时间序列存储在本地磁盘的时序数据库中 (当然也支持远程存储) ,自身对外提供了自定义的PromQL语言,可以对数据进行查询和分析。
# Job/Exporter
Job分为长时间执行和短时间执行两种。对于长时间执行的Job,可以使用Prometheus Client集成进行监控;对于短时间执行的Job,可以将监控数据推送到Pushgateway中缓存。
用于输出被监控组件信息的HTTP接口统称为Exporter (导出器) 。目前互联网公司常用的组件大部分都有Exporter供直接使用,比如Nginx、MySQL、Linux系统信息 (包括磁盘、内存、CPU、网络等) 。
Exporter是Prometheus系统中重要的组成部分。在实际中收集监控样本数据都是由Exporter完成的。Exporter可以是一个独立运行的进程,对外提供一个用于获取监控数据的HTTP服务。
Prometheus server只需要定时通过这些Exporter提供的HTTP服务获取监控数据即可。可以类似理解为我们传统意义上的被监控目标的agent,只是区别在于Exporter不会主动推送监控数据到Prometheus server。
# Pushgateway
Pushgateway是指用于支持短期临时或批量计划任务工作的数据汇聚节点。主要用于短期的Job,此类Job存在的时间较短,可能在Prometheus来pull之前就自行消失了。所以针对这类Job,设计成可以直接向Pushgateway推送metric,这样Prometheus服务器端便可以定时去Pushgateway拉取metric。
另外当某应用系统的网络环境中,Prometheusserver和Exporter不能进行直接互通,我们可以使用Pushgateway来进行中转。
# Alertmanager
Alertmanager主要用于处理Prometheus服务器端发送的alerts信息,对其去除重数据、分组并路由到正确的接收方式,发出告警。它支持的告警通知方式非常丰富,常见的通知方式有电子邮件、pagerduty、OpsGenie,webhook等,还可以控制告警的静音和抑制。
Prometheus可以将多个Alertmanager配置为一个集群,通过服务发现动态发现告警集群中节点的上下线从而避免单点问题,Alertmanager也支持集群内多个实例之间的通信。