如何绘制美观的 Grafana 面板?以Apache IoTDB 监控指标为例

本文以Apache IoTDB master 分支的 commit Id=eaee1d8d 为例,介绍了 Apache IoTDB 的监控指标通过 Prometheus 格式进行采集,并且使用 Grafana 的方式进行可视化。

1. 监控指标的 Prometheus 格式说明

对于 Metric Name 为 name, Tags 为 K1=V1, …, Kn=Vn 的监控指标有如下映射,其中 value 为具体值

监控指标类型 映射关系
Counter name_total{k1=“V1”, …, Kn=“Vn”} value
AutoGauge、Gauge name{k1=“V1”, …, Kn=“Vn”} value
Histogram name_max{k1=“V1”, …, Kn=“Vn”} value
name_sum{k1=“V1”, …, Kn=“Vn”} value
name_count{k1=“V1”, …, Kn=“Vn”} value
name{k1=“V1”, …, Kn=“Vn”, quantile=“0.0”} value
name{k1=“V1”, …, Kn=“Vn”, quantile=“0.5”} value
name{k1=“V1”, …, Kn=“Vn”, quantile=“0.75”} value
name{k1=“V1”, …, Kn=“Vn”, quantile=“0.99”} value
name{k1=“V1”, …, Kn=“Vn”, quantile=“0.999”} value
Rate name_total{k1=“V1”, …, Kn=“Vn”} value
name_total{k1=“V1”, …, Kn=“Vn”, rate=“m1”} value
name_total{k1=“V1”, …, Kn=“Vn”, rate=“m5”} value
name_total{k1=“V1”, …, Kn=“Vn”, rate=“m15”} value
name_total{k1=“V1”, …, Kn=“Vn”, rate=“mean”} value
Timer name_seconds_max{k1=“V1”, …, Kn=“Vn”} value
name_seconds_sum{k1=“V1”, …, Kn=“Vn”} value
name_seconds_count{k1=“V1”, …, Kn=“Vn”} value
name_seconds{k1=“V1”, …, Kn=“Vn”, quantile=“0.0”} value
name_seconds{k1=“V1”, …, Kn=“Vn”, quantile=“0.5”} value
name_seconds{k1=“V1”, …, Kn=“Vn”, quantile=“0.75”} value
name_seconds{k1=“V1”, …, Kn=“Vn”, quantile=“0.99”} value
name_seconds{k1=“V1”, …, Kn=“Vn”, quantile=“0.999”} value

2. Prometheus 函数说明

2.1. Aggregation operator

参考文档:Operation | Prometheus

  1. 运算符:sum(calculate sum over dimensions), min(select minimum over dimensions), max(select maximum over dimensions), avg(calculate the average over dimensions), count(count number of elements in the vector)
  2. 所有的聚合运算符都可以在所有的维度列上进行聚合,也可以通过 without 或者 by 子句来决定聚合方式,对应语法规约:
<aggr-op> [without|by (<label list>)] ([parameter,] <vector expression>)
   or
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)] 

2.2. Functions

参考文档:Query functions|Prometheus

rate(v range-vector): 计算范围向量中时间序列的每秒平均增长率。rate 会自动调整单调性中断,例如由于目标重启导致的计数器重置。例如,如下的表达式返回范围向量中每个时间序列在过去 5 分钟内测量的每秒 HTTP 请求速率:

rate(http_requests_total{job="api-server"}[5m])

irate(v range-vector): 计算范围向量中时间序列的每秒瞬时增长率。irate 会自动调整单调性中断,例如由于目标重启导致的计数器重置。例如,如下的表达式通过查找 5 分钟前两个最近的数据点得出 HTTP 请求的每秒速率:

irate(http_requests_total{job="api-server"}[5m])

irate 函数同样也是通过计算一个新的直方图作为原生直方图,不同的是,计算的是原生直方图中最后2个分量之间的增长率。适用于易变的、快速移动的计数器。zh 注意,当 irate 与聚合运算符(如 sum)或随着时间聚合的函数 (任何以 _over_time 结尾的函数) 结合使用时,始终首先采用 irate,然后进行聚合,否则 irate 无法在目标启动时候检测到计数器重置。

3. Grafana 可视化绘制

官方文档参考:Grafana Dashboard Doc

3.1. 创建或导入 Dashboards

如果已有 Dashboard,只是修改 Dashboard 跳过本步骤

点击左侧边栏 Dashboards -> browse:

  • 已有 Dashboard:点击右侧 import 按钮导入对应的 Dashboard 即可。
  • 创建 Dashboard:点击右侧 New Dashboard 按钮。

