通过Func实现飞书应用通知消息加急处理
前言
在现代企业运作中,及时响应告警信息对保障系统的稳定性和业务的连续性至关重要。随着业务的数字化转型,越来越多的企业依赖于复杂的技术架构,这使得故障和异常事件的及时处理变得愈发重要。传统的告警通知方式往往存在响应不及时、信息传递不准确等问题,导致潜在风险未能及时识别和处理。
为了解决这些问题,我们借助飞书应用的强大功能,开发了一种新的告警消息发送机制。该机制不仅能够将告警信息迅速传递给指定的接收人,还可以根据事件的紧急程度实现加急处理。这一功能的实现,不仅提升了告警处理的效率,还增强了团队协作,确保关键事件能够在第一时间获得关注和解决。
在接下来的文章中,我们将详细介绍如何通过飞书应用实现这一功能,包括技术实现、代码示例以及应用场景分析。希望能够为广大开发者和运维人员提供实用的参考和指导。
前置条件
如需实现飞书应用告警,首先我们需要为观测云通知到用户配置一个飞书应用。该配置是在飞书应用后台完成创建,首先我们需要登录飞书后台并使用飞书账号登录。
创建新应用
- 进入飞书开发者控制台后,点击左侧菜单中的“应用管理”。
- 点击右上角的“创建应用”按钮。
- 在弹出的窗口中,输入应用的名称、图标和描述,然后点击“创建”。
配置应用信息
在应用设置页面,可以编辑应用的基本信息,如名称、描述和图标。之后点击“权限管理”选项卡,选择您的应用所需的权限。例如,发送消息、获取用户信息等。并确保选择的权限符合您的应用需求,并点击“保存”。
配置应用的安全设置
在“安全设置”选项卡中设置应用的密钥和其他安全参数。注意需要记录下应用的 App ID 和 App Secret,后续开发调用时需要用到这两个字段。
提交审核
当您完成所有配置后,点击“提交审核”按钮。按照系统提示填写审核信息,确保信息准确无误。提交后,等待后台管理员的审核。这个审核完成后就可以实现应用上线。点击“上线”按钮,将应用发布到飞书平台。
管理应用权限
如需通过 Func 平台正确发送消息到飞书平台,您需要为这个应用开启"获取用户 user_id"、"通过手机号或邮箱获取用户 ID"、"获取与发送单聊、群组消息"、"以应用的身份发消息"、"发送应用内加急消息"这几个权限。如果没有这些权限,在消息完成发送后 Func 脚本无法基于返回的消息对指定用户进行加急。
Func 脚本开发
发送前准备
在向指定用户发送消息前,需要首先获取飞书应用的相关访问权限,获取租户 token 的接口如下:
AUTH_TOKEN_URL="https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"def _get_feishu_tenant_token():body = {"app_id": "cli_<your-app-id>","app_secret": "<your-app-secret>"}rsp = _send_post_request(AUTH_TOKEN_URL,json=body,headers=HEADERS)print(rsp.text)return json.loads(rsp.text).get("tenant_access_token")
接口响应体说明:
名称 | 类型 | 描述 |
---|---|---|
code | int | 错误码,0 表示成功,非 0 表示失败 |
msg | string | 错误描述 |
tenant_access_token | string | 获取的 Tenant Access Token,有效期为 2 小时 |
expire | int | Token 的有效期,单位为秒 |
这个接口需要使用我们上面申请创建应用时保存的 app_id 和 app_secret 用作请求体。平台会在调用接口后返回对应应用的租户 token,用于发起下面的获取用户信息请求。
获取用户信息请求的接口如下:
GET_USER_FEISHU_OPENID="https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id"def _get_feishu_user_open_id(t_token):headers = HEADERSheaders['Authorization'] = "Bearer "+t_tokenprint(headers)body = {"user_id_type":"open_id","emails": ["your_employee@somesite.com"],"include_resigned":False}rsp = _send_post_request(GET_USER_FEISHU_OPENID,json=body,headers=headers)print(rsp.text)
接口响应体说明:
名称 | 类型 | 描述 |
---|---|---|
code | int | 错误码,非 0 表示失败 |
msg | string | 错误描述 |
data | - | - |
user_list | user_contact_info[] | 手机号或者邮箱对应的用户 ID 信息。 |
- user_id | string | 用户 ID,ID 类型与查询参数 user_id_type 的取值保持一致。例如,user_id_type 取值为 open_id,则该参数的用户 ID 值为用户的 open_id。 |
- mobile | string | 手机号,通过手机号查询时会返回该值。 |
string | 邮箱,通过邮箱查询时会返回该值。 |
获取到用户信息后,我们将比对观测云告警消息中收到的用户列表,在上述用户元数据中获取对应的 open_id,发起本次消息加急通知。
消息发送接口
完成用户信息的发送前准备后,调用飞书的发送消息接口,首先生成本次需要发送的告警消息。
SEND_MESSAGE_TO_USER="https://open.feishu.cn/open-apis/im/v1/messages"def send_feishu_messages(open_id,t_token,alart_message):url = SEND_MESSAGE_TO_USERheaders = HEADERSheaders['Authorization'] = "Bearer "+t_token# 设置查询参数params = {'receive_id_type': 'open_id',}# 设置请求体body = {'receive_id': open_id,'msg_type': 'text','content':alart_message}# 发起 POST 请求response = requests.post(url,headers=headers,params=params,json=body # 使用 json 参数来发送请求体)# 检查响应状态码if response.status_code == 0:# 请求成功,处理响应print(data)return response.get("data").get("message_id")else:# 请求失败,输出错误信息print(f'Error: {response.status_code}, {response.text}')return None
接口参数如下:
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
receive_id | string | 是 | 消息接收者的 ID,ID 类型与查询参数 receive_id_type 的取值一致。注意事项:给用户发送消息时,用户需要在机器人的可用范围内。例如,你需要给企业全员发送消息,则需要将应用的可用范围设置为全体员工。给群组发送消息时,机器人需要在该群组中,且在群组内拥有发言权限。如果消息接收者为用户,推荐使用用户的 open_id。示例值:"ou_7d8a6e6df7621556ce0d21922b676706ccs" |
msg_type | string | 是 | 消息类型。可选值有: -text:文本 -post:富文本 -image:图片 -file:文件 -audio:语音 -media:视频 -sticker:表情包 -interactive:卡片 -share_chat:分享群名片 -share_user:分享个人名片 -system:系统消息 |
content | string | 是 | 消息内容,JSON 结构序列化后的字符串。该参数的取值与 msg_type 对应,例如 msg_type 取值为 text,则该参数需要传入文本类型的内容。 注意: 1、JSON 字符串需进行转义。例如,换行符 \n 转义后为 \n。文本消息请求体最大不能超过 150 KB。 2、卡片消息、富文本消息请求体最大不能超过 30 KB。如果使用卡片模板(template_id)发送消息,实际大小也包含模板对应的卡片数据大小。 3、如果消息中包含样式标签,会使实际消息体长度大于您输入的请求体长度。图片需要先上传图片,然后使用图片的 Key 发消息。音频、视频、文件需要先上传文件,然后使用文件的 Key 发消息。 |
需要注意的是,如您希望重新组织飞书消息通知的卡片格式,例如输出为富文本方式,则需要首先将观测云告警消息清洗为富文本格式,再传递给对应的参数。
应用内消息加急接口
消息发送成功并获取到消息回执的id后,就可以进一步启用应用内消息加急了。这里需要调用的接口和调用方式示例如下。该接口的调用,需要将刚刚获取的消息 id 作为路径参数的一部分,添加到 url 中。这和之前的接口增加为请求参数的方式不一样,使用的时候请注意。
SEND_MESSAGE_URGENT_TIP="https://open.feishu.cn/open-apis/im/v1/messages/{}/urgent_app"def send_alart_message(message_id,t_token,u_id_list):url = SEND_MESSAGE_URGENT_TIP.format(message_id)headers = HEADERSheaders['Authorization'] = "Bearer "+t_token# 设置查询参数params = {'user_id_type': 'open_id',}# 设置请求体body = {'user_id_list': u_id_list,}# 发起 POST 请求response = requests.post(url,headers=headers,params=params,json=body # 使用 json 参数来发送请求体)# 检查响应状态码if response.status_code == 0:# 请求成功,处理响应print(data)return response.get("data").get("message_id")else:# 请求失败,输出错误信息print(f'Error: {response.status_code}, {response.text}')return None
接口发布
在 Func 平台中,点击「管理」-「同步 API」,将上述开发的飞书消息加急接口发布为 webhook,该接口最终提供给工作空间进行调用,将收到的告警信息转换为飞书加急消息。
工作空间配置
登录工作空间,在「告警」-「通知对象管理」中增加创建一个通知通道,将上面发布的 Webhook 地址填写到工作空间中形成一个新的通知通道。在该通道的成员中,填写当前消息加急需要通知的人员,需要注意的是这里的人员信息应至少包含飞书邮箱或手机等联系方式中的一个,否则 Func 接口将无法匹配需要加急的人员。
完成配置后就可以在告警监控器的配置中使用该通道,对相应的告警信息进行加急发送了。发送效果如下:
需要注意的是,应用机器人仅能对自身发布的消息进行加急,因此请务必使用webhook类通知对象,通过Func发布的飞书消息加急接口进行告警消息的发送和加急操作。
总结
通过观测云 DataFlux Func 可观测开发平台,我们可以灵活的将观测云包括告警在内的各种功能,同外部第三方系统进行对接,实现观测云功能的扩展。
相关文章:

