type
status
date
slug
summary
tags
category
icon
password
Grafana 概述
Grafana 是一个监控仪表系统(开源数据绘图工具平台),它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度,你只需要提供你需要监控的数据,它就可以帮你生成各种可视化仪表。同时它还有报警功能,可以在系统出现问题时通知你。
Prometheus提供了一个查询语言(PromQL)来检索时间序列数据,但是如果您直接在Prometheus的界面编写PromQL查询,那么这些查询会随着页面的刷新而丢失。为了更方便地展示和管理Prometheus的数据,您可以使用Grafana。Grafana可以与Prometheus集成,允许您在Grafana的用户界面中创建和管理面板,同时使用PromQL查询语言从Prometheus数据源实时获取数据,并进行图表展示、警报设置等操作。这样,您就可以方便地通过Grafana来展示、监控和分析Prometheus中的数据,而不需要每次都重新编写查询。
Grafana 本身并不负责数据层,它只提供了通用的接口,让底层的数据库可以把数据给它。也就是说 Grafana 每次要展现一个仪表盘的时候,会向 Prometheus 发送一个查询请求。真正监测数据来源的是 Prometheus-exporter 这个服务,它会查询你的本地电脑的信息,比如内存还有多少、CPU 负载之类,然后将数据导出至普罗米修斯数据库。
Grafana 需要一个数据库来存储其配置数据,比如用户、数据源和仪表盘等,目前 Grafana 支持 SQLite、MySQL、PostgreSQL 3 种数据库,默认使用的是 SQLite,该数据库文件会存储在 Grafana 的安装位置,所以需要对 Grafana 的安装目录进行持久化。
安装部署
要安装 Grafana 的方式有很多,我们这里使用的是 CentOS 系统,可以在 Grafana 官方下载页面筛选合适的版本https://grafana.com/grafana/download,据自己的需求来进行安装,比如我们这里直接使用 rpm 包进行安装:
在浏览器中,复制
http://localhost:3000
应该就可以看到 Grafana 跑起来的初始登录界面。初始的用户名是 admin,密码也是 admin。输入之后,会要求你改密码。
当然如果我们想要部署一个高可用版本的 Grafana 的话,那么使用 SQLite 数据库就不行了,需要切换到 MySQL 或者 PostgreSQL,我们可以在 Grafana 配置的
[database]
部分找到数据库的相关配置,Grafana 会将所有长期数据保存在数据库中,然后部署多个 Grafana 实例使用同一个数据库即可实现高可用。
数据源
Grafana
支持多种数据源,我们这里当然使用 Prometheus
作为数据源来进行说明。在 Grafana
左侧工具栏选择 Configuration
,点击下面的 Data sources
,打开添加数据源的页面
点
Add Data Source
即添加数据源,选择 Prometheus
,填写数据源 URL
。注意Promethues
的工作原理是通过轮询一个 HTTP
请求来获取数据的,而 Grafana
在获取数据源的时候也是通过一个 HTTP
请求,因此这个地方你需要告诉 Grafana
你的 Prometheus
的数据端点是什么。
配置完成后,拉到最下方点击
Save & test
,提示添加成功即表面数据源添加成功了。然后在数据源列表中就会出现我们刚刚添加的 Prometheus 这个数据源了Dashboard
面板是属于某一个 Dashboard 的,所以我们需要先创建一个 Dashboard,在侧边栏点击
+
切换到 Dashboard 下面开始创建 Dashboard
在默认创建的新的 Dashboard 中就有一个空的面板,点击
Add a new panel
即可开始添加面板:

进入面板编辑器后即可添加面板了,比如我们现在就要来查询节点的 CPU 使用率
(1 - sum(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) / sum(rate(node_cpu_seconds_total[5m])) by (instance) ) * 100
,只需要将该语句填充到查询的 PromQL 语句中即可在上面显示出监控的结果:
tooltip用于控制鼠标移动到曲线显示的信息,Single表示鼠标移动到哪个图形就显示哪个, All表示鼠标放在监控上信息都显示,Hidden表示不显示

将 Legend 的模式修改为 Table模式后,可以看到图形中的 Legend 用表格的形式展示出来了,此外我们还可以通过
Legend values
来选择一些其他的信息进行展示,比如最大值、最小值、平均值等等:
面板展示的标签是通过Prometheus查询的结果

