Skip to content

Commit 05967b5

Browse files
committed
grafana教程续写
1 parent 21caaa8 commit 05967b5

5 files changed

+105
-4
lines changed

gen_word.sh

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
pandoc 00_preface.md \
2+
01_node_introduce.md \
3+
02_node_javascript.md \
4+
03_node_basic.md \
5+
04_node_npm.md \
6+
05_node_database.md \
7+
06_node_express_basic.md \
8+
07_node_express_advance.md \
9+
08_node_unit_test.md \
10+
09_node_production.md \
11+
10_node_addon.md \
12+
11_node_optimization.md \
13+
12_node_web_security.md \
14+
13_node_web_worker.md \
15+
14_node_log_and_monitor.md \
16+
15_micro_service.md \
17+
16_openapi_doc.md \
18+
a1_node_utils.md \
19+
a2_bibliography.md \
20+
a3_convention.md \
21+
a4_node_http.md \
22+
a5_node_multi_versions.md \
23+
a6_node_native_addon_config.md \
24+
a7_easy_monitor_setup.md \
25+
-o output.docx

text/14_node_log_and_monitor.md

+80-4
Original file line numberDiff line numberDiff line change
@@ -922,15 +922,91 @@ req_duration{serverName="chapter14",namespace="default",path="/b"} 126
922922
923923
**图 14.3.2.1 Prometheus 基本数据结构图示**
924924
925+
> 为了构图方便,这里简单认为各个指标中只有 `status` 这一个 lable。
926+
925927
我们在 **代码 14.3.1.2** 中会看到里面有一个 `scrape_interval` 参数,设定的值是 15s,代表 Prometheus 默认会每隔 15s,去 **图 14.3.1.2** 中定义的各个 endpoint 上抓取数据。如果给 **输出 13.3.2.1** 绘制一张示意图的话,那么这里面两个相邻点的时间间隔应该为 15s。
926928
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)
9281005

929-
我们抽取范围向量中某一个时间点的数据集,就像我们在上图红色框中框选的那样,我们抽取 t2 时间点上的 `req_duration` 指标的数据集,这个数据集被称为 **瞬时向量(Instant Vector)**。
1006+
**图 14.3.2.3 填写可视化所需的表达式**
9301007

931-
如果我们将数据集范围继续缩小,只取其中一个点,也就是在瞬时向量中添加 lable 属性来精确筛选出一个点,这个点被称之为 **标量(Scalar)**
1008+
注意这里我们在 lable 筛选的时候用了 =~ ,而不是常用的 = ,这是由于 $instance 这个变量值的特殊性导致的
9321009

933-
grafana 使用 promql 来绘制图表,我们在 **图 14.3.1.7** 中看到的各个图标,都是基于 promql 语句查询绘制的界面。最简单的 promql 就是直接写指标名字(例如 `req_count`) ,它对应的数据是这个指标最新的瞬时向量的内容。
9341010

9351011
需要注意,我们 grafana 只支持瞬时向量和标量,不支持范围向量,但是这并不代表范围向量是没有用的。对于计数器类型的指标来说,grafana 也不支持,这时候你可以使用 Prometheus 内置函数将计数器先转化成范围向量,然后再对范围向量内的数值做运算转成一个瞬时向量,比如说 rate 函数就是将范围向量转成瞬时向量的常用操作。
9361012

text/images/add_visual.png

10.2 KB
Loading
199 KB
Loading
62.4 KB
Loading

0 commit comments

Comments
 (0)