一、功能说明

二、代码详情

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. Web 漏洞分析与防御之 CSRF(二)

    原文地址:Web 漏洞分析与防御之 CSRF(二) 博客地址:http://www.extlight.com 一.全称 跨站请求伪造(Cross-site Request Forgery) 二.原理 ...

  2. .NET实现多个不同有效时间Session方案思考

    什么是Session?简单讲,Session是一种服务端用于保存每个客户端用户的状态信息的机制.客户端第一次访问时,服务端从分配一个空间专门存储该客户端的信息,后续访问时便可以直接获取或者更新状态信息 ...

  3. 关于PIC和FPGA

    PIC:Peripheral Interface Controller. FPGA:Field Programmable Gate Array. 关于二者: 区别: FPGA是逻辑门器件,可以配置成为 ...

  4. snmp 介绍和Ubuntu安装使用

    一.介绍 1. 服务器监控工具可以帮助我们从任何一个地方实时了解服务器的性能和功能.监控宝服务器监控套装,可以实时CPU使用率.内存使用率.平均负载.磁盘I/O.网络流量.磁盘使用率等,能够同时为你带 ...

  5. appium+python自动化34-获取元素属性get_attribute

    获取text # coding:utf-8 from appium import webdriver from time import sleep desired_caps = { 'platform ...

  6. SpringMVC中注解控制器及数据绑定

    一.Spring2.5之前,我们都是通过实现Controller接口或其他实现来定义我们的处理器类. 二.Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMap ...

  7. hadoop中使用hprof工具进行性能分析

    在编写完成MapReduce程序之后,调优就成为了一个大问题.如何使用现有工具快速地分析出任务的性能?   对于本地的java应用程序,进行分析可能稍微简单,但是hadoop是一个分布式框架,MapR ...

  8. Django跳转

    跳转问题 如果我现在停留在文章的详情页,用户未登陆,如果你要评论,或者点赞就应该回到登陆页面登陆 如果登陆成功了,就要返回到当初跳转过来的页面 第一种通过前后端传送数据 $('.hit').click ...

  9. Linux下sz下载文件超过4G办法

    当下载文件超过4G时,sz提示能下载. 解决办法有以下几种: 1.scp 2.ftp 3.nc 4.icmp 5.文件切割 ---------------------------------- 以上4 ...

  10. linux 监控系统剩余内存大小

    cur_free = `free -m | awk '/buffers\// {print $NF}'` chars="current memory is $cur_free." ...