阿里云starrocks监控告发至钉钉群

背景:新入职一家公司,现场没有对sr的进行监控,根据开发的需求编写了一个python脚本。

脚本逻辑:抓取sr的be/fe/routine load状态信息,判读是否触发告警,若满足告警条件,则发送告警信息到钉钉群,并艾特对应的责任人。
在这里插入图片描述

# -*- coding: utf-8 -*-
""""
author: zjh
date: 2023-09-28
description:StarRocks cluster monitoring, include routine load,frontend,backend status.And then send warn message to dingtalk.
"""
import base64
import urllib
import requests
import json
import time
import hmac
import hashlib
import pymysqldef msg(warntype, content, token):# 根据实际修改1:钉钉机器人地址dingding_url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token# 根据实际修改2:钉钉的加签secret = 'SECd0c0f14733789a******************645a4d1ae76ea3481b1384f5ef'# 加签算法,钉钉文档里的timestamp = str(round(time.time() * 1000))secret_enc = secret.encode('utf-8')string_to_sign = '{}\n{}'.format(timestamp, secret)string_to_sign_enc = string_to_sign.encode('utf-8')hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))headers = {'Content-Type': 'application/json;charset=utf-8'}api_url = dingding_url + "&timestamp={}&sign={}".format(timestamp, sign) ##加签算法使用if warntype == 'routineloadwarn':owner=["dfdfs134"]if warntype == 'fewarn' or warntype == 'bewarn':owner=["faasdfaAQE"]json_text = {"at": {"atMobiles": ["180xxxxxx"],"atDingtalkIds":owner,"isAtAll": "False"},"msgtype": "text","text": {"content": content}}requests.post(api_url, json.dumps(json_text), headers=headers)def srmsg(ip,port,username,passwd,db,exe_sql):conn = pymysql.connect(host=ip,port=port,user=username,password=passwd,database=db)cursor = conn.cursor()sql = exe_sqlcursor.execute(sql)result=cursor.fetchall()cursor.close()conn.close()return  resultdef fewarn(clustername,base_tuple_fe,token):warntype='fewarn'#2.4.1版本SRif clustername == 'SR':for feinfo in base_tuple_fe:# print(feinfo)if feinfo[10] == "false":fewanrmsg = "集群: " + clustername + "\n" + \"异常FE: " + feinfo[1] + "\n" + \"状态: " + feinfo[10] + "\n" + \"上次启动时间: " + feinfo[15]msg(warntype, fewanrmsg, token)else:#2.4.1版本SRfor feinfo in base_tuple_fe:# print(feinfo)if feinfo[9] == "false":fewanrmsg = "集群: " + clustername + "\n" + \"异常FE: " + feinfo[1] + "\n" + \"状态: " + feinfo[9] + "\n" + \"上次启动时间: " + feinfo[14]msg(warntype, fewanrmsg, token)def bewarn(clustername,base_tuple_be,token):warntype='bewarn'#2.4.1版本SRif clustername == 'SatrRocks':for beinfo in base_tuple_be:# print(beinfo)if beinfo[9] == "false":bewanrmsg = "集群: " + clustername + "\n" + \"异常BE: " + beinfo[2] + "\n" + \"状态: " + beinfo[9] + "\n" + \"上次启动时间: " + beinfo[7]msg(warntype, bewanrmsg, token)else:#2.3.1版本srfor beinfo in base_tuple_be:# print(beinfo)if beinfo[8] == "false":bewanrmsg = "集群: " + clustername + "\n" + \"异常BE: " + beinfo[1] + "\n" + \"状态: " + beinfo[8] + "\n" + \"上次启动时间: " + beinfo[6]msg(warntype, bewanrmsg, token)def routineloadwarn(clustername,load_tuple,token):warntype='routineloadwarn'for info in load_tuple:#title = dict_srprod["envname"]input_message= "集群: "+ clustername + "\n" +\"任务id: "+ info[0] + "\n" +\"任务名: "+ info[1] + "\n" +\"库名: " + info[5]+ "\n" +\"表名: " + info[6]+ "\n" +\"状态: " + info[7]+ "\n" +\"挂起时间: "+ info[2] + "\n" +\"日志链接:" + info[16] + "\n" +\"其他错误:" + info[17]msg(warntype, input_message, token)if __name__ == '__main__':dict_srprod={"envname":"生产SatrRocks","ip":"192.168.10.10","port":29030,"username":"root","passwd":"********","dbname":["test1","test2"],"check_fe_status":"show frontends;","check_be_status":"show backends;","check_rtload":"show routine load where State='PAUSED' and TableName in ('t1','t2');"}dict_qwprod={"envname":"生产(1)SatrRocks","ip":"192.168.10.10","port":39030,"username":"root","passwd":"********","dbname":["test0","test"],"check_fe_status":"show frontends;","check_be_status":"show backends;","check_rtload":"show routine load where State='PAUSED';"}dict_srsit={"envname":"测试SatrRocks","ip":"192.168.10.11","port":19030,"username":"root","passwd":"********","dbname":["test1","test2","test3"],"check_fe_status":"show frontends;","check_be_status":"show backends;","check_rtload":"show routine load where State='PAUSED' and TableName='t0';"}token = "xxxxx""""环境0"""#生产 routine load monitorbase_tuple=srmsg(dict_srprod["ip"],dict_srprod["port"],dict_srprod["username"],dict_srprod["passwd"],dict_srprod["dbname"][0],dict_srprod["check_rtload"])routineloadwarn(dict_srprod["envname"],base_tuple,token)# 生产be/fe状态监控base_tuple_fe = srmsg(dict_srprod["ip"], dict_srprod["port"],dict_srprod["username"], dict_srprod["passwd"],dict_srprod["dbname"][0], dict_srprod["check_fe_status"])fewarn(dict_srprod["envname"],base_tuple_fe,token)base_tuple_be = srmsg(dict_srprod["ip"], dict_srprod["port"],dict_srprod["username"], dict_srprod["passwd"],dict_srprod["dbname"][0], dict_srprod["check_be_status"])bewarn(dict_srprod["envname"],base_tuple_be,token)"""环境1"""#### routine load monitorbase_tuple=srmsg(dict_qwprod["ip"],dict_qwprod["port"],dict_qwprod["username"],dict_qwprod["passwd"],dict_qwprod["dbname"][0],dict_qwprod["check_rtload"])routineloadwarn(dict_qwprod["envname"],base_tuple,token)# be/fe状态监控base_tuple_fe = srmsg(dict_qwprod["ip"], dict_qwprod["port"],dict_qwprod["username"], dict_qwprod["passwd"],dict_qwprod["dbname"][0], dict_qwprod["check_fe_status"])fewarn(dict_qwprod["envname"],base_tuple_fe,token)base_tuple_be = srmsg(dict_qwprod["ip"], dict_qwprod["port"],dict_qwprod["username"], dict_qwprod["passwd"],dict_qwprod["dbname"][0], dict_qwprod["check_be_status"])bewarn(dict_qwprod["envname"],base_tuple_be,token)"""环境2"""####测试routine load monitorbase_tuple=srmsg(dict_srsit["ip"],dict_srsit["port"],dict_srsit["username"],dict_srsit["passwd"],dict_srsit["dbname"][0],dict_srsit["check_rtload"])routineloadwarn(dict_srsit["envname"],base_tuple,token)# 测试be/fe状态监控base_tuple_fe = srmsg(dict_srsit["ip"], dict_srsit["port"],dict_srsit["username"], dict_srsit["passwd"],dict_srsit["dbname"][0], dict_srsit["check_fe_status"])fewarn(dict_srsit["envname"],base_tuple_fe,token)base_tuple_be = srmsg(dict_srsit["ip"], dict_srsit["port"],dict_srsit["username"], dict_srsit["passwd"],dict_srsit["dbname"][0], dict_srsit["check_be_status"])bewarn(dict_srsit["envname"],base_tuple_be,token)

