阿里云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.rhkb.cn/news/161348.html

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

相关文章

RTSP/Onvif安防视频平台EasyNVR级联至EasyNVS系统不显示通道,是什么原因?

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。 我们在此前的文章中也介绍过关于EasyNVR级联EasyNVS上云网关综合管理平台的内容&#xff…

2023年Q3季度国内手机大盘销额下滑2%,TOP品牌销售数据分析

根据Canalys机构发布的最新报告,2023年第三季度,全球智能手机市场出货量仅下跌1%,可以认为目前全球手机市场的下滑势头有所减缓。而国内线上市场的表现也类似。 根据鲸参谋数据显示,今年Q3京东平台手机累计销量约1100万件&#xf…

hanniman 1v1 咨询

‍ 一共4种可选方案,3个To C(面向AI产品经理的职业规划诊断、求职内推套餐、模拟面试),1个To B(面向AI企业/投资机构/券商等)。 方案A:职业规划诊断 适合人群:AI产品经理 or 想转型A…

AWS香港Web3方案日,防御云安全实践案例受关注

9月26日,AWS合作伙伴之Web3解决方案日在香港举办。来自人工智能、Web3等领域的创业公司、技术专家、风险投资商,就元宇宙时代未来发展进行了深入交流。现场展示了顶象防御云在金融与Web3领域的安全实践案例。 Web3为互联网体系架构的一个整体演进和升级&…

10种新型网络安全威胁和攻击手法

2023年,网络威胁领域呈现出一些新的发展趋势,攻击类型趋于多样化,例如:从MOVEit攻击可以看出勒索攻击者开始抛弃基于加密的勒索软件,转向窃取数据进行勒索;同时,攻击者们还减少了对传统恶意软件…

【Linux】文件IO基础知识——上篇

目录 前文 一, 系统级——文件操作接口 a. open b. close c. write d. read 二,接口理解 那文件描述符——fd是什么呢? 三,文件描述符分配规则 原理 四,重定向——dup2 简易shell——重定向 五&#xff0c…

【微信小程序】6天精准入门(第3天:小程序flex布局、轮播图组件及mock运用以及综合案例)附源码

一、flex布局 布局的传统解决方案,基于[盒状模型],依赖display属性 position属性 float属性 1、什么是flex布局? Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。任何一个容器都可以…

Macos数据库管理:Navicat Premium 中文

Navicat Premium提供了直观且易用的图形用户界面,使得操作更为便捷。Navicat Premium 中文支持多种数据库系统,如MySQL、MariaDB、Oracle、SQLite、PostgreSQL等,可以让用户在同一平台上管理不同类型的数据库。Navicat Premium拥有强大的数据…

3分钟了解 egg.js

Eggjs是什么? Eggjs是一个基于Koajs的框架,所以它应当属于框架之上的框架,它继承了Koajs的高性能优点,同时又加入了一些约束与开发规范,来规避Koajs框架本身的开发自由度太高的问题。 Koajs是一个nodejs中比较基层的…

基于单片机智能汽车仪表设计系统

基于单片机的汽车智能仪表的设计 摘要:汽车的汽车系统。速度测量以及调速是我们这次的设计所要研究的对象,本次设计的基础核心的模块就是单片机,其应用的核心的控制单元就是stc89c52单片机,用到的测速模块是霍尔传感器&#xff0c…

智能垃圾桶丨悦享便捷生活

垃圾桶是人们日常生活所必不可少的必需品,它让生活中所产生的垃圾有了一个正确的存放地方。随着生产技术的迅速发展,垃圾桶也得以更新换代。由最初的简单式的圆筒式垃圾桶,到现在出现的感应式垃圾桶、智能语音控制垃圾桶,垃圾桶也…

JNDI-Injection-Exploit工具安装

从github上下载安装 git clone https://github.com/welk1n/JNDI-Injection-Exploit.git 打开 cd JNDI-Injection-Exploit 编译安装,Maven入门百科_maven中quickstart是什么意思-CSDN博客 mvn clean package -DskipTests 因为提示mvn错误,解决下…

交通目标检测-行人车辆检测流量计数 - 计算机竞赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…

nocos配置中心使用教程(NACOS 1.X版本)

1.下载和安装 进入到官网下载就好了 解压 启动 2.新建cloudalibaba-config-nacos-client3377 2.1 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://w…

纽交所上市公司埃森哲宣布已收购英国创意管理咨询公司

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;纽交所上市公司埃森哲(ACN)今日宣布已收购英国创意管理咨询公司The Storytellers。 这笔交易的金额没有披露。 此次收购将增强埃森哲在转型变革方面的能力&#xff0c;并进一步帮助客户阐明和激活…

初识Java 14-1 测试

目录 测试 单元测试 JUnit 测试覆盖率 前置条件 断言 Java提供的断言语法 Guava提供的更方便的断言 契约式设计中的断言 DbC 单元测试 Guava中的前置条件 本笔记参考自&#xff1a; 《On Java 中文版》 测试 ||| 如果没有经过测试&#xff0c;代码就不可能正常工作…

leetCode 5. 最长回文子串 动态规划 + 优化空间 / 中心扩展法 + 双指针

5. 最长回文子串 - 力扣&#xff08;LeetC5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09;5. 最长回文子串 - 力扣&#xff08;LeetC 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。…

数据结构----算法--排序算法

数据结构----算法–排序算法 一.冒泡排序&#xff08;BubbleSort&#xff09; 1.冒泡排序的核心思想 相邻两个元素进行大小比较&#xff0c;如果前一个比后一个大&#xff0c;就交换 注意&#xff1a; 在冒泡排序的过程中&#xff0c;促进了大的数往后去&#xff0c;小的数…

Spring事务和事务的传播机制(JavaEE进阶系列7)

目录 前言&#xff1a; 1.为什么需要事务 2.Spring中事务的实现 2.1编程式事务 2.2声明式事务 2.3Transactional的作用范围 2.4Transactional参数说明 2.5Transactional的注意事项 2.6Transactional工作原理 3.事务隔离级别 3.1事务特性的回顾 3.2Spring中设置事务…

区,段,碎片区与表空间结构

区&#xff0c;段&#xff0c;碎片区与表空间结构 结构图 另外在数据库中&#xff0c;还存在着区&#xff08;Extent&#xff09;&#xff0c;段&#xff08;Segment&#xff09;和表空间&#xff08;Tablespace&#xff09;的概念。行&#xff0c;页&#xff0c;区&#xff…