Created
Jun 6, 2024 03:36 AM
Tags
Prometheus
‣‣
什么是 Prometheus ?
Prometheus 是一个开源的报警系统和监控工具包,是由 SoundCloud 公司开发的 开源监控报警系统 和 时序数据库(TSDB) 。Prometheus 使用 Go 语言开发,是 Google BorgMon 监控系统的开源版本。从 2012 年成立以来,许多公司和组织都采用 Promethues,并且该项目有着很活跃的社区和开发者;现在是一个开源项目,可以独立于任何公司进行维护;2016年 Prometheus 成为继 Kubernetes 之后第二个加入 Linux 基金会旗下的原生云基金会 Cloud Native Computing Foundation 的托管项目。
各监控系统对比
监控方案 | 数据收集 | 自动发现 | 侧重点 | 数据展示方案 | 贴合云原生 |
Cacti | SNMP | 插件支持 | 数据展示 | RRDTOOL | 差 |
Nagios | 各种脚本插件 | 脚本插入 | 状态展示 | 阈值 | 差 |
Zabbix | zabbix-agent 为主 | 主机地址自动发现 | 状态、数据展示 | PHP | 中等 |
Prometheus | Exporter为主 | 各种模式支持,最为完善 | 以时间序列保存数据 | 通过结合 Grafana 进行结合展示 | 优秀 |
特性
- 由 metric 名称和 K/V 键值对标识的时间序列的多维数据模型
- 简单的查询语言 PromQL(TSDB数据库的查询语言)
- 不依赖分布式存储,单个服务节点自动治理
- 通过 http 的 pull 模型获取数据的时序集合
- 支持通过网关 push 时序数据
- 通过服务发现或者静态配置发现目标
- 支持多种图表和仪表盘模式
架构图
组件
- Prometheus Server
负责定时去目标抓取 metrics (指标)数据,每个被抓取对象需要开放一个 http 服务接口;pull 下来的数据经过整理后写入到本地的时序数据库(TSDB)中。
- Client Library
客户端类库(例如官方提供的:Go,Python,Java等),为需要监控的服务产生相应的 metrics数据并开放一个http服务接口给 Prometheus Server。
目前很多软件原生就支持 Prometheus ,提供了 metrics 数据,可以直接使用 Prometheus pull 。对于像操作系统不提供提供 metrics 数据的情况,可以使用exporter ,或者自己开发 exporter 来提供 metrics 数据服务。
- Node Exporter
泛指能向 Prometheus 提供监控的 metrics 数据的都可以称为一个 exporter。一个 exporter 的实例称为 target ,exporter 来源主要2个方面,一个是社区提供的,一种是用户自定义的。主要用来支持其他数据源的 metrics 数据导入到 Prometheus ,支持数据库、硬件、消息中间件、存储系统、HTTP 服务器、jmx 等。
- PushGateway
主要用于临时性的 short-lived job。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。对此类 jobs 定时将 metrics 数据 push 到 pushgateway 上,再由 Prometheus Server 从 Pushgateway 上 pull 到本地。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices ,需要使用 node exporter。
- Promdash 和 Grafana
Prometheus 内置一个简单的 Web 控制台 Promdash ,可以查询 metrics 数据,查看配置信息或者 Service Discovery 等,实际工作中,查看指标或者创建仪表盘通常使用 Grafana ,Prometheus 作为 Grafana 的数据源。
- alertmanager
从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对应的接受方式上,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
- PromQL
是 Prometheus TSDB 的查询语言。是结合 Grafana 进行数据展示和告警规则的配置的关键部分。
工作过程
- Prometheus Daemon 负责定时去被监控目标上抓取 metrics 数据,每个抓取目标需要暴露一个 http 服务的接口给它定时抓取。Prometheus 支持通过配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup 等方式指定抓取目标。Prometheus 采用 PULL 的方式进行监控,即服务器可以直接通过目标 PULL 数据或者间接地通过中间网关来 Push 数据。
- Prometheus 在本地处理抓取到的所有数据,并通过一定规则进行整理数据,并把得到的结果存储到新的时间序列中。
- Prometheus 通过 PromQL 和其他 API 可视化地展示收集的数据。Prometheus 支持很多方式的图表可视化,例如 Grafana、自带的 Promdash 以及自身提供的模版引擎等等。Prometheus 还提供 HTTP API 的查询方式,自定义所需要的输出。
- PushGateway 支持 Client 主动推送 metrics 到 PushGateway,而 Prometheus 只是定时去 Gateway 上抓取数据。
- Alertmanager 是独立于 Prometheus 的一个组件,可以支持 Prometheus 的查询语句,提供十分灵活的报警方式。
PromQL 查询语言
PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多。使用它可以对时序数据进行筛选和聚合。
PromQL 语法
- 数据类型
- 瞬时向量 (Instant vector)
- 区间向量 (Range vector)
- 标量数据 (Scalar)
- 字符串 (String)
PromQL 表达式计算出来的值有以下几种类型:
一组时序,每个时序只有一个采样值
一组时序,每个时序包含一段时间内的多个采样值
一个浮点数
一个字符串,暂时未用
- 时序选择器
2.1 瞬时向量选择器:瞬时向量选择器用来选择一组时序在某个采样点的采样值
1673464715153
2.2 区间向量选择器:区间向量选择器类似于瞬时向量选择器,不同的是它选择的是过去一段时间的采样值。
1673464768839
2.3 偏移修饰器
前面介绍的选择器默认都是以当前时间为基准时间,偏移修饰器用来调整基准时间,使其往前偏移一段时间。偏移修饰器紧跟在选择器后面,使用 offset 来指定要偏移的量。
1673465572627
1673465605210
2. PromQL操作符(了解)
- 二元操作符
PromQL 的二元操作符支持基本的逻辑判断和算术运算,包含算术类、比较类和逻辑类三大类
1.1 算术类二元操作符
1.2 比较类二元操作符
1.3 逻辑类二元操作符
1.4 二元操作符优先级
- 向量匹配
前面算术类和比较类操作符都需要在向量之间进行匹配。共有两种匹配类型,
one-to-one
和 many-to-one
| one-to-many
2.1 One-to-one 向量匹配
2.2 Many-to-one / one-to-many 向量匹配
- 聚合操作符
PromQL 的聚合操作符用来将向量里的元素聚合得更少。总共有下面这些聚合操作符:
3. PromQL函数(了解)
Prometheus 内置了一些函数来辅助计算,下面介绍一些典型的