前言

最近在使用Grafana的时候,发现Grafana功能比想象中要强大,除了配合Prometheus使用之外,他自身都可以做很多事情,可视化和监控平台,还可以直接根据用户自定义的告警规则完成告警和进行各种通知。于是在深入学习了一段时间之后,整理成此博文。温馨提示,本文约1.3w字,几十张示例图片并且含描述。

一、Grafana介绍

Grafana是一个开源的数据可视化和监控平台,它可以帮助用户通过创建仪表盘和图表来实时监控和分析数据。Grafana支持多种数据源,包括Prometheus、Graphite、InfluxDB、Elasticsearch等,用户可以通过Grafana将这些数据源的数据整合在一起,进行统一的可视化展示和分析。

Grafana提供了丰富的图表类型和插件,用户可以根据自己的需求定制各种图表和仪表盘,以便更直观地了解数据的趋势和变化。此外,Grafana还支持告警功能,用户可以设置告警规则并及时收到通知,以便及时处理问题。

总的来说,Grafana是一个功能强大的数据可视化和监控平台,适用于各种场景,包括IT运维、应用性能监控、工业物联网等领域。它的开源特性也使得用户可以根据自己的需求进行定制和扩展。

二、Grafana仪表盘创建

仪表盘创建有如下三个核心配置点:

  1. 创建数据源;
  2. 创建面板;
  3. 创建仪表盘;

Grafana结合Prometheus和Alertmanager在我之前写的文章中 已经讲解过了,这里就主要写对接MySql直接实现仪表盘创建和告警推送。

Prometheus+Grafana+Alertmanager实现告警推送教程 ----- 图文详解

1.添加数据源

点击data sources -> add new source->搜索mysql->填写mysql的链接信息即可。



2.创建面板

选择首页-》仪表盘-》新建-》填写对应信息即可。





3.创建仪表盘

我们可以在上面的创建的面板中,创建对应的仪表盘,点击添加,即可创建。



对应的主要功能的说明在下列图例汇总,这里就不过多描述了。

这里下列为了方便演示,统一使用如下sql数据进行。

创建的sql和示例数据语句:

-- 创建学生表
CREATE TABLE student (
id INT AUTO_INCREMENT PRIMARY KEY,
birthday_time DATETIME,
NAME VARCHAR(50),
classId INT,
source INT
); -- 插入示例数据
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-01-01', '张三', 1, 80);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-02-02', '李四', 2, 75);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-03-03', '王五', 1, 90);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-04-04', '赵六', 3, 85);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-05-05', '小明', 2, 78);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-06-06', '小红', 1, 92);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-07-07', '小刚', 3, 87);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-08-08', '小美', 2, 79);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-09-09', '小丽', 1, 88);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-10-10', '小强', 3, 82);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-11-11', '小雨', 2, 91);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-12-12', '小霞', 1, 76);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-01-13', '小风', 3, 83);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-02-14', '小雪', 2, 89);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-03-15', '小玲', 1, 84);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-04-16', '小华', 3, 77);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-05-17', '小龙', 2, 86);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-06-18', '小虎', 1, 93);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-07-19', '小燕', 3, 81);
INSERT INTO student (birthday_time, NAME, classId, source) VALUES ('2015-08-20', '小菲', 2, 74);

1.表单-最简单的示例

这里为了方便演示,下列所有的我都是用code模式,也就是直接贴上sql语句。将写好的sql贴上去之后,点击run query,然后选择对应的图表即可显示。

查询的sql

select * from student;

显示的图表

2.表单-柱状图

这里我们也是用一个分词简单易懂的查询来展示吧。

查询的sql

SELECT
UNIX_TIMESTAMP(birthday_time) AS time_sec,
sum(source) AS VALUE,
CONCAT(classId,"班级") AS metric
FROM student
GROUP BY classId
ORDER BY birthday_time ASC

显示的效果

点击suggestions可以切换各种推荐图表

3.折线图

