7-Grafana 可视化面板 Graph 与 SingleStat
1. 认识Graph面板
·Graph面板是最常用的一种可视化面板 , 其通过折线图或者柱状图的形式显示监控样本随时间而变化的趋势。
1.2 Graph面板与Prometheus
Graph面板通过折线图或者柱状图的形式 , 能够展示监控样本数据在一段时间内的变化趋势 , 因此其天生适合Prometheus中的Counter和Gauge类型的监控指标的可视化 , 对于Histogram类型的指标也可以支持 , 不过可视化效果不如Heatmap Panel来的直观。
1.3 使用Graph面板可视化Counter/Gauge
以主机为例 , CPU使用率的变化趋势天然适用于使用Grapn面板来进行展示 :

在Metrics选项中 , 我们使用以下PromQL定义如何从Prometheus中读取数据 :
1 - (avg(irate(node_cpu{mode='idle'}[5m])) without (cpu))根据当前Prometheus的数据采集情况 , 该PromQL会返回多条时间序列,raph面板会从时间序列中获取样本数据 , 并绘制到图表中。为了让折线图有更好的可读性 , 我们可以通过定义Legend format为{{ instance }}控制每条线的图例名称 :

由于当前使用的PromQL的数据范围为0~1表示CPU的使用率 , 为了能够更有效的表达出度量单位的概念 , 需要对Graph图表的坐标轴显示进行优化。
在Axes选项中可以控制图标的X轴和Y轴相关的行为。Axes ( 坐标轴) : 用于坐标轴和网格的显示方式 , 包括单位 , 比例 , 标签等。
默认情况下 , Y轴会直接显示当前样本的值 , 通过Left Y的Unit可以让Graph面板自动格式化样本值。当前表达式返回的当前主机CPU使用率的小数表示 , 因此 , 这里选择单位为percent(0.0.-1.0)。

除了百分比以外 , Graph面板支持如日期、货币、重量、面积等各种类型单位的自动换算 , 用户根据自己当前样本的值含义选择即可。

Options中可以设置图例的显示方式以及展示位置 ,Values中可以设置是否显示当前时间序列的最小值 , 平均值等。Decimals用于配置这些值显示时保留的小数位。
图例的参数
Total:返回所有度量查询值的总和
Current:返回度量查询的最后一个值
Min:返回最小的度量查询值
Max:返回最大的度量查询值
Avg:返回所有度量查询的平均值
Decimals:控制Legend值的多少 , 以小数显示悬浮工具提示注 :
Legend值取决于你使用的度量查询方式和什么样类型的聚合来作为基础标准
还可以对图表进行一些更高级的定制化 , 以便能够更直观的从可视化图表中获取信息。在Graph面板中Display(显示样式)选项可以帮助我们实现更多的可视化定制的能力 , 其中包含三个部分 : Draw options、Series overrides和Thresholds。

1.4 Draw options
Draw Options用于设置当前图标的展示形式、样式以及交互提示行为。其中 , Draw Modes用于控制图形展示形式 :
Bar( 柱状)Lines ( 线条)
Points ( 点)
可以根据自己的需求同时启用多种模式。
Mode Options则设置各个展示模式下的相关样式。
Fill:系列的颜色填充,0是没有。Line Width:线的宽度。Staircase:楼梯状显示。 如果有多个选择项,它们可以作为一个群体显示。
Hover tooltip : 用于控制当鼠标移动到图形时 , 显示提示框中的内容。
叠加和空值( Stacking & Null value)
Stack: 每个系列是叠在另一个之上Null value: 空值如果你启用了堆栈可以选择应该显示鼠标悬停功能。
Time range( 时间范围)

1.5 Series overrides
如果希望当前图表中的时间序列以不同的形式展示 , 则可以通过Series overrides控制 , 顾名思义 , 可以为指定的时间序列指定自定义的Draw Options 配置 , 从而让其以不同的样式展示。例如 :

这里定义了一条自定义规则 , 其匹配图例名称满足/localhost/的时间序列 , 并定义其以点的形式显示在图表中。
1.6 Thresholds
Display选项中的最后一个是Thresholds , Threshold主要用于一些自定义一些样本的阈值 , 例如 , 定义一个Threshold规则 , 如果CPU超过50%的区域显示为warning状态 , 可以添加如下配置 :