Transform 转换功能允许我们在查询结果可视化之前加入、计算、重新排序、隐藏和重命名查询结果,不过目前只支持时间序列数据。对于拥有大量仪表板或大量查询的用户而言,能够在另一个面板中重用来自一个面板的查询结果可能会带来巨大的性能提升。如果有多个转换,Grafana 会按照它们列出的顺序来应用它们,每个转换都会创建一个新的结果集,该结果集会传递到管道中的下一个转换进行处理。
Grafana 中支持非常多的转换方式,我们这里使用 Rename by regex 这个通过正则重命名的转换器即可,这里我们只需要添加一个
(.*):9100
的正则表达式即可,将 host 信息保留下来。点击编辑器下方 Transform 选项卡进入转换页面,如下图所示:
这里$1展示的就是
.*
的结果, 关于转换的更多使用方法可以参考官方文档https://grafana.com/docs/grafana/latest/panels/transformations/types-options了解更多信息。Legend格式其实就是格式化展示显示在图形上的东西,可以通过修改如下进行自定义内容展示

此外还可以配置图例的最小值、最大值、保留小数的位数、图形颜色配置等等。由于我们这里计算的都是百分比,所以可以将单位设置为 %,位于右侧的 Standard options 下方的 Unit 中选择 Misc -> Percent(0-100) 即可:

在面板编辑器下方的 Query 区域点击 + Query 按钮新增一个查询,这样就将不同的查询整合到同一个panel里面来了

系统CPU使用率:
sum(rate(node_cpu_seconds_total{instance=~"$hosts",mode="system"}[1m])) by (instance) / sum(rate(node_cpu_seconds_total{instance=~"$hosts"}[1m])) by (instance) * 100
空闲CPU: (1 - sum(rate(node_cpu_seconds_total{mode="idle",instance=~"$instance"}[1m])) by (instance) / sum(rate(node_cpu_seconds_total{instance=~"$instance"}[1m])) by (instance) ) * 100
变量
一个 Dashboard 中会直接将所有的节点信息展示在同一个面板中,但是如果有多个节点,这种情况下我们最好的方式是将节点当成参数,可以让用户自己去选择要查看哪一个节点的监控信息,要实现这个功能,我们就需要去添加一个以节点为参数的变量来去查询监控数据。点击 Dashboard 页面右上方的
Dashboard settings
按钮,进入配置页面。
在该 Settings 页面可以来对整个 Dashboard 进行配置,比如名称、标签、变量等。点击左边的 Variables 添加一个变量,变量支持更具交互性和动态性的仪表板,我们可以在它们的位置使用变量,而不是在指标查询中硬编码,变量显示为 Dashboard 顶部的下拉列表,这些下拉列表可以轻松更改仪表板中显示的数据。

为了能够选择节点数据,这里我们定义了一个名为
instance
的变量名, 监控节点的相关指标是来源于名为 node-exporter 的任务,我们可以通过查询 up 来获取所有的监控实例。在添加变量的页面中主要包括如下一些属性:
图上执行的查询语句,查到的值为up{instac="",job=""},要想获取到 instance 标签中的值,我们这里可以使用一个正则表达式
.*instance="(.*?)".*
来获取实例数据,只匹配小括号里面的值,所以得到的结果是
除了使用正则表达式的方式来获取需要的值,此外我们还可以使用一个
label_values()
的函数来直接获取查询结果中的某个 label 标签的值, label_values(xxxxx,inss),取这个指标install对应的值

回到 Dashboard 页面就可以看到多了选择节点的下拉框

鼠标点击发现面板并不会随着我们下拉框的选择而变化,我们需要将
node
这个变量传入查询语句中,比如重新修改CPU使用率的查询语句,将 node
这个变量传入查询语句中 instance =~ "$node "
。加载时刷新,因为变量值源于查询语句,数据源的查询结果是动态的,会随时变化。所以加载的时候重新加载页面
修改时间间隔


面板
面板(Panel)是 Grafana 中基本可视化构建块,每个面板都有一个特定于面板中选择数据源的查询编辑器,让用户可以从不同的数据源(如 Prometheus)中查询出相应的监控数据,并且以可视化的方式展现,Grafana 中所有的面板均以插件的形式进行使用。每个面板都有各种各样的样式和格式选项,面板可以在仪表板上拖放和重新排列,它们也可以调整大小,所以要在 Grafana 上创建可视化的图表。
表格面板
表格面板可视化非常灵活,支持时间序列和表格和原始 JSON 数据的多种模式,此面板还提供日期格式、值格式和着色选项
添加表格面板,在 Dashboard 中添加添加一个空的 Panel 面板,进入面板编辑器后在右侧上方选择 Table 面板

可以使用
node_uname_info
指标来展示节点信息,展示节点信息
然后再添加一个查询来获取节点运行时间的相关信息,可以使用
node_boot_time_seconds
指标来进行计算,查询语句为 sum(time() - node_boot_time_seconds{job="node-exporter"})by(instance)

