Monitor Prometheus PromQL
Prometheus monitor
2023-09-14 09:14:49 时间
^
│ . . . . . . . . . . node_load1{host="host01",zone="bj"}
│ . . . . . . . . . . node_load1{host="host02",zone="sh"}
│ . . . . . . . . . . node_load1{host="host11",zone="sh"}
v
<------- 时间 ---------->
每个点为: 一个样本(sample),样本由三部分组成
- 指标 (metric): 描述当前样本特征的 labelsets
- 时间戳 (timestamp): 一个精确到毫秒的时间戳
- 值 (value): 该时间样本的值
过滤
过滤选择,两个需求 :
-- 查询上海所有机器 1 分钟的负载
node_load1{zone="sh"}
-- 查询所有以 host0 为前缀的机器 1 分钟的负载
node_load1{host=~"host0.*"}
标签过滤的操作符 :
- 不等于
!=
- 正则非
!~
对 metric 名metric 过滤
{__name__=~"node_load.*", zone="sh"}
3 条 PromQL 都是即时查询(Instant Query),返回即时向量( Instant Vector)
- 返回当前时间内的最新值
Prometheus 控制当前时间内的最长时间
- 默认: 5 分钟
- 建议调短为 1 分钟
--query.lookback-delta=1m
--query.lookback-delta
范围查询(Range Query),返回 Range Vector
- 多加了时间范围 1 分钟,会返回多个点
- 当数据 10 秒钟采集一次,1 分钟有 6 个点,都会返回
{__name__=~"node_load.*", zone="sh"}[1m]
运算符
算术
-- 计算内存可用率: 内存可用量/内存总量,就 * 100 (百分比呈现)
mem_available{app="clickhouse"} / mem_total{app="clickhouse"} * 100
-- 计算北京区网口出向的速率,原始数据的单位: byte,网络流量单位用bit,就 * 8
irate(net_sent_bytes_total{zone="beijing"}[1m]) * 8
比较
比较运算符: 大于、小于、等于、不等于
- 一般用来配置告警规则
mem_available{app="clickhouse"} / mem_total{app="clickhouse"} * 100 < 20
irate(net_sent_bytes_total{zone="beijing"}[1m]) * 8 / 1024 / 1024 > 700
expr
: 指定查询 PromQL, 当查到几条,就触发几条告警for: 1m
: 连续 1 分钟都查询才会告警
groups:
- name: host
rules:
- alert: MemUtil
expr: mem_available{app="clickhouse"} / mem_total{app="clickhouse"} * 100 < 20
for: 1m
labels:
severity: warn
annotations:
summary: Mem available less than 20%, host:{{ $labels.ident }}
逻辑
逻辑运算符有 3 个,用于 instant-vector 运算
- and : 求交集
- or : 求并集
- unless : 求差集
只有< 200G 的硬盘, 并使用率超过 70% :
disk_used_percent{app="clickhouse"} > 70
and disk_total{app="clickhouse"}/1024/1024/1024 < 200
向量匹配
该 MySQL 实例是个 slave (master_server_id>0) ,就检查 slave_sql_running 值
- 当
slave_sql_running==0
: slave sql 线程没有运行
mysql_slave_status_slave_sql_running == 0
and ON (instance)
mysql_slave_status_master_server_id > 0
## example series
method_code:http_errors:rate5m{method="get", code="500"} 24
method_code:http_errors:rate5m{method="get", code="404"} 30
method_code:http_errors:rate5m{method="put", code="501"} 3
method_code:http_errors:rate5m{method="post", code="500"} 6
method_code:http_errors:rate5m{method="post", code="404"} 21
method:http_requests:rate5m{method="get"} 600
method:http_requests:rate5m{method="del"} 34
method:http_requests:rate5m{method="post"} 120
## promql
method_code:http_errors:rate5m{code="500"}
/ ignoring(code)
method:http_requests:rate5m
## result
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120
sum(
rate(http_request_count{code=~"^(?:5..)$"}[5m])) by (pod)
*
on (pod) group_left(label_version) kube_pod_labels
聚合
聚合:
-- 求 clickhouse 机器的平均内存可用率
avg(mem_available_percent{app="clickhouse"})
-- 对 clickhouse 机器的内存可用率排序,取最小的两条记录
bottomk(2, mem_available_percent{app="clickhouse"})
分别统计 clickhouse 和 canal 的机器内存可用率
-- by:分组统计的维度 (相反: without)
avg(mem_available_percent{app=~"clickhouse|canal"}) by (app)
对范围时段内求聚合:
target_up[2m]
: 获取该指标最近 2 分钟的所有数据点
max_over_time
:求时间内所有点的最大值
max_over_time(target_up[2m])
increase
increase 函数 : 求增量,接收 range-vector
- range-vector 会返回多个 value+timestamp 的组合
net_bytes_recv{interface="eth0"}[1m] @ 1661570908
965304237246 @1661570850
965307953982 @1661570860
965311949925 @1661570870
965315732812 @1661570880
965319998347 @1661570890
965323899880 @1661570900
increase(net_bytes_recv{interface="eth0"}[1m]) @1661570909
23595160.8
计算公式 : 最后个点值 - 第一个点值 / 时间差 * 60
(965323899880.0−965304237246.0)÷(1661570900.0−1661570850.0)×60=23595160.8
rate
rate 函数 : 求每秒变化率
- increase 结果 / range-vector 时间段大小
rate(net_bytes_recv{interface="eth0"}[1m])
== bool increase(net_bytes_recv{interface="eth0"}[1m])/60.0
- rate 函数 : 求变化率,相对平滑
- irate 函数 : 拿时间范围内的最后两个值做计算,变化更剧烈
相关文章
- 监控系统-Prometheus(普罗米修斯)(三)Grafana可视化图形工具
- 使用prometheus监控一个业务机
- strimzi实战之三:prometheus+grafana监控(按官方文档搞不定监控?不妨看看本文,已经踩过坑了)
- 6.Prometheus监控入门之企业监控实战警报发送
- 安装prometheus
- Prometheus搭建使用
- Prometheus监控k8s集群节点
- Prometheus_operator使用
- Prometheus监控实战系列十一:可视化
- Prometheus 新一代的监控框架 | 工具链
- PromQL 增强工具 PromLens 以开源方式捐赠给 Prometheus 组织
- 一文带你搞懂Prometheus Operator
- 【Prometheus+Grafana系列】基于docker-compose搭建
- Cloudflare 如何大规模运行 Prometheus
- kubernetes安装prometheus监控集群状态
- Prometheus 2.13.0 发布