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 ...
随机推荐
- Redis持久化的简单介绍
Redis的强大功能很大程度上是由于其将所有数据都存储在内存中,为了使Redis在重启后仍能保证数据不丢失,需要将数据从内存中以某种形式持久化到硬盘中. Redis支持两种方式的持久化,一种是RDB方 ...
- 14.Python使用Pillow教程
1.打算开始学习PIL,在命令行输入:pip3 install PIL,报错信息如下所示,后百度了下,发现:PIL仅支持到Python2.7,后来一群志愿者在此基础上创建了兼容性版本,为Pillow, ...
- Mysql中的GROUP_CONCAT使用
SELECT res.ITRId Id, res.ITRResourceName ResourceName, res.ITRSupplierName SupplierName, res.ITRDept ...
- laravel5中添加自定义函数
laravel里面我们很多朋友不知道把自定义函数放在哪儿.我们的应用里经常会有一些全局都可能会用的函数,我们应该怎么放置它会比较好呢?现在匀们为大家准备了laravel放置函数的规范. 1. 创建文件 ...
- 项目中Map端数据处理不均匀性分析
Map任务的不均匀性 最近发现Map端数据越来越不均匀,而处理输入的数据,写到本地磁盘的数据量都差不多,我们随便拿出来两个attempt任务(当前map数量为64个),33和45,33的counter ...
- python学习(二十七) 元组
# 元组是不可变的,不能改变元素的值,也不能增加.减少元素my_tuple = (1, 2, 3, 3)print(my_tuple) # 查找元素位置print(my_tuple.index(2)) ...
- 手机页面开发的meta
<meta name="viewport" content="width=device-width, initial-scale=1"> 手机环境. ...
- JS-用法
JavaScript 用法 HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> 和 & ...
- A start job is running for /etc/rc.d/rc.local ... ... no limit
/etc/rc.d/rc.local文件中配置了redis随机启动但是没有设置redis启动为守护进程(daemonize yes)导致redis启动后阻塞
- Math对象及相关方法
Math.abs() 取绝对值 Math.ceil()向上取整 (出现小数点就向上+1) Math.floor()向下取整 Math.round()四舍五入 Math.max(val1,val2,va ...