一、查询持久化
在Prometheus的表达式浏览器进行的查询会生成新的时间序列,但其结果仅临时保存于Prometheus Server之上。在样本数据量较大、工作较为繁忙的Prometheus Server上,对于那些查询频率较高且运算较为复杂的查询而言,实时查询会存在一些响应延迟的情况。此时,记录规则和告警规则就派上用场了。
1.1 记录规则
记录规则能够预先运行频繁用到或计算消耗较大的表达式,并将其结果保存为一组新的时间序列。记录规则生成的结果也可以被告警规则使用。
- 记录规则是定义在Prometheus配置文件中的查询语句,由Server加载后,它能够以类似批处理的方式在后台周期性的执行并记录查询结果;
- 客户端只需查询由记录规则生成的结果序列上的样本数据即可,速度远快于实时查询;
- 常用于跨多个时间序列生成聚合数据,或计算消耗较大的查询等场景;
- 多见于同可视化工具(eg:Grafana)结合使用的需求中,也可用于生成可产生告警信息的时间序列。
1.2 告警规则
告警规则是定义在Prometheus配置文件中的另一种PromQL表达式,它通常是一个基于查询语句的布尔表达式,该表达式负责触发告警。当告警规则中用的查询语句较为复杂时,可将其保存为记录规则,而后通过查询该记录规则生成的时间序列来进行比较,从而避免实时查询导致的较长时间延迟。
二、配置记录规则
2.1 语法
具体参考https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/#recording-rules
#每个规则文件都是含有一到多个规则组(rule_group)的列表,这些列表项定义在顶级字段groups之下
groups:
#每个规则组都要有一个名字,且在当前文件中必须唯一
- name: <string>
#组内的规则每隔多长时间计算(评估)一次
[ interval: <duration> | default = global.evaluation_interval ]
#限制条件。对于告警规则,用于限制其最多生成的告警数量。对于记录规则,用于限制其最多生成的序列数量。0表示无限制
[ limit: <int> | default = 0 ]
#该规则组中的规则列表,对于每条告警规则,要遵循规则语法
rules:
#记录规则的名称
- record: <string>
#使用的PromQL表达式。每次评估周期到达时都会基于当前时间进行表达式计算,评估的结果会生成一个新的时间序列
expr: <string>
#在记录规则上添加的标签
labels:
[ <labelname>: <labelvalue> ]
2.2 示例
#记录规则通常保存在单独的文件中
cd /usr/local/Prometheus && mkair rules
vim rules/record-rules-node.yml
groups:
- name: custom_rules
interval: 5s
rules:
- record: instance:node_cpu:avg_rate5m
expr: (1 - avg(irate(node_cpu_seconds_total{job="node", mode="idle"}[5m])) by (instance)) * 100
- record: instace:node_memory_MemFree_percent
expr: 100 * (node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes) / node_memory_MemTotal_bytes
- record: instance:root:node_filesystem_free_percent
expr: 100 * node_filesystem_free_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}
#在prometheus.yml通过rule_files加载此文件
vim prometheus.yml
rule_files:
- "rules/record-rules-*.yml"
#执行Prometheus热加载
curl -XPOST http://192.168.131.11:9090/-/reload
此时,刷新Prometheus Web UI的Rules界面,发现生成了新的规则。
三、Grafana
3.1 简介
Grafana是一款基于go语言开发的通用可视化工具,支持从多种不同的数据源(Prometheus、ElasticSearch、Mysql、PostgreSQL等)加载并展示数据。默认监听TCP协议的3000端口,且能通过/metrics输出内建指标。
3.2 部署Grafana
参考https://mirrors.tuna.tsinghua.edu.cn/help/grafana
##在Prometheus服务器上操作
#下载 Grafana 存储库签名密钥
apt-get install -y apt-transport-https
apt-get install -y software-properties-common wget
wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
#稳定版本添加存储库
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
#安装
apt -y update && apt-get -y install grafana
#启动grafana
systemctl daemon-reload
systemctl enable --now grafana-server
访问http://Grafana IP:3000,一开始默认登录用户名/密码为admin/admin,也可后续修改密码。
3.3 为Prometheus添加数据源
进入Grafana界面,选择Connections->Data Sources,点击Add new data source,选择Prometheus
3.4 导入内置的Dashboard
内置DashBoard查询地址:https://grafana.com/grafana/dashboards
Prometheus数据源有其自带的DashBoard可直接导入。
如果是其它中间件/组件,这里以Consul为例,搜consul关键字(最好选star指数较高、下载次数多的DashBoard模板),复制ID或json内容均可,二者选其一就行。数据源记得选之前设置的Prometheus。
之后点击load。效果如下(注意数据源与DashBoard模板的兼容性,如果不兼容得重找DashBoard模板):