这里我们就统计一下学生的月份生日数量。这里我们需要用$__timeGroup$__timeFilter函数,它们是Grafana的函数,他们的用法如下:

  • $__timeGroup 函数用于将时间范围分组成特定的时间间隔,例如每分钟、每小时、每天等。这个函数通常用于创建时间序列图表,帮助用户将数据按照时间间隔进行聚合和展示。
  • $__timeFilter 函数用于过滤特定的时间范围,用户可以使用该函数来限制数据的时间范围,例如只显示最近一小时的数据或者只显示某个特定时间段的数据。

除了 $__timeGroup$__timeFilter,Grafana 还提供了其他与时间相关的内置函数,例如:

  • $__timeFrom():用于指定起始时间,可以指定相对时间(例如“now-1h”表示当前时间的一小时前)或绝对时间(例如“2023-11-14T00:00:00”表示具体的时间点)。
  • $__timeTo():用于指定结束时间,同样可以指定相对时间或绝对时间。
  • $__timeFilterGroup():用于根据时间范围过滤数据,并且可以结合其他过滤条件使用。

查询的Sql

SELECT
$__timeGroup(birthday_time, '1M') AS time_sec,
COUNT(id) AS '数量'
FROM student
WHERE $__timeFilter(birthday_time)
GROUP BY time_sec

对应的示例图:

4.折线图-多条数据

这里我们就根据统计上述的统计在加一条线,比如我这边想看1班的情况。

查询的sql

SELECT
$__timeGroup(birthday_time, '1M') AS time_sec,
COUNT(id) AS '数量',
SUM(classId =1 ) as '1班'
FROM student
WHERE $__timeFilter(birthday_time)
GROUP BY time_sec

示例图:

5.折线图-过滤筛选单条

根据上述的过程中,我们发现一点问题,上述的查询sql是写死的,那么我们有办法增加一个变量去统计呢,比如上述的数据中我们想查单独看1班的数据或2班的数据。那么这里我们就要用到Grafana的一个变量,他可以自定义变量,还可以设置变量。整体操作如下示例图,相关注释已写。







这里我们还是根据上述的统计来进行改造,这里我们设置一个变量,支持按照班级统计。

对应的查询SQL

SELECT
$__timeGroup(birthday_time, '1M') AS time_sec,
COUNT(id) AS '数量'
FROM student
WHERE $__timeFilter(birthday_time)
and classId = $class_name
GROUP BY time_sec



6.折线图-过滤筛选多选聚合

上述示例中,我们添加了单条筛选,这里我们来添加多条筛选,以及添加自定义的常量数据来进行

筛选,常量数据配置如下示例图:



这里在顺便说下右边的两个小图标的含义:

查询的SQL如下:

SELECT
$__timeGroup(birthday_time, '1M') AS time_sec,
COUNT(id) AS '数量'
FROM student
WHERE $__timeFilter(birthday_time)
and classId in ($class_names)
GROUP BY time_sec

7.折线图-动态多个数据分组

上述示例中,我们已经完成基本的简单的创建,可以最基本的完成我们想要的图表。

如果我们想要完成更复杂一点的,比如将每个Y轴指标通过页面筛选呈现多条状态数据,并可以根据页面筛选进行数据图表呈现。也就是我根据上述的多选条件,来生成对应的则线图,选择几个就生成几条。

这里的配置会稍微复杂一些。

查询的SQL:

SELECT
$__timeGroup(birthday_time, '1M') AS time_sec,
CAST(classId AS CHAR) as '班级',
COUNT(classId) AS '数量'
FROM student
WHERE $__timeFilter(birthday_time)
and classId in ($class_names)
GROUP BY classId,time_sec

注: 如果统计的字段类型是整型,需要进行转换,否则会不生效!

这里顺便在说下样式之类的调整,在右边的选项中往下拉,可以对图表进行样式调整,相关说明都在示例图中了。





我们要实现上述的功能,需要用到Transform功能,示例图如下:



最终演示的效果图图如下:

