prometheus promsql常用查询以及告警rule配置

网友投稿 807 2022-09-08

prometheus promsql常用查询以及告警rule配置

prometheus通过指标名称以及对应的一组标签唯一定义一条时间序列。指标名称反映了监控样本的基本标识,而label在基本特征上为采集到的数据提供了多种特征的维度。用户可以基于这些特征维度过滤,聚合,统计从而产生的新的计算后的一条时间序列。

PromQl是prometheus内值的数据查询语言,其提供对时间序列数据的丰富查询,聚合以及逻辑运算能力的支持。

数据类型

在表达式中,任何表达式或者子表达式都可以归为四种类型:

instant vector瞬时向量:一组时间序列,包含每个时间序列的单个样本,所有的时间序列都共享相同的时间戳range vector 向量范围,一组时间序列,包含每个时间序列随时间变化的一些列数据点scalar标量 一个简单的浮点值string字符串,一个当前没有被使用的简单字符串

瞬时向量

允许在给点的时间戳(即时)为每个选择一组时间和单个样本值。支持用户根据时间序列的标签值匹配模式来对时间序列进行过滤,目前主要支持两种模式,完全匹配和正则匹配

示例:

#通过标签查询promethesu_| 进行分离

示例:

#查询多个环节下的时间序列,promethesu_secondsm miniutesh hoursd daysw weeksy years

示例

promethesu_offset 5m#返回昨天一天的数据样本prometheus_offset 1d

标量浮点值

标量浮点值可以直接写成形式​​-​​[.(digtis)],标量只有一个数字,没有时许。

字符串string

直接使用字符串

操作符

数学运算

+ 加法- 减法* 乘法/ 除去% 求余数^ 幂运算#查询主机内存大小,返回的是bytes,转换成Gnode_memory_MemToal_bytes /1024/1024/1024#返回多块磁盘之间的读写ionode_disk_written_bytes_total + node_disk_read_bytes_total

布尔运算

支持用户根据时间序列中的样本的值,对时间序列进行过滤,经常使用在告警规则当中。

== 相等!= 不等于> 大于< 小于>= 大于等于<= 小于等于#查询所有主机节点的内存使用率(node_memory_bytes_total - node_memory_free_bytes_total) / node_memory_bytes_total#编写告警规则,内存超过95%的主机,告警(node_memory_bytes_total - node_memory_free_bytes_total) / node_memory_bytes_total > 0.95

集合计算

支持的集合计算

and

or

unless 排除

运算符优先级

优先级顺序

*, /, % +, - ==, !=, <=,<,>,>=, >; and, unlessor

聚合运算

通过内置的聚合操作符号,将瞬时向量表达式返回的样本数据进行聚合,形成一个行动时间序列。

min (最小值) max (最大值) avg (平均值) stddev (标准差) stdvar (标准差异) count (计数) count_values (对value进行计数) bottomk (后n条时序) topk (前n条时序)

聚合操作语法

([parameter,] ) [without|by (

其中只有count_values​, quantile​, topk​, bottomk支持参数(parameter)。

without用于从计算结果中移除列举的标签,而保留其它标签。by则正好相反,结果向量中只保留列出的标签,其余标签则移除。通过without和by可以按照样本的问题对数据进行聚合。

举例

#查询求和sum(/120

rate()

取counter在这个时间段中平均每秒增量

rate(node_cpu_seconds_total[2m])

sum()

实际工作中cpu 大多是多核的,而node_cpu会将每个核的数据单独显示出来,我们其实不关心每个核心的单独情况,而是关心总CPU的情况。使用sum()将机器所有的数据都进行了求和,所以还要使用by(intstance)或者by(cluster_name)取出单个服务器或者一组服务器的CPU数据。

#先找出每一一个,然后在合并sum(increase(node_cpu_seconds_total[1m]))

topk()

可以从大量数据中取出排行前N的数值,N可以自定义。比如监控了100台服务器的320个cpu,使用该函数就可以查看当前负载较高的那几个,用于报警。

topk(3,node_disk_io_now)

predict_linear()

对曲线变化的速率进行计算,起到一定的预测作用。比如当前这一个小时磁盘可用率下降,这种情况可能导致磁盘很快被写满,此时使用该函数,用当前1小时的数据取预测未来几个小时的状态,实现提前告警。

#如果未来4小时后磁盘使用率为负数,则会报警predict_linear(node_filesystem_free_bytes{mountpoint="/"}[1h],4*3600)<0

常用表达式

计算cpu的使用率

100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m]))by(instance)*100)

内存使用率