通过Func实现飞书应用通知消息加急处理
前言 在现代企业运作中,及时响应告警信息对保障系统的稳定性和业务的连续性至关重要。随着业务的数字化转型,越来越多的企业依赖于复杂的技术架构,这使得故障和异常事件的及时处理变得愈发重要。传统的告警通知方式往往存在响应不及时、信息…...

【目标检测】【AAAI-2022】Anchor DETR
Anchor DETR: Query Design for Transformer-Based Object Detection 锚点DETR:基于Transformer的目标检测查询设计 论文链接 代码链接 摘要 在本文中,我们提出了一种基于Transformer的目标检测新型查询设计。此前的Transformer检测器中&am…...
Spring Cloud Alibaba 学习 —— 简单了解常用技术栈
Spring Cloud Alibaba 官网:https://sca.aliyun.com/ 什么是 Spring Cloud Alibaba Spring Cloud Alibaba 是 Spring Cloud 规范在阿里生态的扩展实现,结合了阿里自研组件与开源生态,提供面向云原生场景的微服务解决方案。其核心功能可概括…...

智慧工厂整体解决方案
该方案围绕智能工厂建设,阐述其基于工业 4.0 和数字化转型需求,通过物联网、大数据、人工智能等技术实现生产自动化、数据化管理及联网协同的特点。建设步骤包括评估现状、设定目标、制定方案、测试调整、实施计划及持续改进,需整合 MES、ERP 等软件系统与传感器、机器人等硬…...

