目录
[root@Server ~]# find / -name grafana
/var/lib/grafana # 存储存储临时文件、会话和sqlite3 db文件
/var/log/grafana # 日志目录
/usr/share/grafana # 插件、脚本、配置文件等
/usr/share/grafana/public/app/plugins/datasource/grafana
/etc/grafana # 配置文件
/run/grafana # PID文件
测试
图表
Time series
柱状图(bars)
折线图(lines)
点状图(points)
仪表盘(Gauge)
Bar Gauge
Stat
Heatmap
饼图(Pie chart)
表格(Table)
时钟(Clock)
指标类型
Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)
Counter
只增不减的计数器(除非系统发生重置)
一般在定义Counter类型指标的名称时推荐使用_total作为后缀
场景
可以在应用程序中记录某些事件发生的次数
常见指标:
http_requests_total
Gauge
可增可减的仪表盘
侧重于反应系统的当前状态
常见指标:
node_memory_MemFree(主机当前空闲的内容大小)
node_memory_MemAvailable(可用内存大小)
Histogram
用于统计和分析样本的分布情况
常见指标:
prometheus_tsdb_compaction_chunk_range_bucket
Summary
用于统计和分析样本的分布情况
常见指标:
prometheus_tsdb_wal_fsync_duration_seconds
概念
Prometheus通过指标名称(metrics name)以及对应的一组标签(labelset)唯一定义一条时间序列。
矩阵中每一个点都可称为一个样本(Sample),样本主要由 3 方面构成:
- 指标(Metrics):包括指标名称(Metrics name)和一组标签集(Label set)名称。
- 时间戳(TimeStamp):这个值默认精确到毫秒。
- 样本值(Value):这个值默认使用 Float64 浮点类型。
http_request_total{status="200",method="GET"}@1434417560938=>94355
key 的组成
- Metric Name:指标名(例子中的 http_request_total)
- Label:标签(例子中的{status=“200”,method=“GET”})
- Timestamp:时间戳(例子中的@1434417560938)
指标名称:反映了监控样本的基本标识。
label:则在这个基本特征上为采集到的数据提供了多种特征维度。用户可以基于这些特征维度过滤,聚合,统计从而产生新的计算后的一条时间序列。
PromQL
PromQL是Prometheus内置的数据查询语言。全称为Prometheus Query Language。
其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持。
被广泛应用在Prometheus的日常应用当中,包括对数据查询、可视化、告警处理当中。
语法格式 <metric name>{<label name>=<label value>, ...}
。
数据类型
瞬时向量
(Instant vector): 时间序列中最新的一条样本数据
http_requests_total
http_request_total{name="a"}
区间向量
(Range vector): 获取某一区间范围内的样本数据
// 最近5分钟的所有样本数据
http_request_total{}[5m]
// 最近1小时5分钟的所有样本数据
http_request_total{}[1h5m]
支持的时间单位:
- s - 秒
- m - 分钟
- h - 小时
- d - 天
- w - 周
- y - 年
标量
(Scalar): 一个简单的数字浮点值
一个浮点型的数字值
标量只有一个数字,没有时序。
10
字符串
(String): 一个简单的字符串值
一个简单的字符串值
"this is a string"
时间位移
# 5分钟前的瞬时样本数据
http_request_total{} offset 5m
# 昨天一天的区间内的样本数据
http_request_total{}[1d] offset 1d
还可以通过 @
直接跳转到某个uinx时间戳,需开启启动参数 --enable-feature=promql-at-modifier
prometheus_http_requests_total{code="200"} @ 1646089826
运算符
数学运算符
+
(加法)-
(减法)*
(乘法)/
(除法)%
(求余)^
(幂运算)
布尔运算符
==
(相等)!=
(不相等)>
(大于)<
(小于)>=
(大于等于)<=
(小于等于)
集合运算符
and
(并且)or
(或者)unless
(排除)
操作符优先级(由高到低)
^
*, /, %
+, -
==, !=, <=, <, >=, >
and, unless
or
匹配操作符
- =:完全相等
- !=: 不相等
- =~: 正则表达式匹配
- !~: 正则表达式不匹配
// 完全匹配
http_request_total{label1="a",label2!="b"}
// 正则匹配
http_request_total{label1=~"a.*",label2!~"b.*"}
// 多个表达式之间使用`|`进行分离
http_request_total{label1="a1|a2"}
聚合操作符
内置的聚合操作符:
sum
(求和)min
(最小值)max
(最大值)avg
(平均值)group
(分组)stddev
(标准偏差)stdvar
(标准方差)count
(计数)count_values
(对value进行计数)bottomk
(后n条时序)topk
(前n条时序)quantile
(分布统计)
// HTTP 请求数前 5 位的时序样本数据
topk(5, prometheus_http_requests_total)
// 通过标准差来反映网络波动
stddev(rate(node_network_transmit_bytes_total[5m]))
group by(handler)(prometheus_http_requests_total)
quantile(0.95, prometheus_http_requests_total)
# 查询系统所有http请求的总量
sum(http_request_total)
# 按照mode计算主机CPU的平均使用时间
avg(node_cpu) by (mode)
# 按照主机查询各个主机的CPU使用率
sum(sum(irate(node_cpu{mode!='idle'}[5m])) / sum(irate(node_cpu[5m]))) by (instance)
topk(5, search_slow_metric{clusterName="test_710_cluster"})
group by(taskId)(search_slow_metric{clusterName="test_710_cluster"})
使用聚合操作的语法如下:
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
without:将不符合条件的标签筛去
by:将符合条件的标签留下
sum(prometheus_http_request_total)without(a)
等价于
sum(prometheus_http_request_total)by(b,c,d)
parameter:只能在count_values、quantile、topk和bottomk中使用。
函数
内置的函数:
- abs():绝对值
- sqrt():平方根
- exp():指数计算
- ln():自然对数
- ceil():向上取整
- floor():向下取整
- round():四舍五入取整
- delta():计算区间向量里每一个时序第一个和最后一个的差值
- sort():排序(升序)
- sort_desc():排序(降序)
- rate(): 计算整个时间范围内区间向量中时间序列的每秒平均增长率
- irate(): 仅使用时间范围中的最后两个数据点来计算区间向量中时间序列的每秒平均增长率, irate 只能用于绘制快速变化的序列,在长期趋势分析或者告警中更推荐使用 rate 函数
- increase(): 计算所选时间范围内时间序列的增量,它基本上是速率乘以时间范围选择器中的秒数---
合法的PromQL表达式
所有的PromQL表达式都必须至少包含一个指标名称(例如http_request_total),或者一个不会匹配到空字符串的标签过滤器(例如{code="200"})。
因此以下两种方式,均为合法的表达式:
http_request_total # 合法
http_request_total{} # 合法
{method="get"} # 合法
而如下表达式,则不合法:
{job=~".*"} # 不合法
同时,除了使用 <metric name>{label=value}
的形式以外,我们还可以使用内置的 __name__
标签来指定监控指标名称:
{__name__=~"http_request_total"} # 合法
{__name__=~"node_disk_bytes_read|node_disk_bytes_written"} # 合法