进入 Dashboard 后点击右上角 设置 按钮:

  • 在 General 界面更新 Name,Description,Tag 等基础信息,调整 Panel options 为 Shared crosshair,从而保证 tooltip 可以跨 panel 使用。
  • 在 Variables 界面定义本 Dashboard 的变量。

添加 job 变量,类型为 Query,对应的Query Options 是 label_values(job)

添加 instance 变量,类型为 Query,对应的 Query Options 是 label_values(up{job=~“$job”},instance)

3.2. 创建 Panel

优秀绘制参考:Grafana Dashboard Demo

点击右上角:Add Panel,其中 Add a new panel 是添加一个面板,Add a new row 是添加一个行(分组,两个行之间的所有 panel 属于前一个row)

点击 Add a new Panel,添加一个面板。首先点击右上角,选择当前 Panel 的类型,比较常用的有Time series(时间序列)、Stat(统计)、Gauge(寄存器)等等,可以视情况选择。

3.3. 编写 PromQL

以 Timeseries 为例,首先编写对应的 PromQL 执行数据查询:

  • 在 PromQL 中,可以用 $instance 访问到刚刚在 Dashboard 的 Variables 中配置的 instance 变量,job 变量也是类似的。
  • 在 Legend 中,可以通过双中括号访问到对应的监控项的对应 Tag 的具体值,比如在下图的例子中,state=“blocked/new/runnable/terminated/timed-waiting/waiting”,通过这样的方式修改图例。
  • 可以通过点击 + Query 在当前面板添加更多时间序列

3.4. 调整 Panel Options

在右侧的 Panel Options 中可以更新当前面板的标题、描述并设置面板背景是否透明:

3.5. 调整 Tooltip

在右侧的 Tooltip 中可以选择不同的类型:

Tooptip mode 包含 3 个选项:Single(只显示距离鼠标最近的一条),All(显示鼠标所在时间线的所有条,可以不排序、升序或降序),Hidden(不显示):

3.6. 调整 Legend

在右侧的 Legend 可以调整图例:

  • Mode:List(列表)、Table(表格)、Hidden(不显示)
  • Placement:Bottom(放在底部)、Right(放在右侧)
  • Legend Values:是否要同时显示对应的时间序列的值

如下示例我们将图例放置在右侧,采用表格的形式,并且显示平均值:

3.7. 调整 Graph Styles

在右侧的 Graph Styles 可以调整线的样式,包括 line、bar 和 point 三类:

  • line:还可以调整插值、线宽、填充透明度、渐变模式、线形、空值连接方法、是否显示等属性
  • bar:还可以调整类型、线宽、填充透明度、渐变模式、是否显示点等属性
  • points:还可以调整点大小等属性

如下示例我们使用线,设置填充透明度为5%,从不显示点:

3.8. 调整 Axis

在右侧的 Axis 可以调整对应的轴信息,包括标签、宽度、纵轴最小值、纵轴最大值等等,一般不需要调整:

3.9. 调整 Standard Options

在右侧的 Standard options 可以设置单位(有byte, s, ms, us, ns等等,还可以自定义)、显示最小值、显示最大值、精度、展示名称、配色(可以选择单个颜色、根据阈值或者现有配色方案)等:

如下示例为自定义单位为个,最小值设置为0,最大值设置为300:

3.10. 调整 Value Mappings

在右侧的 Value mappings 可以添加对应的映射:可以根据值、范围、正则和特殊值(空等)来控制其展示的文本,比如0代表离线,1代表上线,可以通过 value mappings 完成:

3.11. 调整 Thresholds

在右侧的 Thresholds 则是设置阈值,可以结合Standard options中的配色方案使用:

  • 阈值设置:可以设置绝对阈值、相对阈值(和显示最大值、显示最小值有关)
  • 阈值显示:可以选择不显示阈值、显示阈值线、显示阈值阴影和同时显示阈值线和阴影

例如设置为 60% 和 80% 的阈值,并且显示阈值吸纳和阴影线:

3.12. 调整 Overrides

可以通过 Overrides 来重写部分时间序列的上述某些属性,支持通过名字、名字正则、类型和返回值重写,重写的属性具有更高的优先级:

例如我可以重写 name 为 waiting 的时间序列的颜色为绿色,如下所示:

至此,已经完成了对于 Panel 创建的简单介绍,可以通过在 Dashboard 中拖拽 Panel 改变其位置,也可以通过拖拽 Panel 的右下角来改变 panel 的大小。

4. 导出 Grafana

点击左上角的导出按钮:

点击 Export 标签页,并选择 Export for sharing externally,然后点击 save to file 就将对应的 Dashboard 的 json 文件下载到本地了:

最后,将 Dashboard 的 json 上传到 GitHub (docs/UserGuide/Monitor-Alert文件夹下) 的对应位置即可。