上述的面板的json文件下载地址: https://files.cnblogs.com/files/xuwujing/测试面板-1699947693208.json?t=1699952258&download=true

8.折线图-动态创建多个面板统计

上述的图例中,我们完成了基本的图例创建,这里我们就稍微玩点高级一点点图表,根据下拉多选的数据,自动创建多个面板。

查询sql

SELECT
$__timeGroup(birthday_time, '1M') AS time_sec,
CAST(classId AS CHAR) as '班级',
COUNT(classId) AS '数量'
FROM student
WHERE $__timeFilter(birthday_time)
and classId in ($class_names)
GROUP BY classId,time_sec

配置基于选择的值进行重复查询并针对变量每个成员应用到新面板.

最终效果图如下:

三、Grafana告警规则配置

Grafana的告警核心配置:

  1. 告警联络点(通知方式,邮件、webhook等)配置;
  2. 告警规则(各个图表的规则)配置;
  3. 告警通知策略(联络点和规则的关联,告警发送频率、静默配置等)配置;

1.告警联络点配置

首先需要明确使用什么方式进行联络,目前使用比较多的是企微、钉钉和飞书,其中除了飞书稍微麻烦一点外,需要一个中转服务,企微和钉钉不需要直接对接即可。

1.1 对接企微/钉钉

对接钉钉和企微毕竟简单,下拉选择钉钉和微信,然后填写对应信息即可。



1.2 对接飞书

对接飞书比较麻烦一点,Grafana并不支持接入飞书,所以需要通过一个中转服务来对Grafana的数据进行转换成飞书需要的数据格式,然后进行告警消息推送。

这里选择webhook,然后填写中转服务的地址,中转服务只需要提供一个对应的接口地址即可,然后次http接口里面需要将接收Grafana请求的数据传输到飞书。

飞书对应的文档链接:

https://www.feishu.cn/hc/zh-CN/articles/807992406756-webhook-触发器

https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot

中转服务代码示例如下:


import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; import java.util.HashMap;
import java.util.Map; /**
* @Author pancm
* @Description 飞书告警中转服务
* @Date 2023/9/11
* @Param
* @return
**/
@RestController
@RequestMapping("alert")
@Slf4j
public class AlertController { @Value("${feishu.webhook-url:https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxx}")
private String webHookUrl; @Autowired
private RestTemplate restTemplate; private String msg = "告警状态: %s\n告警标题:%s\n告警描述:%s\n面板URL:%s\n发生时间:%s\n负责人: %s "; @RequestMapping("/webhook/receive")
public void receive(@RequestBody String message) {
log.info("AlertController.receive 获取的Grafana的告警数据:{}", message);
Map<String, Object> m = createMessage(getText(message));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
log.info("AlertController.receive 发送飞书的告警内容:{}", m);
restTemplate.postForEntity(webHookUrl, new HttpEntity<>(m, headers), Void.class);
} /**
* 构建通知报文
*
* @param content
* @return
*/
protected Map<String, Object> createMessage(String content) {
Map<String, Object> messageJson = new HashMap<>();
messageJson.put("msg_type", "text");
Map<String, Object> text = new HashMap<>();
text.put("text", content);
messageJson.put("content", text);
Long timestamp = System.currentTimeMillis() / 1000;
messageJson.put("timestamp", timestamp);
return messageJson;
} /**
* 构建文本内容
*
* @param body
* @return
*/
private String getText(String body) {
JSONObject json = JSON.parseObject(body);
JSONObject alertObject = json.getJSONArray("alerts").getJSONObject(0);
String senMsg = String.format(msg,
getStatusMsg(json.getString("status")),
json.getString("title"),
json.getJSONObject("commonAnnotations").getString("description"),
alertObject.getString("panelURL"),
DateUtil.now(),
json.getJSONObject("commonAnnotations").getString("handler")
);
return senMsg;
} private String getStatusMsg(String msg) {
if ("firing".equals(msg)) {
return "告警产生";
}
return "告警恢复";
}
}

