Prometheus(监控报警系统) 的学习笔记
文章目录
- Prometheus(监控报警系统) 的学习笔记
- 1. 简介
- 组件及架构
- 组件
- 架构
- 工作流程
- Prometheus配置
- 2. prometheus 数据模型
- 指标类型
- 作业job 和实例 targets/instance
- prometheusQL (数据查询语言也是时序数据库使用语言)
- 3. 表达式浏览器(promQL过滤使用)
- 4. PromQL
- 1. 概述
- 2. PromQL的数据类型
- 3. PromQL 基础用法
- 完全匹配
- 正则匹配
- 范围查询
- 瞬间向量
- 区间向量
- 时间位移操作
- 聚合操作
- 标量
- 字符串
- 4. PromQL 操作符
- 数学运算符
- 布尔运算符
- 集合运算符
- and 与操作
- or 或操作
- unless 排除操作
- 操作符优先级
- 5. PromQL 聚合操作
- sum 求和
- min 最小值
- max 最大值
- avg 平均值
- stddev 标准差
- count 计数
- bottomk 后几条
- topk 前几条
- 6. PromQL 内置函数
- abs 绝对值
- absent 判断指标名称或标签是否有值
- absent_over_time 和 absent 类似,只是多了一个时间范围
- ceil 四舍五入
- changes 返回区间变量每个样本值变化的次数
- delta 计算区间向量第一个值和最后一个值的差值
- floor 向下取整
- increase 返回区间向量第一个和最后一个样本的增量值
- rate 计算区间向量 v 在时间窗口内平均每秒增长速率
- irate 计算区间向量的增长率,但是它反应的是瞬时增长率
- predict_linear 预测时间序列在n秒后的值
- sort 对向量按元素的值进行升序排序
- sort_desc 对向量按元素的值进行降序排序
- 7. 字面量
- 字符串字面量
- 浮点数字面量
- 8. 时间序列选择器
- 即时向量选择器
- 指标名称和匹配器的组合
- 匹配器
- 区间向量选择器
- 时间格式
- 偏移量修改器
1. 简介
Prometheus是一个最初在SoundCloud上构建的开源系统监控和警报工具包。
从2012年开始,许多公司和组织开始使用prometheus,该项目拥有非常活跃的开发人员和用户社区。目前它是一个独立的开源项目,并且不依赖于任何公司。为了强调这一点,并澄清项目的治理结构,Prometheus在2016年加入Cloud Native Computing Foundation,作为kubernetes 之后的第二个托管项目。
Exporter是一个采集监控数据并通过Prometheus监控规范对外提供数据的组件,能为Prometheus提供监控的接口。
Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint 端点,即可获取到需要采集的监控数据。不同的Exporter负责不同的业务。
prometheus官网 windows64位下载想要的版本,下载后直接解压,解压后进入目录运行premetheus.exe,然后本机浏览器访问127.0.0.1:9090。
若需要监控服务器资源、数据库、kafka等需要下载对应的exporter。如windows_exporter 可以监控windows的一些指标参数,下载地址为windows_exporter,下载msi文件直接运行即可成功安装,默认端口是9182,然后到 prometheus 安装目录修改配置文件 prometheus.yml,修改配置文件后重启prometheus。State 为 up 表示正常监控,状态为 down 表示未检测到。
linux 常用的有 node_exporter:监控服务器资源,mysqld_exporter:监控数据库。下载后放到需要监控的及其,直接运行,然后到prometheus 安装目录修改配置文件 prometheus.yml,添加exporter对应的ip 以及端口,node_exporter 默认端口是9100,mysqld_exporter默认端口9104
特点
- 多维数据模型(时间序列数据由metric和一组key/value 组成)
- 在多维度上灵活的查询语言(PromQl)
- 不依赖分布式存储,单主节点工作,支持本地和远程存储
- 可以通过服务发现或者静态配置去获取要采集的目标服务器
- 多种可视化图表及仪表盘支持
组件及架构
组件
prometheus生态系统由多个组件组成,其中许多组件是可选的。
- prometheus server:主要获取和存储时间序列数据
- exporters:主要是作为agent收集数据发送到prometheus server,不同的数据收集由不同的exporters实现,如监控主机有node-exporters,mysql有MySQL server exporters…
- pushgateway:推送网关,用于接收各节点推送的数据并暴露给Prometheus server。允许短暂和批处理的jobs推送它们的数据到prometheus;由于这类工作的存在时间不够长,所以需要他们主动将数据推送到pushgateway,然后由pushgateway将数据发送到prometheus。
- alertmanager:实现prometheus 的告警功能。处理由客户端应用程序(如Prometheus server)发送的警报。它负责将重复数据删除,分组和路由到正确的接收者集成,还负责沉默和抑制警报。
架构
下图说明了Prometheus及其生态系统组建的一些架构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7B2DLL1j-1661430855705)(D:\桌面备份\笔记\文档图片\20180625171504139-1661138957058.png)]
prometheus 直接或通过pushgateway抓取数据。将数据存储在本地,并对这些数据运行规则,以便从现有数据聚合和记录新时间序列,或者生成警报。grafana等可用于可视化数据。
prometheus的使用场景:
prometheus非常适合记录任何纯数字时间序列。它既适合以机器为中心的监视,也适合监视高度动态的面向服务的体系结构。在微服务世界中,它对多为数据收集和查询的支持是一种特别饿优势。
prometheus 的设计旨在提高可靠性,使其成为中断期间要使用的系统,从而使您能够快速诊断问题。每个prometheus服务器都是独立的,而不依赖于网络存储或其他远程服务,当基础设施部分出现问题时仍然可以使用它。
工作流程
其大概的工作流程是:
- Prometheus Server直接从HTTP接口或者Pushgateway拉取指标(Metric)数据。
- Prometheus Server 在本地存储所有采集的指标(Metric)数据,并在这些数据上运行规则,从现有数据中聚合和记录新的时间序列,或者生成告警。
- Alertmanager根据配置文件,对接收到的告警进行处理,发出报警。
- 在Grafana或其他API客户端中,可视化收集的数据。
指标(Metric):由指标名称 和描述当前数据特征的标签组成。
指标格式:<指标名称>{<标签名称>=<标签值>,…}
指标名称(Metric Name)可以反映被监控数据的含义。指标名称只能由ASCII字符、数字、下划线以及冒号组成并必须符合正则表达式
[a-zA-Z_:][a-zA-Z0-9_:]*
。
标签(Label)反映了当前数据的特征维度,通过这些维度Prometheus可以对数据进行过滤,聚合等操作。标签的名称只能由ASCII字符、数字以及下划线组成并满足正则表达式[a-zA-Z_][a-zA-Z0-9_]*
。
Prometheus配置
prometheus 的配置文件 prometheus.yml
,它主要分为以下几个配置块:
- 全局配置 global
- 告警配置 alerting
- 规则文件配置 rule_files
- 拉取配置 scrape_configs
- 远程读写配置 remote_read、remote_write
全局配置 global
global
指定在所有其他配置上下文中有效的参数。还可用作其他配置部分的默认设置。
global:
# 默认拉取频率
[ scrape_interval: <duration> | default = 1m ]
# 拉取超时时间
[ scrape_timeout: <duration> | default = 10s ]
# 执行规则频率
[ evaluation_interval: <duration> | default = 1m ]
# 通信时添加到任何时间序列或告警的标签
# external systems (federation, remote storage, Alertmanager).
external_labels:
[ <labelname>: <labelvalue> ... ]
# 记录PromQL查询的日志文件
[ query_log_file: <string> ]
告警配置 alerting
alerting
指定与Alertmanager相关的设置。
alerting:
alert_relabel_configs:
[ - <relabel_config> ... ]
alertmanagers:
[ - <alertmanager_config> ... ]
规则文件配置 rule_files
rule_files
指定 prometheus 加载的任何规则的位置,从所有匹配的文件中读取规则和告警。目前没有规则。
rule_files:
[ - <filepath_glob> ... ]
拉取配置 scrape_configs
scrape_configs
指定prometheus 监控哪些资源。默认会拉取prometheus 本身的时间序列数据。通过http://localhost:9090/metrics
进行拉取。
一个 scrape_config
指定一组目标和参数,描述如何拉取它们。在一般情况下,一个拉取配置指定一个作业。在高级配置中,这可能会改变。
可以通过static_configs
参数静态配置目标,也可以使用支持的服务发现机制之一动态发现目标。
此外,relabel_configs
在拉取之前,可以对任何目标及其标签进行修改。
远程读写配置 remote_read/remote_write :
remote_read/remote_write 将数据源与 prometheus分离,当前不做配置。
# 与远程写功能相关的设置
remote_write:
[ - <remote_write> ... ]
# 与远程读功能相关的设置
remote_read:
[ - <remote_read> ... ]
2. prometheus 数据模型
- prometheus仅用键值方式存储时序式的聚合数据,他不支持文本信息
- 从每个target中会采集出很多指标,那么每个指标会暴露很多样本数据点,而这些数据点pro都需要存储,而这些指标会以固定时间间隔生成很多样本数据点。
①时序列标识:key+lables
②当前时间序列的样本值value
③这些标签可以作为过滤器进行指标过滤及聚合运算,如何从上万的数据过滤出关键有限的时间序列,同时从有限的时间序列在特定范围的样本,那就需要手动编写出时间序列的样本表达式来过滤出我们需求的样本数据。
指标类型
- 默认都是以双精度浮点型数据(服务端无数据量类型数据-类型是对客户端有意义的)
①Counter:计数器单调递增。值只能单调增加或重启时归零,可以用来表示处理的请求数、完成的任务数、出现的错误数量等。
②Gauge:仪表盘,有起伏特征的。值可以任意增加或减少,可以用来测量温度、当前北村使用等。
③Histogram:取样观测结果,一般用来请求持续时间或响应大小,并在一个可配置的分布区间(bucket)内计算这些结果,提供所有观测结果的总和。
累加的counter,代表观测区间:_bucket{le=“”}
所有观测值的总数:_sum
观测的事件数量:_count
④Summary:取样观测结果,一般用来请求持续事件或响应大小,提供观测次数及所有观测结果的综合,还可以通过一个滑动的时间窗口计算可分配的分位数
观测的事件流 φ-quantiles (0 ≤ φ ≤ 1):{quantile=“φ”}
所有观测值的总和:_sum
观测的事件数量:_count
作业job 和实例 targets/instance
①job:能够接受 prometheus server 数据;
②targets:每一个可以被监控的系统,称为targets,多个相同的targets的集合(类)称为job
③instance:实例与targets(类似)。与target相比,instance更趋近于一个具体可以提供监控数据的实例,而targets则更像一个对象,目标性质。
targets与 instance 区别:都代表了被监控端可以吐出监控数据的被监控端这个对啊行,targets更倾向于是一个集合,instance 更倾向于具体的被监控端
在prometheus中,一个可以拉去数据的端点叫做实例(instance),一般等同于一个进程。一组有着同样目标的实例(例如为弹性或可用性而复制的进程副本)叫做任务(job)。
PromQL :指标 {标签1=标签值1,…标签N=标签值N} 样本(值)
当prometheus 拉取目标时,它会自动添加一些标签到时间序列中,用于标识被拉去的目标:
job:目标所属的任务名称
instance:目标URL中的<host>:<port> 部分
如果两个标签在被拉取的数据中已经存在,那么就要看配置选项honor_labels
的值来决定行为了。
每次对实例的拉取。prometheus 会在以下的时间序列中保存一个样本(样本指的是在一个时间序列中特定时间点的一个值):
up{job="<job-name>", instance="<instance-id>"}:如果实例健康(可达),则为 1 ,否则为 0
scrape_duration_seconds{job="<job-name>", instance="<instance-id>"}:拉取的时长
scrape_samples_post_metric_relabeling{job="<job-name>", instance="<instance-id>"}:在 metric relabeling 之后,留存的样本数量
scrape_samples_scraped{job="<job-name>", instance="<instance-id>"}:目标暴露出的样本数量
prometheusQL (数据查询语言也是时序数据库使用语言)
- 支持两种向量,同时内置提供了一组用于数据处理的函数,来对样本数据进行基本的分析(AI算法、机器学习、深度学习来分析、预测系统之后的运行走势)
①即时向量:最近以此时间戳上跟踪的数据指标(一个时间点上的所有数据表示的是一个时间刻度)
即时向量选择器:返回0个1个 或者多个时间序列上在给定时间戳上的各自的一个样本,该样本成为即时样本
②时间范围向量:指定时间范围内所有时间戳上的数据指标(表示的是一组时间区间)
范围向量选择器:返回0个1个或多个时间序列上在给定时间范围内的各自的一组样本(范围向量选择器无法用于绘图)
支持多种即时向量组合形式,不支持多种时间范围向量组合形式
3. 表达式浏览器(promQL过滤使用)
1.表达式浏览器常规使用
在prometheusUI控制台上可以进行数据过滤。
eg:
- CPU使用总量
node_cpu_seconds_total
- 计算过去5分钟内的CPU使用速率
irate(node_cpu_seconds_total{cpu="0",mode="idle"}[5m])
irate:速率计算函数(灵敏度非常高)
node_cpu_seconds_totol:node节点CPU使用总量(指标)
mode=“idle” 空闲指标
5m:过去的5分钟内,所有CPU空闲数的样本值,每个数值做速率运算
{mode=“idle”} :整体成为标签过滤器
- 每台主机CPU在5分钟内的平均使用率
(1-avg(irate(node_cpu_seconds_total{cpu="0",mode="idle"}[5m]))by(instance))*100
avg:平均值
avg (irate (node_cpu_seconds_total{fmode=‘idle’ } [5m]): 可以理解为CPU空闲量的百分比
by(instance):表示的是所有节点
- 查询1分钟平均负载超过主机CPU数量两倍的时间序列
node_load1 > on (instance) 2 * count (node_cpu_seconds_total{mode='idle'})by (instance)
node_load5
node_load15
1、5、15分钟的cpu负载
一般来说以上的值不能长时间大于CPU核心数量
- 内存使用率
node_memory_MemTotal_bytes
node_memory_MemFree_bytes
node_memory_Buffers_bytes
node_memory_Cached_ bytes计算使用率:
可用空间:以上后三个指标之和
己用空间:总空间减去可用空间
使用率:己用空间除以总空间
4. PromQL
1. 概述
PromQL (Prometheus Query Language) 是Prometheus 内置的数据查询语言,它能实现对事件序列数据的查询、聚合、逻辑运算等。它并且被广泛应用在 Prometheus 的日常应用当中,包括对数据查询、可视化、告警处理当中。
简单来说,PromQL 广泛存在于以 Prometheus 为核心的监控体系中。所以需要用到数据筛选的地方,就会用到 PromQL。例如:监控指标的设置、报警指标的设置等等。
2. PromQL的数据类型
- Instant vector(即时向量):一组时间序列,每个事件序列包含一个样本,所有样本共享相同的时间戳。
- Range vector(范围向量):一组时间序列,其中包含每个时间序列随时间变化的一系列数据点。
- Scalar(标量):一个浮点型的数据值。
- String(字符串):一个字符串,当前没有使用到。
3. PromQL 基础用法
当 Prometheus 通过Exporter 采集到相应的监控指标样本数据后,可以通过PromQL 对监控样本数据进行查询。
当我们直接使用监控指标名称查询时,可以查询该指标下的所有事件序列。我们这里启动 Prometheus 服务器,并打开 http://localhost:19090/graph 地址。在查询框中,可以输入:prometheus_http_requests_total 并点击执行。
PromQL 支持用户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:完全匹配和正则匹配。
完全匹配
PromQL 支持使用 = 和 != 两种完全匹配模式。
- 通过使用 label=value 可以选择哪些标签满足表达式定义的时间序列。
- 通过使用 label!=value 则可以根据标签匹配排除时间序列。
比如上面查询除了所有指标名称为 prometheus_http_requests_total 的数据。这时候我们希望之查看错误的请求,即过滤掉所有code标签不是200的数据。那么我们的 PromQL 表达式可以修改为:prometheus_http_requests_total {code!=“200”}
正则匹配
PromQL 还可以使用正则表达式作为匹配条件,并且可以使用多个匹配条件。
- 正向匹配。使用 label=~regx 表示选择哪些标签符合正则表达式定义的时间序列。
- 反向匹配。使用 label!~regx 进行排除。
比如像查询指标 prometheus_http_requests_total 中,所有handler 标签以 /api/v1开头的记录,那么表达式为: prometheus_http_requests_total{handler=~“/api/v1/.*”}。
范围查询
瞬间向量
当直接通过类似 prometheus_http_requests_total 表达式查询时间序列时,同一个指标同一标签只会返回一条数据。这样的表达式我们称之为 瞬时向量表达式,而返回的结果称之为 瞬间向量。
区间向量
但当想查询一段时间范围内的样本数据,那么就需要用到 区间向量表达式,其查询出来的结果称之为 区间向量。时间范围通过时间范围选择器 [] 进行定义。
例如,通过以下表达式可以选择最近 5分钟内的所有样本数据:
prometheus_http_requests_total{}[5m]
除了使用 m 表示分钟以外,PromQL 的时间范围选择器支持其它时间单位:
- s - 秒
- m - 分钟
- h - 小时
- d - 天
- w - 周
- y - 年
时间位移操作
在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准:
# 瞬时向量表达式,选择当前最新的数据
prometheus_http_requests_total{}
# 区间向量表达式,选择以当前时间为基准,5分钟内的数据
prometheus_http_requests_total{}[5m]
如果想查询 5 分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢?这个时候就可以使用 位移操作,位移操作的关键字为 offset。
# 查询 5 分钟前的最新数据
http_request_total{} offset 5m
# 往前移动一天,查询一天前的数据
# 比如今天式2020-8-25 00:00:00
# 那么如下表达式查询的数据是:2022-8-23 至 2022-8-24 的数据
http_request_total{}[1d] offset 1d
聚合操作
一般情况下,通过PromQL 查询到的数据都是很多的。PromQL提供的聚合操作可以用来对这些时间序列进行处理,形成一条新的时间序列。
比如 原始的 prometheus_http_requests_total 指标,不加任何条件查询到的数据包含多条。
- 计算一共有几条数据
count(prometheus_http_requests_total) - 计算所有数据的value 总和
sum(prometheus_http_requests_total)
标量
在 PromQL 中,标量是一个浮点型的数字值,没有时序。例如:10。
需要注意的是,当使用表达式count(http_requests_total),返回的数据类型,依然是瞬时向量。用户可以通过内置函数 scalar() 将单个瞬时向量转换为标量。
如:scalar(sum(prometheus_http_requests_total))
字符串
在 PromQL 中,字符串是一个简单的字符串值。直接使用字符串作为 PromQL 表达式,则会直接返回字符串。
4. PromQL 操作符
PromQL 还支持丰富的操作符,用户可以使用这些操作符进一步的对事件序列进行二次加工。这些操作符包括:数学运算符,逻辑运算符,布尔运算符等等。
数学运算符
数学运算符比较简单,就是简单的加减乘除等。
比如 通过 prometheus_http_response_size_bytes_sum 可以查询到 Prometheus 这哥应用的 HTTP 响应字节总和。但这个单位是字节,如果想用MB显示,那么可以设置:prometheus_http_response_size_bytes_sum/8/1024 ,最终显示的数据就是以 MB 作为单位的数值。
PromQL 支持的所有数学运算符如下所示:
-
+
(加法) -
-
(减法) -
*
(乘法) -
/
(除法) -
%
(求余) -
^
(幂运算)
二元运算操作符可以在scalar/scalar(标量/标量)、vector/scalar(向量/标量)、和vector/vector(向量/向量)之间运算。
- 在两个标量之间运算:得到的结果也是一个标量。
- 在即时向量和标量之间运算:将运算符应用于这个向量中的每个数据样本的值。eg:如果时间序列即时向量乘以2,则结果是另外一个向量,另外一个向量中的值是原始向量的每个样本值乘以2。
- 在两个即时向量之间运算:运算符会依次找到与左边向量元素匹配(标签完全一致)的右边向量元素进行运算,如果没找到匹配元素,则直接丢弃。同时新的时间序列将不会包含指标名称。
布尔运算符
布尔运算符支持用户根据时间序列中样本的值,对时间序列进行过滤。例如 可以同故宫 prometheus_http_requests_total 查询出每个接口的请求次数。
如果想要筛选出请求次数超过 20 次的接口呢?可以采用如下的 PromQL 表达式:
prometheus_http_requests_total > 20
此时只是筛选出符合条件的数据,value 的值还是具体的数据。
如果想要对符合条件的数据,value变为1。不符合条件的数据,value 变为 0。那么可以使用 bool 修饰符,如下:
prometheus_http_requests_total > bool 20
此时并不过滤掉数据,只是将符合条件的value值变成了1,不符合的变成了0。
PromQL 支持以下布尔运算符:
-
==
(相等) -
!=
(不相等) -
>
(大于) -
<
(小于) -
>=
(大于等于) -
<=
(小于等于)
集合运算符
通过集合运算,可以在两个瞬时向量之间进行响应的集合操作。目前,Prometheus 支持以下集合运算符:
- and 与操作
- or 或操作
- unless 排除操作
and 与操作
vector1 and vector2 进行一个与操作,会产生一个新的集合。该集合中的元素同时在 vector1 和 vector2 中都存在。
例如有vector1 为 A B C,vector2 为 B C D,那么 vector1 and vector2 的结果为:B C。
or 或操作
vector1 or vector2 进行一个或操作,会产生一个新的集合。该集合中包含 vector1 和 vector2 中的所有元素。
例如有vector1 为 A B C,vector2 为 B C D,那么 vector1 or vector2 的结果为:A B C D。
unless 排除操作
vector1 unless vector2 进行一个排除操作,会产生一个新的集合。该集合中首先取 vector1 集合的所有元素,然后排除掉所有在 vector2 中存在的元素。
例如有vector1 为 A B C,vector2 为 B C D,那么 vector1 unless vector2 的结果为:A。
操作符优先级
在 PromQL 操作符中优先级由高到低依次为:
- ^
- *,/,%
- +,-
- ==,!=,<=,<,>=,>
- and,unless
- or
注意
优先级相同的运算符,一次从左往右进行运算,但是^
是从右开始的。
eg:
2 * 3 * 4 等价于 (2 * 3) * 4
2 ^ 3 ^ 4 等价于 2 ^ (3 ^ 4)
5. PromQL 聚合操作
Prometheus 还提供了聚合操作符,这些操作符作用于瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。目前支持的聚合函数有:
- sum (求和)
- min (最小值)
- max (最大值)
- avg (平均值)
- stddev (标准差)
- stdvar (标准方差)
- count (计数)
- count_values (对value进行计数)
- bottomk (后n条时序)
- topk (前n条时序)
- quantile (分位数)
sum 求和
用于对记录的 value 值进行求和。
比如:sum(prometheus_http_requests_total) 表示统计所有 HTTP 请求的次数。
min 最小值
返回所有记录的最小值。
比如:min(prometheus_http_requests_total) 会筛选出最小的记录值。
max 最大值
返回所有记录的最大值。
比如:max(prometheus_http_requests_total) 会筛选出最大的记录值。
avg 平均值
返回所有记录的平均值。
比如:avg(prometheus_http_requests_total) 会筛选出最大的记录值。
stddev 标准差
标准差(Standard Deviation) 常用来描述数据的波动大小。即为了反映一组数据,偏离平均值的程度。标准差越大,说明波动越大。
比如:stddev(prometheus_http_requests_total) 会计算出不同HTTP请求的数量波动情况。
count 计数
count 函数返回所有记录的计数。
比如:count(prometheus_http_requests_total) 表示统计所有HTTP 请求的次数。
bottomk 后几条
bottomk 用于对样本值进行排序,返回当前样本值后N位的时间序列。
比如:bottomk(5,prometheus_http_requests_total) 表示获取HTTP 请求量后5 位的请求
topk 前几条
topk 用于对样本值进行排序,返回当前样本值前 N 位的时间序列。
比如:topk(5,prometheus_http_requests_total) 表示获取HTTP 请求量前5 位的请求
6. PromQL 内置函数
PromQL 提供了大量的内置函数,可以对时序数据进行丰富的处理。例如 rate() 函数可以帮助我们计算监控指标的增长率,不需要我们去手动计算。
abs 绝对值
abs(v instant-vector)
返回输入向量的所有样本的绝对值。
absent 判断指标名称或标签是否有值
absent(v instant-vector)
有值:不返回数据
没有值:可能返回指标名称,值返回 1
示例:
# 指标名称存在数据
absent(up)
==> no data,指标名称存在,不返回数据
# 指标名称和标签名称值都存在数据
absent(up{job="prometheus"})
==> no data,指标名称和标签名称值都存在,不返回数据
# 指标名称和标签名称的值对应不上,即没有数据
absent(up{job="不存在的值"})
==> {job="不存在的值"} = 1,返回标签和值
# 指标名称不存在
absent(nonexistent{job="myjob"})
==> {job="myjob"} = 1
# 正则匹配的instance不作为返回的labels的一部分
absent(nonexistent{job="myjob",instance=~".*"})
==> {job="myjob"} = 1
# sum 函数返回的时间序列不带有标签,且没有样本数据
absent(sum(nonexistent{job="myjob"}))
==> {} = 1
absent_over_time 和 absent 类似,只是多了一个时间范围
absent_over_time(nonexistent{job="myjob"}[1h])
# => {job="myjob"}
absent_over_time(nonexistent{job="myjob",instance=~".*"}[1h])
# => {job="myjob"}
absent_over_time(sum(nonexistent{job="myjob"})[1h:])
# => {}
ceil 四舍五入
ceil(v instant-vector)
将 v 中所有元素的样本值向上四舍五入到最接近的整数。
node_load1 1.902324
ceil(node_load1) 2
changes 返回区间变量每个样本值变化的次数
changes(v range-vector)
# 如果1分钟内192.168.0.1:8080的样本值没有发生变化则返回1
changes(node_load1{instance="192.168.0.1:8080"}[1m]) # 结果为 1
delta 计算区间向量第一个值和最后一个值的差值
# 返回过去两小时的CPU的温度差
delta(cpu_temp_celsius{host="192.168.0.1"}[2h])
注意
该函数一般使用在gauge
类型的是时间序列上。
floor 向下取整
node_load1 1.902324
floor(node_load1) 1
increase 返回区间向量第一个和最后一个样本的增量值
# 返回区间向量中每个时间序列过去5分钟内HTTP请求数的增长数
increase(http_requests_total{job="prometheus"}[5m])
increase
的返回值类型只能是计数器类型,主要作用是增加图标和数据的可读性。使用rate
函数记录规则的使用率,以便持续跟踪数据样本值的变化。
rate 计算区间向量 v 在时间窗口内平均每秒增长速率
# 计算 prometheus_http_requests_total 在1分钟内平均每秒的增长速率
# 比如:1分钟内,共增长了1000个请求,那么美妙的增长速率为 1000/60
rate(prometheus_http_requests_total[1m])
注意:
- rate() 函数返回值类型只能用计数器,在长期趋势分析或者告警中推荐使用这个函数。
- 当rate() 函数和聚合函数一起使用时,需要先使用rate() 函数,在使用聚合函数。比如:先使用rate() 函数,在使用sum() 函数
irate 计算区间向量的增长率,但是它反应的是瞬时增长率
irate 函数是通过区间向量中 最后两个样本数据
来计算区间向量的增长速率,能够体现出更好的灵敏度,通过irate 函数绘制的图标能够更好的反应样本数据的瞬时变化状态。
# 计算 prometheus_http_requests_total 在1分钟内平均每秒的增长速率
# 比如:1分钟内,共增长了1000个请求,那么美妙的增长速率为 1000/60
rate(prometheus_http_requests_total[1m])
注意:
- irate() 函数不推荐在长期趋势分析或者告警中使用这个函数。
- 当irate() 函数和聚合函数一起使用时,需要先使用rate() 函数,在使用聚合函数。比如:先使用 rate() 函数,在使用sum() 函数
predict_linear 预测时间序列在n秒后的值
predict_linear(v range-vector,t scalar) 预测时间序列 v 在 t 秒后的值。它基于简单线性回归的方式,对时间窗口内的样本数据进行统计,从而可以对时间序列的变化趋势做出预测。该函数的返回结果 不带有度量指标,只有标签列表
# 预计磁盘在4个小时后是否被占满。
predict_linear(node_filesystem_free{job="prometheus"}[2h], 4 * 3600) < 0
注意:
- 该函数一般使用在
guage
类型的时间序列上。
sort 对向量按元素的值进行升序排序
# 样本值升序排序
sort(prometheus_http_requests_total)
sort_desc 对向量按元素的值进行降序排序
# 样本值倒序排序
sort_desc(prometheus_http_requests_total)
7. 字面量
字符串字面量
字符串可以使用’'(单引号),“”(双引号),``(反引号) 来表示。在单引号和双引号中,反斜杠成为了转义字符,后面可以跟着a,b,f,n,r,t,v 或者和\。
eg:
“this is a string”
‘these are unescaped: \n \ \t’
these are not unescaped: \n ' " \t
浮点数字面量
浮点数可以写成以下这种格式
[-+]?(
[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?
| 0[xX][0-9a-fA-F]+
| [nN][aA][nN]
| [iI][nN][fF]
)
eg:
23
-2.43
3.4e-9
0x8f
-Inf
NaN
8. 时间序列选择器
即时向量选择器
即使向量选择器允许在给定的时间戳(即时)上选择一组时间序列和每个样本的单个样本值。
组成部分
- 指标名称:用于限定特定指标下的时间序列,可选
- 匹配器:用于过滤时间序列上的标签,可选。定义在
{}
中。
指标名称和匹配器的组合
1、只给顶指标名称,或者在指标名称上指定空匹配器,浙江返回给定指标下的所有时间序列的即时样本数据。
eg:
up 等价于 up{}
2、只给顶匹配器,返回符合该匹配器的所有时间序列的即时样本。
eg:
{instance=~“.*”,job=“prometheus”}
3、同时指定指标名称和匹配器,返回符合给定指标名称和匹配器的即时样本。
eg:
up{job=“prometheus”}
注意
1、指标名称
和 匹配器
必须要选择一个。
匹配器
匹配器主要是用于标签过滤,目前支持如下4种格式。
-
=
:精确的匹配给定的标签值 -
!=
:不匹配给定的标签值 -
=~
: 正则表达式匹配给定的标签值 -
!~
:不匹配正则表达式给定的标签值
eg:
1、查询出指标名称up
中标签job
等于prometheus
的时间序列数据
up{job=“prometheus”}
2、查询出指标名称up
中标签job
不等于prometheus
的时间序列数据
up{job!=“prometheus”}
3、查询出指标名称up
中标签job
以pro
开头的时间序列数据
up{job=~“pro.*”}
4、查询出指标名称up
中标签job
不以pro
开头的时间序列数据
up{job!=~“pro.*”}
5、查询出指标名称up
中不存在标签env
的时间序列数据
up{env=“”}
6、查询指标名称是以prometheus
开头的搜友的时间序列数据
{name=~“prometheus.*”}
注意
-
=~
和!=
必须要指定一个标签名字或者匹配的标签必须要有值。eg:{job=~“”} 或者 {job=~“.*”} 都是错的。{job=“.+”}是正确的。 - 上方的正则表达式使用的语法是 RE2 语法
区间向量选择器
区间向量选择器和即时向量选择器大致类似,唯一的不同在于表达式之后需要跟一个[]
表达需要返回那个区间范围的时间序列数据。
up[5m] 表示查询5分钟时间内各实例的状态
时间格式
ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)、w(周)、y(年)
d
表示一天总是24小时
w
表示一周总是7天
y
表示一年总是365天
可以将多个不同的时间单位串联起来使用,但是大的时间单位必须在前面,小的时间单位在后面,且不同的事件单位只能出现一次。且不能是小数。
eg:1h30m可以,但是1.5h不可以。
偏移量修改器
默认情况下,即时向量和区间向量选择器都是以当前事件为准,但是偏移量修改器offset
可以修改该基准。偏移量选择器是紧跟在表达式之后使用 offset 来指定的。
eg:
1、表示获取指标名称prometheus_http_requests_total的所有时间序列在过去1分钟的即时样本。
prometheus_http_requests_total offset 1m
2、表示获取指标名称prometheus_http_requests_total的所有时间序列在距离此刻1分钟之前的5分钟之内的样本。
prometheus_http_requests_total[5m] offset 1m