另外,钉钉的一些开发说明,请参阅钉钉官网
注册机器人链接:https://open.dingtalk.com/document/connector/alarm-subscription

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

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

相关文章

二维码智慧门牌管理系统:确保数据准确,强制校验GPS信号强度

文章目录 前言一、数据采集多种方式二、提高工作效率与管理效率 前言 在快速发展的科技时代,我们推出了一款最新的门牌系统解决方案——二维码智慧门牌。这款门牌不仅具备高效的管理功能,还为入口管理提供全新的智慧化解决方案。 一、数据采集多种方式 …

【Arduino TFT】 记录使用DMA优化TFT屏帧率

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-18 ❤️❤️ 本篇更新记录 2023-10-18 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝&#x1f64…

【马蹄集】—— 概率论专题

概率论专题 目录 MT2226 抽奖概率MT2227 饿饿!饭饭!MT2228 甜甜花的研究MT2229 赌石MT2230 square MT2226 抽奖概率 难度:黄金    时间限制:1秒    占用内存:128M 题目描述 小码哥正在进行抽奖,箱子里有…

Transformer模型 | Transformer模型描述

谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果,引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快…

身份证二要素核验API:提高身份验证的便捷性与安全性

引言 随着数字化时代的不断发展,身份验证变得愈发重要。在互联网上,身份验证是保护用户隐私和数据安全的关键环节。为了满足这一需求,身份证二要素核验API应运而生,成为提高身份验证的便捷性与安全性的得力工具。 身份验证的重要…

大数据Hadoop之——部署hadoop+hive+Mysql环境(window11)

一、安装JDK8 【温馨提示】对应后面安装的hadoop和hive版本,这里使用jdk8,这里不要用其他jdk了,可能会出现一些其他问题。 1)JDK下载地址 Java Downloads | Oracle 按正常下载是需要先登录的,这里提供一个不用登录下载…

GLEIF携手TrustAsia,共促数字邮件证书的信任与透明度升级

