Grafana 告警接入飞书通知

news2025/1/16 3:42:57

Grafana 系列文章,版本:OOS v9.3.1

  1. Grafana 的介绍和安装
  2. Grafana监控大屏配置参数介绍(一)
  3. Grafana监控大屏配置参数介绍(二)
  4. Grafana监控大屏可视化图表
  5. Grafana 查询数据和转换数据
  6. Grafana 告警模块介绍
  7. Grafana 告警接入飞书通知

前言

我们已经知道Grafana 已经支持了钉钉、邮件等告警,钉钉能够打入Grafana 跟阿里重视开源也有关系,在Grafana的GitHub上,很早也有人提过这样的PR。

在这里插入图片描述

他们希望Grafana能够集成飞书,但被Grafana团队拒绝了,原因是:当时飞书通知的需求不够强烈。

在这里插入图片描述

不过没事,没有原生集成,我们还可以使用万能的webHook,通过中转服务内部转换参数后再发送到飞书。

创建告警规则

为了测试,数据源使用Grafana 的Test DB,新创建一个规则。

在这里插入图片描述

从Random Walk 类型的图表中查询数据,当数据最大值大于10的时候,发生告警,每1分钟评估一次,如果持续2分钟都符合告警条件,将生成一条告警。

在这里插入图片描述
这里表示告警关联的大屏和图表面板,还有一个描述字段

配置WebHook通知

在这里插入图片描述
在这里插入图片描述

这里为了测试,只填写一个接收地址,没有鉴权,外网环境必须要加鉴权

在这里插入图片描述

另外由于Grafana 使用Docker 部署,中转服务部署在本地物理机,如果填127.0.0.1,Docker 内部是无法访问到的,需要填物理机的局域网IP
在这里插入图片描述

配置告警策略

最后需要配置一个告警的策略,这边为了测试,时间都配的比较短,Mute timings 是不告警时间配置,可以不设。

在这里插入图片描述

部署中转服务

如下这段是中转服务接收到的webHook告警内容。

{
	"receiver": "feishu",
	"status": "resolved",
	"alerts": [{
		"status": "resolved",
		"labels": {
			"alertname": "Simple dummy streaming example",
			"grafana_folder": "test"
		},
		"annotations": {
			"description": "测试大屏告警"
		},
		"startsAt": "2023-01-12T14:46:00Z",
		"endsAt": "2023-01-12T15:07:00Z",
		"generatorURL": "http://localhost:3000/alerting/grafana/zgbSUF24z/view?orgId=1",
		"fingerprint": "09b095c0ac5a31bc",
		"silenceURL": "http://localhost:3000/alerting/silence/new?alertmanager=grafana\u0026matcher=alertname%3DSimple+dummy+streaming+example\u0026matcher=grafana_folder%3Dtest",
		"dashboardURL": "http://localhost:3000/d/TXSTREZ?orgId=1",
		"panelURL": "http://localhost:3000/d/TXSTREZ?orgId=1\u0026viewPanel=2",
		"values": null,
		"valueString": ""
	}],
	"groupLabels": {
		"alertname": "Simple dummy streaming example"
	},
	"commonLabels": {
		"alertname": "Simple dummy streaming example",
		"grafana_folder": "test"
	},
	"commonAnnotations": {
		"description": "测试大屏告警"
	},
	"externalURL": "http://localhost:3000/",
	"version": "1",
	"groupKey": "{}/{}:{alertname=\"Simple dummy streaming example\"}",
	"truncatedAlerts": 0,
	"orgId": 1,
	"title": "[RESOLVED] Simple dummy streaming example (test)",
	"state": "ok",
	"message": "**Resolved**\n\nValue: [no value]\nLabels:\n - alertname = Simple dummy streaming example\n - grafana_folder = test\nAnnotations:\n - description = 测试大屏告警\nSource: http://localhost:3000/alerting/grafana/zgbSUF24z/view?orgId=1\nSilence: http://localhost:3000/alerting/silence/new?alertmanager=grafana\u0026matcher=alertname%3DSimple+dummy+streaming+example\u0026matcher=grafana_folder%3Dtest\nDashboard: http://localhost:3000/d/TXSTREZ?orgId=1\nPanel: http://localhost:3000/d/TXSTREZ?orgId=1\u0026viewPanel=2\n"
}

上面的字段也很好理解,我们将上面的字段解析封装成飞书的通知格式就可以往飞书发送通知了。

我们根据之前的代码,简单调整封装一下。

AlarmMessage.java 告警接口

public interface AlarmMessage {

    /**
     * 发送文本告警
     * @param content
     */
    void sendData(String content);
}

FeiShuNotifier.java 飞书发送告警代码

@Service
public class FeiShuNotifier implements AlarmMessage {

	private static final String DEFAULT_MESSAGE = " 告警标题:#{title} \n 告警描述:#{description} \n 面板URL:#{panelUrl} \n 发生时间:#{startTime}";