我们对于节点其他资源统计也非常关心,比如节点总内存、总 CPU 数、负载、带宽等等信息,接下来分别添加如下查询:
总内存:
node_memory_MemTotal_bytes{job="node-exporter"}
CPU 核数:count(node_cpu_seconds_total{job="node-exporter", mode='system'}) by (instance)
5 分钟负载:node_load5{job="node-exporter"}
连接数:node_netstat_Tcp_CurrEstab{job="node-exporter"}
下载带宽:max(rate(node_network_receive_bytes_total{job="node-exporter"}[$interval])*8) by (instance)
上传带宽:max(rate(node_network_transmit_bytes_total{job="node-exporter"}[$interval])*8) by (instance)
如还有其他需要展示的也可以直接添加新的查询即可:
现在我们将所有需要展示的信息都通过 Table 形式展示出来了,但是现在有一个很大的问题,就是需要对每一个查询切换显示:

这显然是非常不友好的显示方式,我们需要将这些表格内容合并成一个表格进行展示,这个时候就需要用到 Grafana 的 Transform 转换功能了,在 Transform 选项卡中选择 Merge 选项:

Merge 转换器可以合并多个序列或者多个表格为一个表格,其中可合并的值将合并到同一行中,用于显示在表格中可视化的多个序列、表格或两者的组合。当我们选择了 Merge 转换器过后就会将上面的多个查询结果合并成一个表格。

但其实合并后的表格数据有一些地方没有显示,这是因为我们查询的结果实际上是包含 name 这个标签的,在合并的时候会造成数据丢失,我们可以将所有的查询语句后面添加上一个 - 0 来去掉这个标签,这样合并的时候就不会丢失数据了。比如查询主机信息的语句变成 node_uname_info{job="node-exporter"} - 0,其他的语句也都加上 - 0 这个操作

数据虽然正确了,但是表头却看不出来是表达的什么意义,有的列还是不需要的,这个时候同样也要用到 Transform 转换器了,这里我们需要用到的是 Organize fields 转换器,该转换器允许用户重新排序、隐藏或重命名字段或者列。这里我们将不需要的一些列隐藏掉了,将表头进行了重命名

上面我们将查询的数据结果用一个表格展示出来了,但是现在我们的数据都是直接的一个结果,我们需要进行转换加上我们的单位。
比如对于运行时间这一列,我们需要添加覆盖,设置一个 seconds (s) 类型的单位,然后会根据我们的结果进行自动转换

同样对总内存这一列的数据结果进行覆盖添加 bytes(IEC) 类型的单位

此外在定制某列数据的显示效果的时候我们还可以为其配置背景颜色,只需要设置 Cell display mode 表格模式,该属性可以配置文本颜色、背景、按照 gauge 进行显示等方式

比如我们可以为 CPU使用率 与 内存使用率 配置显示模式为 LCD gauge,显示效果如下所示

我们还可以定义一个 total 参数来表示监控的主机总数,不过需要注意的是这里的参数我们不需要展示,需要选择隐藏方式为 Variable

再单独定义一个显示主机名的变量,这里我们使用的查询语句为 node_uname_info{instance=~"$host"},需要注意的是这里关联的是前面定义的 $host 这个变量

然后我们可以添加两个空的 Row 行

把我们的面板放到不同的行中去,并为每一行定义显示标题,标题里面就可以使用前面定义的变量

到这里我们的节点监控的完整效果如下所示

仪表盘
如果想展示与最大值和最小值相关的数据,我们可以选择使用仪表盘面板,比如我们用一个仪表盘面板来展示内存使用率
标准仪表盘可视化
在 Dashboard 页面上点击创建一个新的空面板,在面边编辑器右上方选择 Gauge 类型的面板

然后添加如下所示的查询语句,获取内存使用率

接下来在右侧属性区域设置单位、最小值为 0、最大值为 100

同样的,如果选择多个节点的时候显示不够友好

需要在 Legend 地方配置显示的标签 {{instance}},然后添加一个 Rename by regex 的转换器

条形仪表盘可以显示一个或多个条形仪表,同样我们可以用来展示 CPU 使用率、内存使用率等。比如这里我们用条形仪表盘来进行展示。点击添加一个新的空面板,在面板编辑器右侧选择 Bar gauge

添加 CPU 使用率的查询

查询语句添加完成后,在右侧属性配置中设置 Bar gauge 的展示方向为水平 Horizontal 方向,显示模式为 Retro LCD,同时设置显示的单位为 Percent (0-100),最小值为 0.1,最大值为 100,这样就将 CPU 使用率用条形仪表盘的形式展示出来了,用同样的方式添加内存使用率的展示

