Python3 获取RDS slowlog+微信接口报警
- 1、通过阿里sdk获取慢查询列表,格式化。
- 2、企业微信报警接口
- 3、deamon
- #!/usr/bin/python
- #-*- conding:utf-8 -*-
- from aliyunsdkcore.client import AcsClient
- from aliyunsdkrds.request.v20140815 import DescribeDBInstanceAttributeRequest
- from aliyunsdkrds.request.v20140815 import DescribeSlowLogRecordsRequest
- import requests
- import json
- import os
- import time
- import logging
- import subprocess
- #ali key
- client = AcsClient(
- "",
- "",
- ""
- );
- log_file = "/tmp/rdsslowinfo.log"
- logging.basicConfig(filename=log_file,filemode='a',level=logging.DEBUG)
- def WARNING(*objs):
- print("[%s] : " % time.strftime("%y-%m-%d %H:%M:%S", time.localtime()), *objs, file=sys.stderr)
- class rdsInfo(object):
- ''' ali rds slow log get'''
- def __init__(self,dbId,startTime,endTime):
- self.dbId = dbId
- self.startTime = startTime
- self.endTime = endTime
- def slowlogGet(self):
- request = DescribeSlowLogRecordsRequest.DescribeSlowLogRecordsRequest()
- request.set_accept_format('json')
- request.set_DBInstanceId(self.dbId)
- request.set_StartTime(self.startTime)
- request.set_EndTime(self.endTime)
- response = client.do_action_with_exception(request)
- data = json.loads(response)
- return data
- def instanceGet(self):
- request = DescribeDBInstanceAttributeRequest.DescribeDBInstanceAttributeRequest()
- request.set_accept_format('json')
- request.set_DBInstanceId(self.dbId)
- response = client.do_action_with_exception(request)
- data = json.loads(response)
- #print (data['Items'])
- return data
- class WeChat:
- '''微信接口'''
- def __init__(self,user):
- self.CORPID = '' #企业ID, 登陆企业微信,在我的企业-->企业信息里查看
- self.CORPSECRET = '' #自建应用,每个自建应用里都有单独的secret
- self.AGENTID = '' #应用代码
- self.TOUSER = user # 接收者用户名, @all 全体成员
- def _get_access_token(self):
- url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
- values = {'corpid': self.CORPID,
- 'corpsecret': self.CORPSECRET,
- }
- req = requests.post(url, params=values)
- data = json.loads(req.text)
- # print (data)
- return data["access_token"]
- def get_access_token(self):
- try:
- with open('access_token.conf', 'r') as f:
- t, access_token = f.read().split()
- except:
- with open('access_token.conf', 'w') as f:
- access_token = self._get_access_token()
- cur_time = time.time()
- f.write('\t'.join([str(cur_time), access_token]))
- return access_token
- else:
- cur_time = time.time()
- if 0 < cur_time - float(t) < 7200: #token的有效时间7200s
- return access_token
- else:
- with open('access_token.conf', 'w') as f:
- access_token = self._get_access_token()
- f.write('\t'.join([str(cur_time), access_token]))
- return access_token
- def send_data(self, msg):
- send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
- send_values = {
- "touser": self.TOUSER,
- "msgtype": "text",
- "agentid": self.AGENTID,
- "text": {
- "content": msg
- },
- "safe": ""
- }
- send_msges=(bytes(json.dumps(send_values), 'utf-8'))
- respone = requests.post(send_url, send_msges)
- respone = respone.json()#当返回的数据是json串的时候直接用.json即可将respone转换成字典
- # print (respone["errmsg"])
- return respone["errmsg"]
- def dataInit():
- ''' get data info'''
- instanceInfo = {
- 'rm-阿里域名':'业务线',
- 'rm-':'',
- 'rm-':'',
- 'rm-':'',
- 'rm-':'',
- }
- alarmList = ['','','','','']#收报警人列表
- for dbUrl in instanceInfo.keys():
- nowTime = time.strftime("%Y-%m-%dT%H:%MZ")
- second = time.time() - 24*60*60 #查询间隔 自己定义
- tago = time.strftime('%Y-%m-%dT%H:%MZ', time.localtime(second))
- rdsinfo = rdsInfo(dbUrl,tago,nowTime)
- slowlog_data = rdsinfo.slowlogGet()
- instance_data = rdsinfo.instanceGet()
- try:
- for recode in slowlog_data['Items']['SQLSlowRecord']:
- #print(recode)
- ParseRowCounts = recode['ParseRowCounts']
- ReturnRowCounts = recode['ReturnRowCounts']
- QueryTimes = recode['QueryTimes']
- HostAddress = recode['HostAddress']
- LockTimes = recode['LockTimes']
- ExecutionStartTime = recode['ExecutionStartTime']
- SQLText = recode['SQLText']
- DBName = recode['DBName']
- content = '''
- 业务线 :{url}
- SQL来源:{HostAddress}
- 执行时间:{ExecutionStartTime}
- 数据库名:{DBName}
- 执行时长:{QueryTimes}
- 锁定时长:{LockTimes}
- 解析行数:{ParseRowCounts}
- 返回行数:{ReturnRowCounts}
- SQL详情:{SQLText}
- ''' .format(url=instanceInfo[dbUrl],HostAddress=HostAddress,ExecutionStartTime\
- =ExecutionStartTime,DBName=DBName,QueryTimes=QueryTimes,LockTimes=LockTimes,\
- ParseRowCounts=ParseRowCounts,ReturnRowCounts=ReturnRowCounts,SQLText=SQLText)
- #print(content)
- logging.info(content)
- for alarm in alarmList:
- wx = WeChat(alarm)
- wx.send_data(msg=content)
- except Exception as e:
- WARNING('[%s]')%(e)
- class Daemon:
- ''' Daemon '''
- def createDaemon(self):
- try:
- if os.fork() > 0: os._exit(0) # exit father…
- except OSError as error:
- print ('fork #1 failed: %d (%s)' % (error.errno, error.strerror))
- os._exit(1)
- # it separates the son from the father
- os.chdir('/')
- os.setsid()
- os.umask(0)
- # create - fork 2
- try:
- pid = os.fork()
- if pid > 0:
- print ('Daemon PID %d' % pid)
- logging.info('Daemon PID %d' % pid)
- os._exit(0)
- except OSError as error:
- print ('fork #2 failed: %d (%s)' % (error.errno, error.strerror))
- os._exit(1)
- self.run() # function demo
- def run(self):
- while True:
- dataInit()
- time.sleep(24*60*60) #deamon运行间隔时间
- #time.sleep(5)
- #except Exception,e:
- # traceback.print_exc()
- if __name__ == '__main__':
- daemon = Daemon()
- daemon.createDaemon()
Python3 获取RDS slowlog+微信接口报警的更多相关文章
- java微信接口之五—消息分组群发
一.微信消息分组群发接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_t ...
- java微信接口之四—上传素材
一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...
- java微信接口之三—上传多媒体文件
一.微信上传多媒体接口简介 1.请求:该请求是使用post提交from来实现的,我们可以在网页上进行表单提交来实现.地址为: http://file.api.weixin.qq.com/cgi-bin ...
- java微信接口之二—获取用户组
一.微信获取用户组接口简介 1.请求 该请求也是GET方式请求.请求的url格式如下: https://api.weixin.qq.com/cgi-bin/groups/get?access_toke ...
- 微信接口开发1--向微信发送请求--获取access_token
//随便放置一个php文件在服务器上.执行该方法--调用模拟get提交---到微信-->获得微信返回的access_token 不建议自己编写模拟get提交方法. 建议直接导入微信框架LaneW ...
- zabbix 定义触发器,并使用邮件,微信消息报警。
触发器可根据监控项获取到的值来进行一些操作,如监控项获取到的values为0,触发器可判断为正常,如果获取到了1,就触发报警. 定义报警方式比较简单,但是用shell脚本实现起来,总是有格式问题,所以 ...
- C#开发微信门户及应用(1)--开始使用微信接口
微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...
- C#开发微信门户及应用(42)--使用Autofac实现微信接口处理的控制反转处理
在很多情况下,我们利用IOC控制反转可以很方便实现一些接口的适配处理,可以在需要的时候切换不同的接口实现,使用这种方式在调用的时候,只需要知道相应的接口接口,具体调用哪个实现类,可以在配置文件中动态指 ...
- 练习题(登陆-进度条-微信接口判断qq-微信接口判断列车时刻表-)
1.写一个用户的登陆注册的界面,用户的密码用hashlib加密存在文件中,登陆时候,用户的密码要和文件中的密码一致才行 def sha(password): #加密函数 passwd = hashli ...
随机推荐
- JVM内存管理之垃圾搜集器精解(让你在垃圾搜集器的世界里耍的游刃有余)
引言 在上一章我们已经探讨过hotspot上垃圾搜集器的实现,一共有六种实现六种组合.本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何. 为了方便各位的观看与对比,LZ决定采用当初写设 ...
- 电脑桌面文件图标经常显示异常&&右键桌面文件属性不显示
桌面图标经常失效,但文件可以正常点开使用. 右键桌面文件的属性,电脑无反应. 解决方法 ① cmd-sfc/scannow 此方法无效 ② 点击上图的运行疑难解答,最终找到问题,重启后解决! PS 型 ...
- my.conf配置大全
[client]port = 3306socket = /tmp/mysql.sock [mysqld]port = 3306socket = /tmp/mysql.sock basedir = /u ...
- TMS320CC657基本外围电路调试
一.本文内容 本文主要包含以下三个基本外围电路的调试过程与调试结果: 电源模块 时钟模块 复位模块 二.电源模块调试 无论对FPGA还是DSP而言,对电源的上电顺序都有一定的要求,且不同型号的器件对电 ...
- Java堆外内存之七:JVM NativeMemoryTracking 分析堆外内存泄露
Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能.我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据. NMT介绍 工欲 ...
- 问题排查-JVM堆外内存问题排查
首先确认堆占用 jmap 查看heap内存使用情况 jmap -heap pid 1 可以查看到MetaspaceSize,CompressedClassSpaceSize,MaxMetaSize j ...
- java6枚举类型
java.lang.Enum > 使用enum定义. 类如: public class EnumDemo { enum Edge { TOP, BOTTOM, LEFT, RIGHT//定义了一 ...
- 017:磁盘I/0介绍和测试
一. 磁盘 1. 磁盘的访问模式 顺序访问 顺序的访问磁盘上的块: 一般经过测试后,得到该值的单位是MB/s,表示为磁盘带宽,普通硬盘在 50~ 100 MB/s 随机访问 随机的访问磁盘上的块 也可 ...
- MySQL升级指南
一 .MySQL升级 1.官方升级策略 注意 升级过程中必须使用具有管理权限的MySQL帐户来执行SQL语句. 1.升级方法 逻辑升级: 涉及使用 mysqldump从旧的MySQL版本导出现有数据 ...
- Ajax显示隐藏
$(function(){ $('#search').click(function(){ if($(".search_div").is(":visible")) ...