2.告警规则配置

告警的规则创建有两种方式

  1. 可以在告警规则面板上面进行规则创建,点击警报-》警报规则;
  2. 也可以在指定监控图表上面创建,点击图表-》edit-》Alert rule;

    创建告警规则,目前的数据源是mysql,因此需要编写sql语法来进行查询,然后配置告警触发条件,然后设置扫描时间,和在某短时间内都触发了就进行告警,还需要配置告警的一些额外信息,告警的主题、描述等等。

直接在对应的仪表盘创建



在告警规则里面创建

3.告警策略配置

主要是将告警联络点和告警规则进行关联匹配。



静默规则配置

注:静默时间的配置,存在时区情况,具体情况请看Grafana配置的时区。

4.一个简单的告警通知示例

这里我们就随便写一个告警sql,让他满足触发告警,比如主要有学生成绩低于90分就进行告警

告警SQL如下

SELECT
COUNT(1) AS c
FROM student
WHERE
source < 90

配置示例图如下:





最终在飞书群里发送的消息如下:

其他

参考资料

https://grafana.com/docs/grafana/latest/datasources/mysql/#query-editor

https://grafana.com/grafana/plugins/

https://grafana.com/docs/grafana/latest/developers

https://grafana.com/docs/grafana/latest/developers/http_api/dashboard/

https://blog.csdn.net/u014756339/article/details/107816038

https://blog.csdn.net/weixuan_/article/details/131848725

https://zhuanlan.zhihu.com/p/580145725

https://blog.csdn.net/qq_23598037/article/details/99850396

https://docs.aws.amazon.com/zh_cn/grafana/latest/userguide/v9-alerting-explore-labels-matching.html

一首很带感的动漫钢琴曲~

原创不易,如果感觉不错,希望给个推荐!您的支持是我写作的最大动力!

版权声明:

作者:虚无境

博客园出处:http://www.cnblogs.com/xuwujing

CSDN出处:http://blog.csdn.net/qazwsxpcm    

个人博客出处:https://xuwujing.github.io/

Grafana新手教程-实现仪表盘创建和告警推送的更多相关文章

  1. Prometheus+Grafana+Alertmanager实现告警推送教程 ----- 图文详解

    前言 本文主要介绍的是Prometheus采集数据,通过Grafana加上PromQL语句实现数据可视化以及通过Alertmanage实现告警推送功能.温馨提示,本篇文章特长,2w多的文字加上几十张图 ...

  2. zabbix告警推送至个人微信

    文章原文 自从接触zabbix后,就一直想着怎么才能把告警推送到个人微信上.有这样的想法主要是个人微信的使用频率远远要比钉钉,企业微信,邮箱,飞书等使用频率要高.比如我,就遇到过在周末的时候,因为没有 ...

  3. github使用指南(2015年3月23日更新了本地创建仓库再推送到remote仓库的使用方法)

    我是通过这个来学习的.个人愚笨,琢磨了半天,终于搞通了,醉了醉了,以前一直使用svn,用git确实有点水土不服.本文以如何使用git为主来展开,不涉及太多理论. git是分布式的版本管理.什么叫分布式 ...

  4. 如何将git本地创建的项目推送到github仓库

    除了集中式的版本控制系统CVS和SVN外,还有目前世界上最先进的分布式版本控制系统Git,它的创始人是创建了linux的大神 - linus.GitHub网站与2008年开始服役,为开源项目免费提供G ...

  5. Prometheus&Alertmanager告警推送

    前言 尽管可以通过可视化数据监控系统运行状态,但我们无法时刻关注系统运行,因此需要一些实时运行的工具能够辅助监控系统运行,当系统出现运行问题时,能够通知我们,以此确保系统稳定性,告警便是作为度量指标监 ...

  6. pinpoint实现告警推送至钉钉和微信群

    前言 在前面的文章中,我们学习了如何通过java实现将消息发送到钉钉.和将消息发送到微信群聊. 基于上述基础,我们今天来接入pinpoint的告警,发送到钉钉群. 实操前准备 开始之前,推荐阅读一下, ...

  7. git 现在本地创建仓库 再 推送到 远程 github 仓库中

    今天,需要再本地使用git管理代码,但是当代码创建好的时候,想发布到github上面的私有仓库中,但是没有提前创建远端仓库,所以需要把本地git仓库推送到远端另外一个仓库了,下面进行简要记录,刚刚经过 ...

  8. 使用基于vuecli创建的目录推送到指定远程分支

    笔者使用vuecli创建项目目录以后,在想将该目录提交到远程仓库时发现行不通,在忙活了一下午以后写下此文 1.github上新建一空分支,然后克隆该分支地址:  https://github.com/ ...

  9. NO.A.0006——Git在IntelliJ IDEA中的使用/创建项目并推送到GitHub仓库/分支管理及分支合并

    一.在IntelliJ IDEA中使用Git: 1.在IDEA下创建项目并编写一个main方法的工程: 在IDEA下新建一个Project IDEA-->新建一个Project-->Fil ...

  10. idea新手教程 如何springmvc创建Maven项目

    1.点击Create project,选择maven,勾选Create from archetype选择web-app,如图 2 输入    Group-Id     //组织名,也是作者名 Arti ...