Graph面板则会在图表中显示一条阈值 , 并且将所有高于该阈值的区域显示为warining状态 , 通过可视化的方式直观的在图表中显示一些可能出现异常的区域。
需要注意的是 , 如果用户为该图表自定义了Alert(告警)配置 , Thresholds将会被警用 , 并且根据Alert中定义的Threshold在图形中显示阈值内容。
1.7 使用Graph面板可视化Histogram
以Prometheus自身的监控指标prometheus_tsdb_compaction_duration为例 , 该监控指标记录了Prometheus进行数据压缩任务的运行耗时的分布统计情况。如下所示 , 是Prometheus返回的样本数据:
# HELP prometheus_tsdb_compaction_duration Duration of compaction runs.
# TYPE prometheus_tsdb_compaction_duration histogram
prometheus_tsdb_compaction_duration_bucket{le="1"} 2
prometheus_tsdb_compaction_duration_bucket{le="2"} 36
prometheus_tsdb_compaction_duration_bucket{le="4"} 36
prometheus_tsdb_compaction_duration_bucket{le="8"} 36
prometheus_tsdb_compaction_duration_bucket{le="16"} 36
prometheus_tsdb_compaction_duration_bucket{le="32"} 36
prometheus_tsdb_compaction_duration_bucket{le="64"} 36
prometheus_tsdb_compaction_duration_bucket{le="128"} 36
prometheus_tsdb_compaction_duration_bucket{le="256"} 36
prometheus_tsdb_compaction_duration_bucket{le="512"} 36
prometheus_tsdb_compaction_duration_bucket{le="+Inf"} 36
prometheus_tsdb_compaction_duration_sum 51.31017077500001
prometheus_tsdb_compaction_duration_count 36istogram用于统计样本数据的分布情况 , 其中标签le定义了分布桶Bucket的边界 , 如上所示 , 表示当前Prometheus共进行了36次数据压缩 , 总耗时为51.31017077500001ms。其中任务耗时在0到1ms区间内的为2次、在0~2ms区间范围内为36次 , 以此类推。

Graph面板重新计算了Bucket边界 , 如下所示 , 在0到1ms范围内的任务次数为2 , 在1~2ms范围内的运行任务次数为34。通过图形的面积 , 可以反映出各个Bucket下的大致数据分布情况:

2. 认识SingleStat面板
Singlem Panel侧重于展示系统的当前状态而非变化趋势。
适用于一下场景:
1.当前系统中所有服务的运行状态;
2.当前基础设施资源的使用量;
3.当前系统中某些事件发生的次数或者资源数量等。
2.1 使用SingleStat Panel
从Dashboard创建Singlestat Panel , 并进入编辑页面 , 对于SingleStat Panel而言 , 其只能处理一条时间序列 , 否则页面中会提示“Multiple Series Error”错误信息。这里使用如下PromQL查询当前主机负载:
node_load1{instance="localhost:9100"}
默认情况下 , 当前面板中会显示当前时间序列中所有样本的平均值 , 而实际情况下 , 我们需要显示的是当前主机当前的负载情况 , 因此需要通过SingleStat Panel的Options选项控制当前面板的显示模式:

如上所示 , 通过Value配置项组可以控制当前面板中显示的值 , 以及字体大小等。对于主机负载而言 , 我们希望能够显示当前的最新值 , 因此修改Stat为Current即可。
如果希望面板能够根据不同的值显示不同的颜色的话 , 则可以定义Thresholds与Colors的映射关系 , 例如 , 定义Thresholds的分割区间值为“0,1” , 则当Value的值落到不同的范围内时 , 将显示不同的颜色。
如果希望能够显示当前时间序列的样本值变化情况 , 则可以启用Spark lines配置。启用之后 , Singlestat面板中除了会显示当前的最新样本值以外 , 也会同时将时间序列中的数据已趋势图的形式进行展示。
除了通过数字大小反应当前状态以外 , 在某些场景下我们可能更关心的是这些数字表示的意义。例如 , 在Promthues监控服务的健康状态时 , 在样本数据中会通过0表示不健康 , 1表示健康。但是如果直接将0或1显示在面板中 , 那么可视化效果将缺乏一定的可读性。
为了提升数字的可读性 , 可以在Singlestat Panel中可以通过Value Mappings定义值的映射关系。Siglesta支持值映射 ( value to text ) 和区间映射 ( range to text ) 两种方式。如下所示:

当面板中Value的值在0~0.99范围内则显示为Health , 否则显示为Unhealth。这种模式特别适合于展示服务的健康状态。当然你也可以将Value映射为任意的字符 , 甚至是直接使用
参考链接
构建企业级监控平台系列 ( 三十三( : Grafana 可视化面板 Graph 与 SingleStat (qq.com)