比如我们还可以添加一个最大分区的使用率,要获取该监控数据,首先我们就要先获取最大的分区目录,这里要使用的指标是 node_filesystem_size_bytes:

首先我们要过滤掉不是 ext3(4) 或者 xfs 类型的文件系统 node_filesystem_size_bytes{fstype=~"ext.?|xfs"}:

然后可以按照挂载点 mountpoint 大小进行排序,获取最大的一个结果 topk(1,sort_desc(max(node_filesystem_size_bytes{fstype=~"ext.?|xfs"}) by (mountpoint)))

获取到了最大的分区后就可以来方便的计算分区的使用率了,比如查询 node1 节点的根分区 / 的使用率
要在 Grafana 的面板中查询最大分区使用率,这里我们需要先将最大分区的获取通过参数进行配置,添加一个名为 maxpoint 的参数,查询语句为 query_result(topk(1,sort_desc (max(node_filesystem_size_bytes{instance=~'node1:9100',fstype=~"ext.?|xfs"}) by (mountpoint)))),然后通过正则表达式来获取定义的参数值:(如果不希望将变量以下拉框的形式显示,那么就Hide)

这样在面板中要查询的最大分区使用率语句如下所示

最终的效果如下图所示

统计面板
统计面板可以用于显示一个大的统计值和一个可选的背景颜色,我们可以使用阈值来控制背景或颜色值,效果如下所示

文本模式:首先创建一个空的面板,选择使用 Stat 面板

首先添加一个用于查询节点运行时间的统计数据

同样我们可以在面板编辑器右侧对该面板的属性进行编辑,可以选择展示的方向是水平还是垂直,文本展示模式选择只展示 Value 值或者只展示 Name,也可以都显示,也可以不显示。这里我们选择默认的 Auto 即可,颜色模式也有 None、Value、Background三个选项,Value 选项会根据设置的阈值进行展示,而 Background 则会显示背景颜色。
接着同样可以设置单位,最大值、最小值等,比如这里我们设置单位为 seconds (s)

这里我们设置的颜色是 From thresholds (by value) 也就是可以根据阈值设置的值进行展示,所以我们可以配置下不同阈值想要显示的颜色值,比如这里我们设置阈值在 1 和 3 的时候显示不同的颜色

由于现在统计结果为 5,已经超过了 3,所以显示的是绿色的文本。然后用同样的方式再添加一个统计 CPU 核数的统计面板

比如还可以添加一个统计节点总内存的统计面板

上面我们的统计面板只展示了值的结果,属于纯文本的模式,此外我们还可以在展示的使用带背景颜色的方式,比如我们将内存使用率的展示使用 Stat 面板进行显示,设置文本模式为 Value and name,颜色模式为 Background,效果如下所示

然后根据需求设置不同的阈值显示的颜色即可,同样我们可以将之前的 CPU 使用率和最大分区使用率改成使用 Stat 统计面板进行展示,最终的完整效果如下所示

文本面板
文本面板不需要查询语句,直接用来展示文本信息,而且是支持 Markdown 和 HTML 两种格式,这就为我们提供了很大的定制灵活性。
文本面板的使用非常简单,直接选择使用 Markdown 还是 HTML 来设置文本样式即可,然后在面板编辑器的文本框中输入内容即可。比如很多公司业务太大太多,需要监控的 Dashboard 非常多,操作管理起来非常麻烦,这个时候我们就可以使用文本面板来做一个导航页面进行归类。
现在我们创建一个新的 Dashboard,添加一个新的空面板,选择使用 Text 面板:

然后就可以在内容框中输入我们想要展示的内容了:

我们可以看到有 Markdown 和 HTML 两种模式可以选择,比如我们选择使用 Markdown 模式,则可以在面板内容区域输入想要展示的 Markdown 内容,比如我们输入如下所示的内容:
渲染效果如下:

同样由于支持 HTML 格式的内容,所以我们可以随意对内容的样式进行定制,比如我们添加几个文本链接,去链接到其他的 Dashboard 或者面板
渲染效果如下所示:

同样我们还可以将同类型的业务监控进行归类,添加一个新的 Row,将业务进行归类:

开源监控模版
浏览器访问https://grafana.com/grafana/dashboards ,在页面中可以按名称搜索想要的模版 ,比如我们这里搜索
node exporter

选择适合的面板,点击
Copy ID
或者 Download JSON

在 grafana 页面中,
+
-> Import
,输入面板 ID 号或者上传 JSON 文件,点击 Load,即可导入监控面板