	private final SpelExpressionParser parser = new SpelExpressionParser();

	@Value("${feishu.webhook-url}")
	private String webhookUrl;

	@Value("${feishu.secret}")
	private String secret;

	private Expression message = parser.parseExpression(DEFAULT_MESSAGE, ParserContext.TEMPLATE_EXPRESSION);

	private RestTemplate restTemplate = new RestTemplate();

	@Override
	public void sendData(String content) {
		Map<String, Object> message = createMessage(getText(content));
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_JSON);
		restTemplate.postForEntity(webhookUrl, new HttpEntity<>(message, 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);
		messageJson.put("sign", getSign(timestamp));

		return messageJson;
	}

	/**
	 * 构建文本内容
	 * @param body
	 * @return
	 */
	private String getText(String body) {
		JSONObject json = JSON.parseObject(body);
		Map<String, Object> root = new HashMap<>();
		root.put("title", json.getString("title"));
		root.put("description", json.getJSONObject("commonAnnotations").getString("description"));
		JSONObject alertObject = json.getJSONArray("alerts").getJSONObject(0);
		root.put("panelUrl", alertObject.getString("panelURL"));
		root.put("startTime", DateUtil.parseUTC(alertObject.getString("startsAt")).toString(TimeZone.getDefault()));
		StandardEvaluationContext context = new StandardEvaluationContext(root);
		context.addPropertyAccessor(new MapAccessor());
		return message.getValue(context, String.class);
	}

	private String getSign(Long timestamp) {
		try {
			String stringToSign = timestamp + "\n" + secret;
			Mac mac = Mac.getInstance("HmacSHA256");
			mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
			byte[] signData = mac.doFinal(new byte[]{});
			return new String(Base64.encodeBase64(signData, false));
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
		return "";
	}

}

webhook 接口代码

@RestController
public class WebhookController {

    @Resource
    private FeiShuNotifier feiShuNotifier;

    @RequestMapping("/webhook/receive")
    public void receive(@RequestBody String message) {
        feiShuNotifier.sendData(message);
    }
}

下面为飞书接收到的告警:

在这里插入图片描述

另外如果还需要接入企业微信等其他聊天工具,可以使用开源的PrometheusAlert,使用方案见其GitHub。
https://github.com/feiyu563/PrometheusAlert

作者其他文章:

  1. Spring Boot Admin 参考指南
  2. SpringBoot Admin服务离线、不显示健康信息的问题
  3. Spring Boot Admin2 @EnableAdminServer的加载
  4. Spring Boot Admin2 AdminServerAutoConfiguration详解
  5. Spring Boot Admin2 实例状态监控详解
  6. Spring Boot Admin2 自定义JVM监控通知
  7. Spring Boot Admin2 自定义异常监控
  8. Spring Boot Admin 监控指标接入Grafana可视化

Spring Security相关文章:

