Skip to content

Commit

Permalink
grafana教程续写
Browse files Browse the repository at this point in the history
  • Loading branch information
yunnysunny committed Dec 1, 2024
1 parent 21caaa8 commit 05967b5
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 4 deletions.
25 changes: 25 additions & 0 deletions gen_word.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
pandoc 00_preface.md \
01_node_introduce.md \
02_node_javascript.md \
03_node_basic.md \
04_node_npm.md \
05_node_database.md \
06_node_express_basic.md \
07_node_express_advance.md \
08_node_unit_test.md \
09_node_production.md \
10_node_addon.md \
11_node_optimization.md \
12_node_web_security.md \
13_node_web_worker.md \
14_node_log_and_monitor.md \
15_micro_service.md \
16_openapi_doc.md \
a1_node_utils.md \
a2_bibliography.md \
a3_convention.md \
a4_node_http.md \
a5_node_multi_versions.md \
a6_node_native_addon_config.md \
a7_easy_monitor_setup.md \
-o output.docx
84 changes: 80 additions & 4 deletions text/14_node_log_and_monitor.md
Original file line number Diff line number Diff line change
Expand Up @@ -922,15 +922,91 @@ req_duration{serverName="chapter14",namespace="default",path="/b"} 126
**图 14.3.2.1 Prometheus 基本数据结构图示**
> 为了构图方便,这里简单认为各个指标中只有 `status` 这一个 lable。
我们在 **代码 14.3.1.2** 中会看到里面有一个 `scrape_interval` 参数,设定的值是 15s,代表 Prometheus 默认会每隔 15s,去 **图 14.3.1.2** 中定义的各个 endpoint 上抓取数据。如果给 **输出 13.3.2.1** 绘制一张示意图的话,那么这里面两个相邻点的时间间隔应该为 15s。
我们用绿色框标识的几个点,是位于 `[t1,t4]` 时间段内的 `req_duration` 指标的一个数据集,这个数据集被称为 **范围向量(Range Vector)** 。
我们抽取范围向量中某一个时间点的数据集,就像我们在上图红色框中框选的那样,我们抽取 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 等),所以这个瞬时向量转化成编程语言的概念的话,就可以认为是一个数组。我们给出下面一组数组来演示这个数组:
```javascript
[
10/*lable为200的req_count值*/,
1/*lable为500的req_count值*/,
2/*label为501的req_count值*/
]
```

**代码 14.3.2.2 瞬时向量演示**

如果我们将数据集范围继续缩小,只取其中一个点,也就是在瞬时向量中添加 lable 属性来精确筛选出一个点对应的数值,被称之为 **标量(Scalar)**。比如说 `req_count{status="200"} @ 1732458388`, 它代表 HTTP 响应码为 200 的 req_count 指标在 2024-11-24 22:26:28 时间点的值,也就是 **代码 14.3.2.1** 中的 `10` 这个值。

> 标量其实就是一个浮点类型的数值,是没有表达式概念的,表达式`req_count{status="200"} @ 1732458388` 依然是一个瞬时向量,只不过其对应的数组里面只有一个元素,也就是说这个数组长这样 `[10]`
我们用绿色框标识的几个点,是位于 `[t1,t4]` 时间段内的 `req_duration` 指标的一个数据集,这个数据集被称为 **范围向量(Range Vector)** 。如果将其转化为编程语言中的概念的话,用二维数组更好理解一些,下面是我们对其的数据演示:

```javascript
[
[// 时间为t1的瞬时数据,t1=1732458388
10/*lable为200的req_count值*/,
1/*lable为500的req_count值*/,
2/*label为501的req_count值*/
],
[// 时间为t2的瞬时数据, t2=1732458448
18/*lable为200的req_count值*/,
2/*lable为500的req_count值*/,
3/*label为501的req_count值*/
],
[// 时间为t3的瞬时数据,t3=1732458508
20/*lable为200的req_count值*/,
3/*lable为500的req_count值*/,
3/*label为501的req_count值*/
],
[// 时间为t4的瞬时数据,t4=1732458568
22/*lable为200的req_count值*/,
3/*lable为500的req_count值*/,
4/*label为501的req_count值*/
],
]
```

**代码 14.3.2.3 范围向量演示**

`req_count[4m]` 就是一个范围向量的表达式,它表示 req_count 指标在当前时间往前 4 分钟内的所有数据。我们直接使用范围向量的情况很少,一般是作为过渡存在,再次将其转化为瞬时向量。在程序中我们使用 req_count 来表示当前请求的累计总数,这个数字是单调递增的,但是如果我们想知道每秒请求数,可以使用 rate 函数,比如说 rate(req_count[4m]) 就可以计算 4 分钟内每秒请求数,也就是请求速率。根据高中物理公式,`速率 = 距离 / 时间`,我们假定在四分钟内 t1 为第一个采集到的数据,t4 为最后一个采集到的数据,则对于 `status` 为 200 的指标来说,其速率为

```
rate=(22-10)/(4*60)​=0.05 请求/秒
```

**公式 14.3.2.1 速率公式**

根据上述公式,我们依次带入各个 status 的 req_count 首尾差值,就会得到一个瞬时向量:

```
[
0.05/*lable为200的req_count速率*/,
0.008/*lable为500的req_count速率*/,
0.008/*label为501的req_count速率*/
]
```

**代码 14.3.2.4 应用 rate 函数后生成的瞬时向量**

grafana 使用 promql 来绘制图表,我们在 **图 14.3.1.7** 中看到的各个图标,都是基于 promql 语句查询绘制的界面,不过 grafana 要求这些 promql 必须是瞬时向量。最简单的瞬时向量就是直接写指标名字(例如 `req_count`)。

我们在 **图 14.3.1.7** 的右上角位置找到 **Add** 菜单,点击打开后选择 **Visualization**

![](images/add_visual.png)

**图 14.3.2.2 添加 grafana 可视化面板菜单**

在弹出的界面中输入表达式 `req_count{instance=~"$instance"}` :

![](images/input_visualization_express.png)

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

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

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

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

Expand Down
Binary file added text/images/add_visual.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added text/images/input_visualization_express.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added text/images/input_visulization_express.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 05967b5

Please sign in to comment.