秋招Day12 - 计算机网络 - TCP
详细说一下TCP的三次握手机制 TCP的三次握手机制是为了在两个主机之间建立可靠的连接,这个机制确保两端的通信是同步的,并且在开始传输数据前,双方都做好了要通信的准备。 说说SYN的概念? SYN 是 TCP 协议中用来建立连接的一个标…...
KubeMQ 深度实践:构建可扩展的 LLM 中台架构
文章简介 在 AI 应用开发中,集成 OpenAI、Anthropic Claude 等多大型语言模型(LLM)常面临 API 碎片化、请求路由复杂等挑战。本文将介绍如何通过 ** 消息代理(Message Broker)** 实现高效的 LLM 管理,以开…...

vueflow
自定义节点,自定义线,具体细节还未完善,实现效果: 1.安装vueflow 2.目录如下 3. index.vue <script setup> import { ref } from vue import { VueFlow, useVueFlow } from vue-flow/core import { Background } from vue-…...

LearnOpenGL-笔记-其十一
Normal Mapping 又到了介绍法线贴图的地方,我感觉我已经写了很多遍了... 法线贴图用最简单的话来介绍的话,就是通过修改贴图对应物体表面的法线来修改光照效果,从而在不修改物体实际几何形状的前提下实现不同于物体几何形状的视觉效果。 因…...
@Docker Compose 部署 Prometheus
文章目录 Docker Compose 部署 Prometheus1. 环境准备2. 配置文件准备3. 编写 Docker Compose 文件4. 启动服务5. 验证部署6. 常用操作7. 生产环境增强建议8. 扩展监控对象 Docker Compose 部署 Prometheus 1. 环境准备 安装 Docker(版本 ≥ 20.10)和 …...

