一、功能说明

二、代码详情

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+微信接口报警的更多相关文章

  1. java微信接口之五—消息分组群发

    一.微信消息分组群发接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_t ...

  2. java微信接口之四—上传素材

    一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...

  3. java微信接口之三—上传多媒体文件

    一.微信上传多媒体接口简介 1.请求:该请求是使用post提交from来实现的,我们可以在网页上进行表单提交来实现.地址为: http://file.api.weixin.qq.com/cgi-bin ...

  4. java微信接口之二—获取用户组

    一.微信获取用户组接口简介 1.请求 该请求也是GET方式请求.请求的url格式如下: https://api.weixin.qq.com/cgi-bin/groups/get?access_toke ...

  5. 微信接口开发1--向微信发送请求--获取access_token

    //随便放置一个php文件在服务器上.执行该方法--调用模拟get提交---到微信-->获得微信返回的access_token 不建议自己编写模拟get提交方法. 建议直接导入微信框架LaneW ...

  6. zabbix 定义触发器,并使用邮件,微信消息报警。

    触发器可根据监控项获取到的值来进行一些操作,如监控项获取到的values为0,触发器可判断为正常,如果获取到了1,就触发报警. 定义报警方式比较简单,但是用shell脚本实现起来,总是有格式问题,所以 ...

  7. C#开发微信门户及应用(1)--开始使用微信接口

    微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...

  8. C#开发微信门户及应用(42)--使用Autofac实现微信接口处理的控制反转处理

    在很多情况下,我们利用IOC控制反转可以很方便实现一些接口的适配处理,可以在需要的时候切换不同的接口实现,使用这种方式在调用的时候,只需要知道相应的接口接口,具体调用哪个实现类,可以在配置文件中动态指 ...

  9. 练习题(登陆-进度条-微信接口判断qq-微信接口判断列车时刻表-)

    1.写一个用户的登陆注册的界面,用户的密码用hashlib加密存在文件中,登陆时候,用户的密码要和文件中的密码一致才行 def sha(password): #加密函数 passwd = hashli ...

随机推荐

  1. Redis客户端基本命令

    更多命令请进入官网查询:https://redis.io/commands 一.基础命令 1.连接服务端 redis-cli 或 redis-cli -h ip地址 -p 端口 2.选择数据库 Red ...

  2. Window下SVN使用总结

    1 地址:http://subversion.apache.org/packages.html#windows 找到windows下的svn客户端工具.选择Win32Svn 进行安装. 一般环境变量会 ...

  3. 阻塞队列之三:SynchronousQueue同步队列 阻塞算法的3种实现

    一.SynchronousQueue简介 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除 ...

  4. 杂项:Hadoop

    ylbtech-杂项:Hadoop Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Ha ...

  5. c# 判断文件是否已使用

    string path = Server.MapPath(" PDFs"); bool tfOpenTemp= IsFileInUse(path + " /Doc1.pd ...

  6. 模拟admin组件自己开发stark组件之搜索和批量操作

    搜索相关,搜索的本质就是从数据库查询出来的数据过滤 用户自定义给出过滤条件joker.py list_display = ('id','title','price',) show_add_btn = ...

  7. python学习(二十二) String(上)

    str1 = "This is a 'test'" print(str1) str1 = 'This is a "test"' print(str1) str1 ...

  8. da分布式算法

    参考学习<数字信号处理的FPGA实现> 思想如图: 在下半部分可以看到:是将N阶的数B bit,一位一位的移入LUT然后经过累加器.其中N个数需要2.^N次方长度的LUT,B bit表示需 ...

  9. OD 实验(十二) - 对一个 Delphi 程序的逆向

    程序: 运行程序 界面显示的是未注册 点击 Help -> About 点击 Use Reg Key 这里输入注册码 用 PEiD 看一下 该程序是用 Delphi 6.0 - 7.0 写的 逆 ...

  10. IDA Pro 权威指南学习笔记(十三) - 基本代码转换

    IDA提供的代码转换包括: 1.将数据转换为代码 2.将代码转换为数据 3.指定一个指令序列为函数 4.更改现有函数的起始或结束地址 5.更改指令操作数的显示格式 代码显示选项 通过 Options ...