阿里云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信号强度

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

Could not find artifact com.sleepycat;je:jar:7.3.7 in aliyunmaven

在编译inlong源码时报的错误,去本地库里发现只有lastupdate的文件,就又去maven库里看了一下Maven Repository: com.sleepycat je (mvnrepository.com),发现没有这个版本,将版本进行修改错误解决

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

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

信息系统漏洞与风险管理制度

1、总则 1.1、目的 为了进一步规范XXXXX单位信息系统风险管理活动,提升风险管理工作的可操纵性和适用性,使信息网络正常运行,防止网络攻击,保证业务的正常进行,依据XXXXX单位员的相关规范和标准规定,特制…

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

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

Spring Framework :WebClient 取代 RestTemplate

本心、输入输出、结果 文章目录 Spring Framework :WebClient 取代 RestTemplate前言WebClient 优于 RestTemplate 的地方使用示例创建客户端发起同步请求发起异步请求WebClient 简介安装配置如何设置 URL 参数 (REST)配置超时时间免除 SSL 验证弘扬爱国精神Spring Framewor…

vue echarts图表自适应屏幕变化

在Vue中使用ECharts图表实现自适应屏幕变化,可以按照以下步骤进行操作: 安装ECharts和vue-echarts库。 npm install echarts vue-echarts在需要使用图表的组件中导入相关库并注册图表组件。 import ECharts from vue-echarts; import echarts/lib/char…

搭建CNFS文件系统

1.概念: CNFS (Cluster Network File System)是 GPFS 中的一种模式,用于配置和管理多台服务器(节点)之间的文件共享和数据访问 它允许多个节点同时访问和共享文件系统的数据,以实现高性能、高可…

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演变,进化成超越人类的超级人工智能,米哈游与复…

删除url地址字符串的某个参数

例如,删除url的token参数 删除前:http://xxxxxxxx/#/dynamic?token4654561654asd4asd&id03e657722d5056820c5f&cityName广州市 删除后:http://xxxxxxxx/#/dynamic?id03e657722d5056820c5f&cityName广州市 /*** 删除URL中指定se…

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;适用于固定声音输出&#…

vue 放大镜(简易)

目录 zoom组件 <template><div class"pic-img"><div class"img-container"><img ref"img" load"imgLoaded" :src"url" :style"overlayStyle" error"imgerrorfun"/><div cl…

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; 不断的在图像上进行遍历&#…