openppp2 -- 1.0.0.25225 优化多线接入运营商路由调配
本文涉及到的内容,涉及到上个发行版本相关内容,人们在阅读本文之前,建议应当详细阅读上个版本之中的VBGP技术相关的介绍。 openppp2 -- 1.0.0.25196 版本新增的VBGP技术-CSDN博客 我们知道在现代大型的 Internet 网络服务商,很多…...
二次封装 Vuex for Uniapp 微信小程序开发
作为高级前端开发工程师,我将为你提供一个针对 Uniapp Vue2 Vuex 的 Store 二次封装方案,使团队成员能够更便捷地使用和管理状态。 封装目标 模块化管理状态 简化调用方式 提供类型提示(在 Vue2 中尽可能实现) 便于维护和查…...

详细到用手撕transformer下半部分
之前我们讨论了如何实现 Transformer 的核心多头注意力机制,那么这期我们来完整地实现整个 Transformer 的编码器和解码器。 Transformer 架构最初由 Vaswani 等人在 2017 年的论文《Attention Is All You Need》中提出,专为序列到序列(seq2s…...
Spring Boot 整合 Spring Data JPA、strategy 的策略区别、什么是 Spring Data JPA
DAY29.2 Java核心基础 Spring Boot 整合 Spring Data JPA Spring Data JPA根据具体的数据库分为不同的子模块,无论是关系型数据库和非关系型数据库,Spring Data都提供了支持 Mysql:Spring Data JPA Redis:Spring Data Redis …...
Vue 3.0 中的路由导航守卫详解
1. 路由导航守卫 1.1. 全局前置守卫 Vue-Router 提供的导航守卫主要用来守卫路由的跳转或取消。它们可以植入到全局、单个路由或组件级别。 全局前置守卫可以使用 router.beforeEach 注册: const router createRouter({... });router.beforeEach((to, from) &g…...

【Sqoop基础】Sqoop生态集成:与HDFS、Hive、HBase等组件的协同关系深度解析
目录 1 Sqoop概述与大数据生态定位 2 Sqoop与HDFS的深度集成 2.1 技术实现原理 2.2 详细工作流程 2.3 性能优化实践 3 Sqoop与Hive的高效协同 3.1 集成架构设计 3.2 数据类型映射处理 3.3 案例演示 4 Sqoop与HBase的实时集成 4.1 数据模型转换挑战 4.2 详细集成流程…...

MySQL + CloudCanal + Iceberg + StarRocks 构建全栈数据服务
简述 在业务数据快速膨胀的今天,企业对 低成本存储 与 实时查询分析能力 的需求愈发迫切。 本文将带你实战构建一条 MySQL 到 Iceberg 的数据链路,借助 CloudCanal 快速完成数据迁移与同步,并使用 StarRocks 完成数据查询等操作,…...
MSVC支持但是Clang会报错的C++行为
MSVC的非标 目的友元别名模板类显式特例化的命名空间限制 目的 因为在使用clang进行ast分析msvc项目的时候,出现了爆红现象,了解到msvc会有一些不严格按照c标准但是允许的语法,在这点上clang就很严格,所以本文以clang为基准&…...

截屏精灵:轻松截屏,高效编辑
在移动互联网时代,截图已经成为我们日常使用手机时的一项基本操作。无论是记录重要信息、分享有趣内容,还是进行学习和工作,一款好用的截图工具都能极大地提升我们的效率。截屏精灵就是这样一款功能强大、操作简单的截图工具,它不…...

【JavaWeb】基本概念、web服务器、Tomcat、HTTP协议
目录 1. 基本概念1.1 基本概念1.2 web应用程序1.3 静态web1.4 动态web 2. web服务器3. tomcat详解3.1 安装3.2 启动3.3 配置3.3.1 配置启动的端口号3.3.2 配置主机的名称3.3.3 其他常用配置项日志配置数据源配置安全配置 3.4 发布一个网站 4. Http协议4.1 什么是http4.2 http的…...
黑马程序员C++核心编程笔记--4 类和对象--封装
C面向对象三大特征:封装、继承、多态 C认为万事万物皆对象,对象有其属性和行为,具有相同性质的对象可以抽象称为类 4.1 封装 4.1.1 封装的意义 将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制 在设计类…...
Debian:自由操作系统的精神图腾与技术基石
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 ——解码Linux世界最纯粹的开源哲学 一、Debian的诞生:从个人实验到全球协作 1993年,一位名为Ian Murdock的程序员在开源社区的启…...

云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作)
云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作) 目录 云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作)1、虚拟机VMware安装Rocky2、Linux命令行3、Linux Rocky修改字体大小和背景颜…...