TrustAsia首次发布嵌入LEI的S/MIME证书,用于验证法定实体相关的电子邮件账户的真实与完整性 2023年10月,全球法人识别编码基金会(GLEIF)与证书颁发机构(CA)TrustAsia通力合作,双方就促进LEI在数…

vscode使用

vscode 快捷键1、ctrl f 文件内搜索2、ctrlp 快速打开最近打开的文件3、ctrlshiltn 打开新的编辑器窗口4、ctrlshiftw 关闭编辑器5、ctrlhome 跳转到页头6、ctrlend 跳转到页尾 插件1、Markdown Preview 参考文章 https://zhuanlan.zhihu.com/p/113222681?utm_sourcecom.tenc…

米哈游、复旦发布,具备感知、大脑、行动的大语言模型“智能体”

ChatGPT等大语言模型展示了前所未有的创造能力,但距AGI(通用人工智能)还有很大的距离,缺少自主决策、记忆存储、规划等拟人化能力。 为了探索大语言模型向AGI演变,进化成超越人类的超级人工智能,米哈游与复…

SpringBoot集成Activiti7

SpringBoot集成Activiti7 SpringBoot版本使用2.7.16 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.16</version><relativePath/> <!-- lookup…

OTP语音芯片和TTS语音芯片的差异性

OTP&#xff08;One-Time Programmable&#xff09;语音芯片和TTS&#xff08;Text-to-Speech&#xff09;语音芯片是两种不同类型的声音处理芯片。OTP主要用于播放预录声音片段&#xff0c;而TTS则根据文本实时生成语音。OTP的灵活性较弱&#xff0c;适用于固定声音输出&#…

05 依赖倒置原则

官方定义&#xff1a; 依赖倒置原则&#xff08;Dependence Inversion Principle&#xff0c;DIP&#xff09;是指在设计代码架构 时&#xff0c;高层模块不应该依赖于底层模块&#xff0c;二者都应该依赖于抽象。抽象不应该依 赖于细节&#xff0c;细节应该依赖于抽象。 通俗…

深度学习 | CNN卷积核与通道

10.1、单通道卷积 以单通道卷积为例&#xff0c;输入为&#xff08;1,5,5&#xff09;&#xff0c;分别表示1个通道&#xff0c;宽为5&#xff0c;高为5。 假设卷积核大小为3x3&#xff0c;padding0&#xff0c;stride1。 运算过程&#xff1a; 不断的在图像上进行遍历&#…

Ask Milvus Anything!聊聊被社区反复@的那些事儿ⅠⅠ

在上月的 “Ask Milvus” 专题直播中&#xff0c;我们为大家带来了 Backup 的技术解读&#xff0c;收到了社区成员很多积极的反馈。本期直播&#xff0c;我们将继续为大家带来社区呼声很高的 “Birdwatcher” 和 “Range Search” 两项功能的技术解读。 BirdWatcher 作为 Milvu…

Eolink Apikit 接口自动化测试流程

自动化测试是一种软件测试方法&#xff0c;利用自动化工具和脚本来执行测试用例&#xff0c;以验证软件应用程序的功能、性能、稳定性等特性。自动化测试的主要目的是提高测试效率、减少测试成本&#xff0c;并确保软件的质量和可靠性。 作为测试人员&#xff0c;在进行比较大…

国际十大优质期货投资app软件最新排名(综合版)

在当今的金融市场中&#xff0c;期货投资成为了越来越多人的选择。随着科技的发展&#xff0c;许多优质的期货投资app软件也应运而生。这些软件不仅提供了便捷的投资交易工具&#xff0c;还为投资者提供了丰富的市场分析和风险管理手段。 本文将介绍国际十大优质期货投资app软…

Python中Scrapy框架搭建ip代理池教程

在网络爬虫开发中&#xff0c;使用代理IP池可以提高爬取效率和匿名性&#xff0c;避免被目标网站封禁IP。本文将介绍如何使用Python中的Scrapy框架搭建IP代理池&#xff0c;并提供代码实例&#xff0c;帮助您快速搭建一个稳定可靠的代理池。 Python中Scrapy框架搭建ip代理池教程…

基于 Servlet 的博客系统

基于 Servlet 的博客系统 一、准备工作1、创建项目2、创建包3、导入前端静态页面 二、数据库设计1、blog&#xff08;博客表&#xff09;2、user&#xff08;用户表&#xff09;3、建库建表的 SQL 语句 三、封装数据库操作1、为什么要封装数据库&#xff1f;2、封装数据库的连接…

鸿蒙初体验

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…

小谈设计模式(30)—Java设计模式总结

小谈设计模式&#xff08;30&#xff09;—Java设计模式总结 专栏介绍专栏地址专栏介绍 总括三个主要类别abc 创建型模式&#xff08;Creational Patterns&#xff09;常见的创建型模式单例模式&#xff08;Singleton Pattern&#xff09;工厂模式&#xff08;Factory Pattern&…