备份和恢复
当我们的dashboard设置的 graph 越来越多时,我们除了即时保存,还可以以导出的⽅法永久保存,以备不时之需
Dashboard右上角,点击Share Dashboard图标导出

导入备份的数据




告警
Grafana 除了支持丰富的数据源和图表功能之外,还支持告警功能,该功能也使得 Grafana 从一个数据可视化工具成为了一个真正的监控利器。Grafana 可以通过 Alerting 模块的配置把监控数据中的异常信息进行告警,告警的规则可以直接基于现有的数据图表进行配置,在告警的时候也会把出现异常的图表进行通知,使得我们的告警通知更加友好。
Grafana Alerting 支持多种告警渠道,比如钉钉、Discord、Email、Kafka、Pushover、Telegram、Webhook 等等,我们这里可以使用钉钉和 Email 进行展示说明
邮箱告警
邮箱告警通常是最常见的告警接收方式,通过 Grafana 告警需要在 Grafana 的配置文件中配置 stmp 服务。在配置文件
/etc/grafana/grafana.ini
文件中添加 SMTP/Emailing
配置块并开启 Alerting我们这里使用的是qq邮箱,在配置 smtp 的时候需要在邮箱中开启
IMAP/SMTP
和 POP3/SMTP
两个服务
配置完成后重新启动 Grafana,然后回到 Grafana 页面中点击左侧的
Notification channels
开始添加消息通知渠道
点击
Add channel
按钮新建一个通知渠道,这里我们选择渠道类型为 Email,填写收件人地址即可发送测试邮件。Include image需要手动勾选,这样发送邮件时才会附带监控图表信息。新版本中默认不勾选,因为需要安装插件。
相关参数说明:
Default 默认关闭,开启后所有Panel中设置的告警时都会默认使用此通道。
Include image 开启后,表示发送告警图片,该功能需要安装Grafana插件Grafana Image Renderer。
Disable Resolve Message 开启后,当告警解除时不发送[OK]邮件;默认发送恢复邮件。
Send reminders 开启后,需设置发送间隔,表示在告警发生后且持续处于告警状态时,每间隔一段时间发送一次邮件;否则只发送一次。
点击test后,进入邮箱就会收到一个通知

测试成功之后点击保存,然后回到仪表盘配置告警

选择一个面板添加告警,我这里是对已有的面板进行编辑,当然也可以创建一个新的面板进行编辑

告警语句不能使用变量,这里我们选择的是node1:9100这个标签值,可以通过Prometheus查询指标获得

添加告警


相关参数说明:
Rule 可编辑Name,配置触发告警的规则。在时间范围(For)中,评估每隔多长时间(Evaluate every),是否处于告警状态。如果一直满足告警条件则开始告警。默认检测时间为1m5m,1分钟检测一次是否满足告警条件,如果满足则进入pending状态,5分钟后如果依旧满足条件则发送告警。
Conditions 告警条件,WHEN中可设置要使用的聚合函数(如:avg(),min(),sum()等);OF中的query(A,10s,now)字段表示对应Query中的指标A,在10秒前到现在这段时间范围内数值超出(IS ABOVE)阈值70;追加条件 + 可选择与|或两种条件。
No data and error handling 对无数据或错误的处理。对于查询无返回数据,可选的设置状态有Alerting,No Data,Keep Last State和Ok四种;对于查询出错或超时,可选的设置状态有Alerting和Keep Last State两种。
Notifications 通知。配置使用的告警方式(如果告警通道中选择了Default,则默认选择该通道;不可去除,除非在通道中取消Default);编辑Message,发送具体的告警邮件信息。
Tags 标签。可添加标签和标签值(具体什么效果,我没试过)。
保存后,对node1节点进行压力测试,触发告警
对CPU进行压力测试。本机分配了2核心CPU,我们的监控指标配置的是超过70%告警,则需要将超过70%的CPU资源耗尽,所以-c参数大于虚拟机中CPU核心数量的70%即可。
新建终端窗口使用top命令查看系统负载

钉钉/企业微信告警
创建一个钉钉/企业微信群-->添加机器人-->添加机器人后,有一个webhook地址

grafana 里面配置告警渠道


将该告警方式配置为默认方式

在监控面板中,点击监控指标的下拉按钮-->选择Edit

点击Edit后,下方出现添加告警规则按钮,点击添加

告警规则配置


最后点击保存,例如配置的规则是每分钟进行一次检查。当CPU超过3%(具体自己根据需要配置)时,进入pengding状态,持续2分钟超过3%,则会告警通知
添加告警后,可以在列表或者监控面板,查看监控状态




企业微信对应接收到告警通知

- 链接:www.qianshuai.cn/article/grafana
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。