  1. OAuth2的定义和运行流程
  2. Spring Security OAuth实现Gitee快捷登录
  3. Spring Security OAuth实现GitHub快捷登录
  4. Spring Security的过滤器链机制
  5. Spring Security OAuth Client配置加载源码分析
  6. Spring Security内置过滤器详解
  7. 为什么加载了两个OAuth2AuthorizationRequestRedirectFilter分析
  8. Spring Security 自定义授权服务器实践
  9. Spring Security 自定义资源服务器实践
  10. Spring Security 自定义用户信息端点与多种登录方式共存
  11. Spring Security 之密码存储
  12. Spring Security 之防漏洞攻击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

带你从源码中分析关于vue(v2.7.10)的面试题

我们在面试的时候经常会被问到vue框架的原理类问题&#xff0c;我今天整理了一些常见问题和答案&#xff0c;希望有不正确之处还请指正。 1.new Vue时发生了什么 首先实例化一个对象&#xff0c;该对象执行init方法初始化生命周期等等&#xff0c;随后执行$mount方法开始生成v…

Modbus Slave缓冲区溢出漏洞CVE-2022-1068分析与复现

漏洞概述Modbus Slave是一个模拟工业领域通信协议Modbus从站的上位机软件&#xff0c;主要用于测试和调试Modbus从设备。该软件7.4.2以及以前的版本&#xff0c;在注册时&#xff0c;未对注册码长度进行安全检查&#xff0c;存在缓冲区溢出漏洞&#xff0c;导致软件崩溃。影响范…

在 Kubernetes 中部署并使用 KubeEdge

作者&#xff1a;马伟&#xff0c;青云科技容器顾问&#xff0c;云原生爱好者&#xff0c;目前专注于云原生技术&#xff0c;云原生领域技术栈涉及 Kubernetes、KubeSphere、KubeKey 等。 边缘计算在广泛制造业、工业、零售和金融等行业&#xff0c;随着云原生应用的兴起&#…

UDS诊断系列介绍07-2E服务

本文框架1. 系列介绍2E服务概述2. 2E服务请求与应答2.1 2E服务请求2.2 2E服务肯定响应2.3 2E服务否定应答3. Autosar系列文章快速链接1. 系列介绍 UDS&#xff08;Unified Diagnostic Services&#xff09;协议&#xff0c;即统一的诊断服务&#xff0c;是面向整车所有ECU的一…

Webpack打包图片-JS-Vue文件

打包图片等静态资源 资源模块 | webpack 中文文档 (docschina.org) 1、加载图片案例准备 为了演示我们项目中可以加载图片&#xff0c;我们需要在项目中使用图片&#xff0c;比较常见的使用图片的方式是两种&#xff1a; img元素&#xff0c;设置src属性&#xff1b;其他元…

基于Java jsp+mysql+Spring的汽车出租平台租赁网站平台设计和实现

基于Java jspmysqlSpring的汽车出租平台租赁网站平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 …

蓝队攻击的四个阶段(二)

目录 一&#xff0c;漏洞利用工具 (1)WebLogic 全版本需洞利用工具 (2)Struts2 综合漏洞利用工具 (3)sqlmap 注入工具 (4)vSphere Client RCE 漏洞(CVE-2021-21972)利用工具 (5)Windows Print Spooler 权限提升漏洞(CVE-2021-1675) (6)Exchange Server漏洞组合利用(CVE-2…

JVM-【面试题】-带你了解对象的创建过程

本文介绍对象在jvm的创建过程该图是对象在jvm的创建过程一、类加载检查虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那…

图机器学习-图机器学习传统方法

图机器学习-图机器学习传统方法 最近在学习一些GNN相关的知识&#xff0c;想写一些笔记记录一下自己的学习过程&#xff0c;主要的学习资料为CS224W课程主页上面的资料和b站同济子豪兄的中文讲解。这篇博客是我2023年的第一篇博客&#xff0c;想以图机器学习中的传统方法作为博…

项目管理工具dhtmlxGantt甘特图入门教程(八):数据加载(三)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足项目管理控件应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 这篇文章给大家讲解如何利用 dhtmlxGantt正确保存和显示任务的结束日期&#xff0c;本节将给你一个明确答案。 Dht…

异常-捕获业务异常踩坑记录

事情是这样&#xff0c;用了google的一个本地缓存框架&#xff0c;就是在查询数据的时候如果有就取缓存&#xff0c;没有就发http请求调接口&#xff0c;但是http请求也会有查询失败的时候&#xff0c;查询失败就会手动抛一个业务异常&#xff0c;然后我会在外层各种捕获异常&a…

三消游戏查找算法的原理和实现

本文首发于公众号&#xff1a; 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。今天这篇文章分享一下三消查找算法的原理和实现&#xff0c;其实三消的机制最早源于《宝石方块》…

无联不成春,2023创宇网安春联展!

春 联 又叫“春贴”“门对”“对联” 它以对仗工整、简洁精巧的文字 描绘美好形象&#xff0c;寄托美好愿望 是中国独特的文学形式 网络安全的列车已驶入2023&#xff0c;癸卯兔年新春将至&#xff01; 热爱中华优秀传统文化的创宇人&#xff0c;也纷纷以春联为载体&…

大网进阶安全刷题讲解(带答案)(1)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.大网进阶安全刷题 前言 本章将会讲解大网进阶安全刷题讲解。 一.大网进阶…

测试开发 | AppCrawler 自动遍历测试实践(二):定制化配置

本文为霍格沃兹测试学院学院学员课程 AppCrawler 学习笔记&#xff0c;文末加群一起学习交流。 定制化配置 自动遍历测试技术以及工具该如何选择和快速入门&#xff1f;经过对比和需求&#xff0c;最终选择测试架构师思寒大佬的 AppCrawler 作为自动遍历测试的工具。以下就分享…

LeetCode 112. 路径总和

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 112. 路径总和&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 112…

Cadence PCB仿真使用Allegro PCB SI按照指定的规则自动创建差分对方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI按照指定的规则自动创建差分的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可…

在使用示波器时,为什么有些波形感觉一直在晃?

我们可以从三个角度进行分析&#xff1a; 采样分析&#xff1a; 1、示波器采样信号的过程如上图&#xff1a;采样——处理——采样——处理。 2、处理时间也称死区时间&#xff0c;死区时间内示波器不监测输入信号。 3、提高波形刷新率&#xff0c;实质上是减少了死区时间&…

MyBatis-Plus数据安全保护(配置安全)

SpringBootMyBatis-Plus配置安全 1.该功能为了保护数据库配置及数据安全&#xff0c;在一定的程度上控制开发人员流动导致敏感信息泄露2.加密配置 mpw: 开头紧接加密内容&#xff08; 非数据库配置专用 YML 中其它配置也是可以使用的 &#xff09;3.随机密钥请负责人妥善保管&a…

设计模式_创建型模式 -《原型模式》

设计模式_创建型模式 -《原型模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 原型模式 (Prototype Pattern) &#xff1a;用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建…