Prometheus 既是一个时序数据库,又是一个监控系统,更是一套完备的监控生态解决方案。
一、 Prometheus 主要特点
Prometheus 与其他监控系统相比,它的主要特点:
- 通过 PromQL 实现多维度数据模型的灵活查询
- 定义了开放指标数据的标准,自定义探针(如 Exporter 等),编写简单方便
- PushGateway 组件让这款监控系统可以接收监控数据
- 提供了 VM 和容器化的版本
Prometheus 的局限性:
- Prometheus 主要针对性能和可用性监控,不适用于针对日志(Log)、事件(Event)、调用链(Tracing)等的监控
- Prometheus 关注的是近期发生的事情,而不是跟踪数周或数月的数据。Prometheus 认为最有用的数据是最近的数据,监控数据默认保留 15 天
- 本地存储有限,存储大量的历史数据需要对接第三方远程存储
- 采用联邦集群的方式,并没有提供统一的全局视图
- Prometheus 的监控数据并没有对单位进行定义
- Prometheus 对数据的统计无法做到 100% 准确
- Prometheus 默认是拉模型,建议合理规划网络,尽量不要转发
二、 Prometheus 架构
2.1 Job/Exporter
Job/Exporter 属于Prometheus target,是 Prometheus 监控的对象。 Job 分为长时间和短时间两种,长时间执行的Job 可使用 Prometheus Client 集成进行监控;短时间执行的Job 可将监控数据推送到 PushGateway 中缓存。 Exporter 用于第三方系统的监控,其机制是将第三方系统的监控数据按照 Prometheus 的格式暴露出来,没有 Exporter 的第三方系统可以自己定制 Exporter。当 Exporter 越来越多的时候,可以考虑使用 Telegraf 统一管理。
2.2. Pushgateway
Prometheus 以拉模式为主,推模式是通过 Pushgateway 组件实现的。Pushgateway 是支持临时性 Job 主动推送指标的中间网关,它本质上是一种用于监控 Prometheus 服务器无法抓取的资源的解决方案。
Pushgateway 作为独立的服务,位于被采集监控指标的应用程序和 Prometheus 服务器之间。它的主要使用场景:
- 临时/短作业
- 批处理作业
- 应用程序与 Prometheus 服务器之间有网络隔离,如 安全性(防火墙)、连接性(不在一个网段)
Pushgateway 的缺点:
- 它会丢失 Prometheus 服务器提供的很多功能,如UP 指标和指标过期时进行实例状态监控
- 单点故障问题
- 不会自动删除推送给它的任何指标数据,因此必须使用Pushgateway 的api 从推送网关中删除过期的指标
- 防火墙和NAT 问题,推荐将 Prometheus 移到防火墙后面以便更加接近采集目标
Pushgateway 会丧失 Prometheus 通过 UP 指标检查实例监控状况的功能,此时 Prometheus 对应的拉状态的 UP 指标只是针对单 Pushgateway 服务的。
2.3. 服务发现
对于支持文件的服务发现,实践场景下可以与自动化配置管理工具(Ansible、Crontab等)结合使用。除了支持文件的服务发现(Prometheus 周期性地从文件中读取最新的target 信息)外,还支持多种常见的服务发现组件,如 Kubernetes、DNS、ZooKeeper等。通过服务发现的方式,管理员可以在不重启 Prometheus 服务的情况下动态发现需要监控的 target 信息。
服务发现中的 Relabeling 机制会从 Prometheus 包含的target 实例中获取默认的元标签信息,从而对不同开发环境、不同业务团队、不同组织等按照某些规则(如标签)从服务发现注册中心返回的 target 实例中有选择性的采集某些 Exporter 实例的监控数据。
2.4. Prometheus 服务器
主要功能:
- 抓取:Prometheus Server 通过服务发现组件,周期性地从Job、Exporter、Pushgateway 中通过HTTP轮询的形式拉取监控指标数据
- 存储:抓取到的监控数据通过一定的规则清洗和整理数据(抓取前使用服务发现提供的relabel_configs 方法,抓取后使用作业内的 metrics_relabel_configs 方法),会把得到的结果存储到新的时间序列中进行持久化。
- 本地存储:会直接保留到本地磁盘,建议使用SSD 且不要保存超过一个月的数据。任何版本的 Prometheus 都不支持 NFS(有损坏或丢失历史数据的风险)
- 远程存储:适用于存储大量的监控数据。支持OpenTSDB、InfluxDB、ES、Kafka、Postgresql等
- 查询:持久化数据以后,客户端就可以通过 PromQL 语句对数据进行查询
2.5. Dashboard
Web UI、Grafana、API Client 都算是 Prometheus 的Dashboard
2.6. Alertmanager
Alertmanager 是独立于 Prometheus 的一个告警组件,需要单独安装部署。它接收 Prometheus 推送过来的告警,用于管理、整合和分发告警到不同的目的地。