@@ -922,15 +922,91 @@ req_duration{serverName="chapter14",namespace="default",path="/b"} 126
922
922
923
923
**图 14.3.2.1 Prometheus 基本数据结构图示**
924
924
925
+ > 为了构图方便,这里简单认为各个指标中只有 `status` 这一个 lable。
926
+
925
927
我们在 **代码 14.3.1.2** 中会看到里面有一个 `scrape_interval` 参数,设定的值是 15s,代表 Prometheus 默认会每隔 15s,去 **图 14.3.1.2** 中定义的各个 endpoint 上抓取数据。如果给 **输出 13.3.2.1** 绘制一张示意图的话,那么这里面两个相邻点的时间间隔应该为 15s。
926
928
927
- 我们用绿色框标识的几个点,是位于 `[t1,t4]` 时间段内的 `req_duration` 指标的一个数据集,这个数据集被称为 **范围向量(Range Vector)** 。
929
+ 我们抽取范围向量中某一个时间点的数据集,就像我们在上图红色框中框选的那样,我们抽取 t2 时间点上的 `req_count` 指标的数据集,这个数据集被称为 **瞬时向量(Instant Vector)** 。`req_count` 这个表达式就是一个瞬时向量,它其实是一个简写,省略了当前时间,如果我们想指定非当前时间的数据需要写 `req_count @ 时间戳`,比如说 `req_count @ 1732458388` 代表 req_count 在 2024-11-24 22:26:28 时间点的数据。因为 `req_count` 上有一个 `status` 的label,这个 lable 有很多可选值(200、500 等),所以这个瞬时向量转化成编程语言的概念的话,就可以认为是一个数组。我们给出下面一组数组来演示这个数组:
930
+
931
+ ```javascript
932
+ [
933
+ 10/*lable为200的req_count值*/,
934
+ 1/*lable为500的req_count值*/,
935
+ 2/*label为501的req_count值*/
936
+ ]
937
+ ```
938
+
939
+ ** 代码 14.3.2.2 瞬时向量演示**
940
+
941
+ 如果我们将数据集范围继续缩小,只取其中一个点,也就是在瞬时向量中添加 lable 属性来精确筛选出一个点对应的数值,被称之为 ** 标量(Scalar)** 。比如说 ` req_count{status="200"} @ 1732458388 ` , 它代表 HTTP 响应码为 200 的 req_count 指标在 2024-11-24 22:26:28 时间点的值,也就是 ** 代码 14.3.2.1** 中的 ` 10 ` 这个值。
942
+
943
+ > 标量其实就是一个浮点类型的数值,是没有表达式概念的,表达式` req_count{status="200"} @ 1732458388 ` 依然是一个瞬时向量,只不过其对应的数组里面只有一个元素,也就是说这个数组长这样 ` [10] ` 。
944
+
945
+ 我们用绿色框标识的几个点,是位于 ` [t1,t4] ` 时间段内的 ` req_duration ` 指标的一个数据集,这个数据集被称为 ** 范围向量(Range Vector)** 。如果将其转化为编程语言中的概念的话,用二维数组更好理解一些,下面是我们对其的数据演示:
946
+
947
+ ``` javascript
948
+ [
949
+ [// 时间为t1的瞬时数据,t1=1732458388
950
+ 10 /* lable为200的req_count值*/ ,
951
+ 1 /* lable为500的req_count值*/ ,
952
+ 2 /* label为501的req_count值*/
953
+ ],
954
+ [// 时间为t2的瞬时数据, t2=1732458448
955
+ 18 /* lable为200的req_count值*/ ,
956
+ 2 /* lable为500的req_count值*/ ,
957
+ 3 /* label为501的req_count值*/
958
+ ],
959
+ [// 时间为t3的瞬时数据,t3=1732458508
960
+ 20 /* lable为200的req_count值*/ ,
961
+ 3 /* lable为500的req_count值*/ ,
962
+ 3 /* label为501的req_count值*/
963
+ ],
964
+ [// 时间为t4的瞬时数据,t4=1732458568
965
+ 22 /* lable为200的req_count值*/ ,
966
+ 3 /* lable为500的req_count值*/ ,
967
+ 4 /* label为501的req_count值*/
968
+ ],
969
+ ]
970
+ ```
971
+
972
+ ** 代码 14.3.2.3 范围向量演示**
973
+
974
+ ` req_count[4m] ` 就是一个范围向量的表达式,它表示 req_count 指标在当前时间往前 4 分钟内的所有数据。我们直接使用范围向量的情况很少,一般是作为过渡存在,再次将其转化为瞬时向量。在程序中我们使用 req_count 来表示当前请求的累计总数,这个数字是单调递增的,但是如果我们想知道每秒请求数,可以使用 rate 函数,比如说 rate(req_count[ 4m] ) 就可以计算 4 分钟内每秒请求数,也就是请求速率。根据高中物理公式,` 速率 = 距离 / 时间 ` ,我们假定在四分钟内 t1 为第一个采集到的数据,t4 为最后一个采集到的数据,则对于 ` status ` 为 200 的指标来说,其速率为
975
+
976
+ ```
977
+ rate=(22-10)/(4*60)=0.05 请求/秒
978
+ ```
979
+
980
+ ** 公式 14.3.2.1 速率公式**
981
+
982
+ 根据上述公式,我们依次带入各个 status 的 req_count 首尾差值,就会得到一个瞬时向量:
983
+
984
+ ```
985
+ [
986
+ 0.05/*lable为200的req_count速率*/,
987
+ 0.008/*lable为500的req_count速率*/,
988
+ 0.008/*label为501的req_count速率*/
989
+ ]
990
+ ```
991
+
992
+ ** 代码 14.3.2.4 应用 rate 函数后生成的瞬时向量**
993
+
994
+ grafana 使用 promql 来绘制图表,我们在 ** 图 14.3.1.7** 中看到的各个图标,都是基于 promql 语句查询绘制的界面,不过 grafana 要求这些 promql 必须是瞬时向量。最简单的瞬时向量就是直接写指标名字(例如 ` req_count ` )。
995
+
996
+ 我们在 ** 图 14.3.1.7** 的右上角位置找到 ** Add** 菜单,点击打开后选择 ** Visualization** :
997
+
998
+ ![ ] ( images/add_visual.png )
999
+
1000
+ ** 图 14.3.2.2 添加 grafana 可视化面板菜单**
1001
+
1002
+ 在弹出的界面中输入表达式 ` req_count{instance=~"$instance"} ` :
1003
+
1004
+ ![ ] ( images/input_visualization_express.png )
928
1005
929
- 我们抽取范围向量中某一个时间点的数据集,就像我们在上图红色框中框选的那样,我们抽取 t2 时间点上的 `req_duration` 指标的数据集,这个数据集被称为 **瞬时向量(Instant Vector)**。
1006
+ ** 图 14.3.2.3 填写可视化所需的表达式 **
930
1007
931
- 如果我们将数据集范围继续缩小,只取其中一个点,也就是在瞬时向量中添加 lable 属性来精确筛选出一个点,这个点被称之为 **标量(Scalar)** 。
1008
+ 注意这里我们在 lable 筛选的时候用了 = ~ ,而不是常用的 = ,这是由于 $instance 这个变量值的特殊性导致的 。
932
1009
933
- grafana 使用 promql 来绘制图表,我们在 **图 14.3.1.7** 中看到的各个图标,都是基于 promql 语句查询绘制的界面。最简单的 promql 就是直接写指标名字(例如 `req_count`) ,它对应的数据是这个指标最新的瞬时向量的内容。
934
1010
935
1011
需要注意,我们 grafana 只支持瞬时向量和标量,不支持范围向量,但是这并不代表范围向量是没有用的。对于计数器类型的指标来说,grafana 也不支持,这时候你可以使用 Prometheus 内置函数将计数器先转化成范围向量,然后再对范围向量内的数值做运算转成一个瞬时向量,比如说 rate 函数就是将范围向量转成瞬时向量的常用操作。
936
1012
0 commit comments