在 ODROID-H3+ 上安装 Win11 系统
在 ODROID-H3 上安装 Windows 11 系统。 以下是完整的步骤,包括 BIOS 设置、U 盘制作、安装和驱动处理,全程不保留之前的系统数据。 ✅ 准备工作 1. 准备一个 ≥8GB 的 USB 启动盘 用另一台电脑制作 Windows 11 安装盘。 👉 推荐工具&…...
Docker常用命令操作指南(一)
Docker常用命令操作指南-1 一、Docker镜像相关命令1.1 搜索镜像(docker search)1.2 拉取镜像(docker pull)1.3 查看本地镜像(docker images)1.4 删除镜像(docker rmi) 二、Docker容器…...
什么是 SQL 注入?如何防范?
什么是 SQL 注入?如何防范? 1. SQL 注入概述 1.1 基本定义 SQL 注入(SQL Injection)是一种通过将恶意SQL 语句插入到应用程序的输入参数中,从而欺骗服务器执行非预期SQL命令的攻击技术。攻击者可以利用此漏洞绕过认证、窃取数据甚至破坏数据库。 关键结论:SQL 注入是O…...

使用el-input数字校验,输入汉字之后校验取消不掉
先说说复现方式 本来input是只能输入数字的,然后你不小心输入了汉字,触发校验了,然后这时候,你发现校验取消不掉了 就这样了 咋办啊,你一看校验没错啊,各种number啥的也写了,发现没问题啊 <el-inputv…...

Docker容器启动失败的常见原因分析
我们在开发部署的时候,用 Docker 打包环境,理论上是“我装好了你就能跑”。但理想很丰满,现实往往一 docker run 下去就翻车了。 今天来盘点一下我实际工作中经常遇到的 Docker 容器启动失败的常见原因,顺便给点 debug 的小技巧&a…...
Java提取markdown中的表格
Java提取markdown中的表格 说明 这篇博文是一个舍近求远的操作,如果只需要要对markdown中的表格数据进行提取,完全可以通过正在表达式或者字符串切分来完成。但是鉴于学习的目的,这次采用了commonmark包中的工具来完成。具体实现过程如下 实…...

立志成为一名优秀测试开发工程师(第七天)——unittest框架的学习
目录 unittest框架的学习 一、测试类的编写 创建相关测试类cal.py、CountTest.py 二、常见断言方法 使用unittest单元测试框架编写测试用例CountTest.py 注意:执行的时候光标一定要放在括号后面,鼠标右键运行 三、对测试环境的初始化和清除模块…...
精益数据分析(85/126):营收阶段的核心指标与盈利模型优化——从数据到商业决策的落地
精益数据分析(85/126):营收阶段的核心指标与盈利模型优化——从数据到商业决策的落地 c。 一、营收健康度的核心指标:投资回报率模型 (一)季度再发性营收增长率(QRR) 该指标衡量…...