随机推荐

  1. 十 Appium环境搭建(Windows版)

    注:appium安装到C盘,node.js安装到C盘 一.安装node.js 1.到官网下载node.js:https://nodejs.org/en/download/ 2.获取到安装文件后,直接双 ...

  2. 【工具】-Misc-Python-dsstore

    介绍 这是一个.DS_Store解析工具. 什么是.DS_Store .DS_Store 是 Desktop Services Store 的缩写,是 macOS 操作系统上的一个不可见文件,只要您使 ...

  3. 利用IPV6随时访问家中影音Jellyfin

    本文章主要记录通过ipv6实现家庭影音中心在互联网上的访问. 之前很多方案都是通过第三方进行内网穿透,实际体验不是很好.目前ipv6发展迅速,完全可以取代这种以ipv4为中心的内网资源外网访问的方式. ...

  4. vscode 中 Markdown 粘贴图片的位置

    背景 自从 typora 开始收费后, 不少人开始寻找其他的 Markdown编辑器, 我觉得 vscode 就是一个很不错的选择 虽然不能像 typora 在Markdown预览中编辑, 但是左右布 ...

  5. 《SQL与数据库基础》15. 触发器

    目录 触发器 语法 示例-insert型触发器 示例-update型触发器 示例-delete型触发器 本文以 MySQL 为例 触发器 触发器是与表有关的数据库对象,指在 insert/update ...

  6. 【译】在 Visual Studio 中处理图像变得更容易了

    任何 Web.桌面或移动开发人员都经常使用图像.你可以从 C#.HTML.XAML.CSS.C++.TypeScript 甚至代码注释中引用它们.有些图像是本地的,有些存在于线上或网络共享中,而其他图 ...

  7. Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中三则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...

  8. Netease研发实习生一面

    最想去的公司和部门..今天终于面了,感觉跪了..实质性的问题的确打得不好..庆幸的是拿到了B公司的offer,实习是不愁了.. 记下问题,希望对之后的同学有一定帮助. 问的问题总结: 1.进程线程协程 ...

  9. KRPANO资源分析工具下载四方环视全景图

    提示:目前分析工具中的全景图下载功能将被极速全景图下载大师替代,相比分析工具,极速全景图下载大师支持更多的网站(包括各类KRPano全景网站,和百度街景) 详细可以查看如下的链接: 极速全景图下载大师 ...

  10. 【题解】Educational Codeforces Round 141(CF1783)

    评价:educational A.Make it Beautiful 题目描述: 如果一个数组中存在一个数恰好等于该数前面所有数之和,那么这个数组就是丑的.如果一个数组不是丑的,就是美的. 比如说: ...