(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100

磁盘使用率

100 - (node_filesystem_free_bytes{mountpoint="/",fstype=~"ext4|xfs|rootfs"} / node_filesystem_size_bytes{mountpoint="/",fstype=~"ext4|xfs|rootfs"} * 100)

主机节点cpu iowait占百分比

avg(irate(node_cpu_seconds_total{mode="iowait"}[5m])) by (instance) * 100

系统1分钟负载

sum by (instance) (node_load1)

网卡流量

avg(irate(node_network_receive_bytes_total{device=~"eth0|eth1|ens33|ens37"}[1m]))by (environment,instance,device)

告警rule

prometheus进行数据采集,存储和定制告警规则;数据展示是基于grafna,告警是由alertmanager来实现。

告警过程

在prometheus server中定义告警规则以及产生的告警,alertermanager组件用处理这些告警。

prometheus触发告警过程:

本次不涉及alertmanger配置,只涉及promtherus的rule的配置

定义告警规则rule

一条典型的告警规则如下所示:

groups:- name: example rules: - alert: HighErrorRate expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5 for: 10m labels: severity: page annotations: summary: High request latency description: description info

在告警规则文件中,我们可以将一组相关的规则设置定义在一个group下。在每一个group中我们可以定义多个告警规则(rule)。一条告警规则主要由以下几部分组成:

alert:告警规则的名称。expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。

为了能够让Prometheus能够启用定义的告警规则,我们需要在Prometheus全局配置文件中通过rule_files指定一组告警规则文件的访问路径,Prometheus启动后会自动扫描这些路径下规则文件中定义的内容,并且根据这些规则计算是否向外部发送通知:

rule_files: [ - ... ]

默认情况下Prometheus会每分钟对这些告警规则进行计算,如果用户想定义自己的告警计算周期,则可以通过evaluation_interval来覆盖默认的计算周期:

global: [ evaluation_interval: | default = 1m ]

模板化

般来说,在告警规则文件的annotations中使用summary​描述告警的概要信息,description用于描述告警的详细信息。同时Alertmanager的UI也会根据这两个标签值,显示告警信息。为了让告警信息具有更好的可读性,Prometheus支持模板化label和annotations的中标签的值。

# To insert a firing element's label values:{{ $labels. }}# To insert the numeric expression value of the firing element:{{ $value }}

配置prometheus的rule

定义告警文件

修改promethues的配置文件,按照如下修改

#前提安装好prometheus#新建url目录mkdir /usr/local/prometheus/rule#编辑prometheus的配置文件vim /usr/local/prometheus/prometheus.yml

意思是说读取rule目录下的yaml文件作为告警规则

告警规则定义举例1

配置举例,从简单的主机down高级处理

#vim node_monitor.yamlgroups:- name: node-up #告警分组 rules: - alert: node-up #监控项名称 expr: up{job="localhost-node"}==0 #正则表达式,也可以自己定义监控状态 for: 15s #for选项定义表达式的持续时长,0的话就代表一定满足 labels: severity: critical #定义了一个标签,因为上面是基于标签路由 #annnotations: #邮件注释内存,可引用变量 # summary: "{{$labels.instance}}已经停止超过15s!"

在编写完成rule之后,可以使用prometool测试rules 文件是否正确,如果不正确可能会导致prometheus服务启动失败

./promtool check config prometheus.yml./promtool check rules rule/node_monitor.yaml

说明:

1 prometheus支持使用变量来获取指定标签的值。比如#labels.变量可以访问当前告警示例指定标签的的值。$value可以获取当前PromQL表达式计算的样本值。

2 在创建规则文件的时候,建议不同对象建立不同的文件,比如web.yaml,mysql.yaml等

3 expr是告警表达式编写,可以根据promql来写查询表达式

4 保存退出,重启prometheus服务,查看rule是否生效

5 测试告警规则是否生效。关闭node_exporter的监控。

systemctl stop node_exporter

状态说明

incative: 非活动状态,表示正在监控,但是还未有任何报警触发Pending :表示这个警报必须触发。由于报警可以被分组,压抑/抑制或者静默/静音,所以等待验证,一旦所有验证通过,则转为firing状态firing 将警报发送到AlertManger,他将按照配置将警报发送给所有接收者。但是一旦警报解除,就会恢复到incative状态,如此循环

告警规则定义举例2

创建hoststats-alert.yaml

groups:- name: hostStatsAlert rules: - alert: hostCpuUsageAlert expr: sum(avg without (cpu)(irate(node_cpu{mode!='idle'}[5m]))) by (instance) > 0.85 for: 1m labels: severity: page # annotations: # summary: "Instance {{ $labels.instance }} CPU usgae high" # description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})" - alert: hostMemUsageAlert expr: (node_memory_MemTotal - node_memory_MemAvailable)/node_memory_MemTotal > 0.85 for: 1m labels: severity: page #annotations: # summary: "Instance {{ $labels.instance }} MEM usgae high" # description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"

重启prometheus,查看当前加载的规则文件

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:k8s 存储卷之简单存储
下一篇:从“全民砸金蛋”到“直播互动”地产营销正走入新篇章!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~