Metrics
官方解释是
Metrics are numerical measurements in layperson terms. (通俗地讲,Metrics就是数字测量)
Prometheus fundamentally stores all data as time series (Prometheus把所有数据都存储为时间序列)
Every time series is uniquely identified by its metric name and optional key-value pairs called labels.(每个时间序列都由metric name和可选的键值对Metric labels作为唯一标识)
Samples form the actual time series data. Each sample consists of: a float64 value, a millisecond-precision timestamp (样本组成了实际的时序数据,每个样本由一个float64的值和一个毫秒精度的时间戳组成)
<metric name>{<label name>=<label value>, ...} value@timestamp
# 例子:
node_load15{instance="192.168.243.99:9100", job="node_exporter"} 0.05 @1727773666.825
- node_load15是metric name,意思是机器15分钟内的平均负载(Linux top命令上面的3个load average之一)
- 这个metric有2个标签,instance标明了这条数据来自哪台机器,job就是Prometheus配置文件里面scrape_configs.job_name,这2个标签是Prometheus自动给加上的
- 整个例子的意思是,192.168.243.99这台机器在时间戳1727773666.825这一刻的15分钟平均负载是0.05
Metric types
Prometheus有4种Metric types:
- Counter —— 计数器,数据只增不减
- Gauge —— 仪表盘,数据可增可减
- Summary —— 摘要类型,用于分析数据分布情况
- Histogram —— 直方图类型,用于分析数据分布情况
访问 node_exporter_IP:9100/metrics 就能看见其所有的Metric,比如:
每一组metrics都由# HELP 和 # TYPE开头。HELP是这段数据的说明,TYPE是这段数据的类型
PromQL
PromQL(Prometheus Query Language)是Prometheus tsdb的查询语言,可实时查找/计算/聚合时间序列数据,并将结果在图表中展示。
语法:<metric name>{<label name>=<label value>, ...}[duration]
- 瞬时向量,表示时间序列中最新的一个样本值,(上图第一个示例,返回值只有1个)
- 区间向量,表示给定时间范围内的一组样本(上图第二个示例,返回值有多个),时间范围可以使用 秒(s)、分钟(m)、小时(h)、天(d)、周(w)和年(y)。比如[1m]就是返回1分钟内的监控数据
标签的筛选
支持精确匹配和正则匹配,以及它们的取反操作
精确匹配
= , !=
例子:查询node_cpu_guest_seconds_total
CPU等于1 和 不等于1的数据
正则匹配
=~ , !~
例子:查询 node_disk_io_time_seconds_total
中device是dm-数字 的数据和不是dm-数字 的数据
算数运算
支持 \+ 加, - 减, * 乘, / 除, % 取模, ^ 幂
运算
例 获取可用内存:
比较运算
== , != , > , < , >= , <=
例:node_load15 > 0.9
逻辑运算
and 且, or 或, unless 非
例:找出近15分钟负载大于0.9且内存使用率大于80%的机器:
node_load15 > 0.9 and (1 - ((node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes)) > 0.8
聚合 操作
sum 、max、min、avg、count 、count_values、topk(样本值前K个最大值)、stddev(标准差)、stdvar(方差), bottomk(样本值后K个最小值), quantile(统计分位数)
例: