一、功能说明

二、代码详情

  1. 1、通过阿里sdk获取慢查询列表,格式化。
  2.  
  3. 2、企业微信报警接口
  4.  
  5. 3deamon
  1. #!/usr/bin/python
  2. #-*- conding:utf-8 -*-
  3. from aliyunsdkcore.client import AcsClient
  4. from aliyunsdkrds.request.v20140815 import DescribeDBInstanceAttributeRequest
  5. from aliyunsdkrds.request.v20140815 import DescribeSlowLogRecordsRequest
  6. import requests
  7. import json
  8. import os
  9. import time
  10. import logging
  11. import subprocess
  12. #ali key
  13. client = AcsClient(
  14. "",
  15. "",
  16. ""
  17. );
  18. log_file = "/tmp/rdsslowinfo.log"
  19. logging.basicConfig(filename=log_file,filemode='a',level=logging.DEBUG)
  20.  
  21. def WARNING(*objs):
  22. print("[%s] : " % time.strftime("%y-%m-%d %H:%M:%S", time.localtime()), *objs, file=sys.stderr)
  23.  
  24. class rdsInfo(object):
  25. ''' ali rds slow log get'''
  26. def __init__(self,dbId,startTime,endTime):
  27. self.dbId = dbId
  28. self.startTime = startTime
  29. self.endTime = endTime
  30.  
  31. def slowlogGet(self):
  32. request = DescribeSlowLogRecordsRequest.DescribeSlowLogRecordsRequest()
  33. request.set_accept_format('json')
  34. request.set_DBInstanceId(self.dbId)
  35. request.set_StartTime(self.startTime)
  36. request.set_EndTime(self.endTime)
  37. response = client.do_action_with_exception(request)
  38. data = json.loads(response)
  39. return data
  40.  
  41. def instanceGet(self):
  42. request = DescribeDBInstanceAttributeRequest.DescribeDBInstanceAttributeRequest()
  43. request.set_accept_format('json')
  44. request.set_DBInstanceId(self.dbId)
  45. response = client.do_action_with_exception(request)
  46. data = json.loads(response)
  47. #print (data['Items'])
  48. return data
  49.  
  50. class WeChat:
  51. '''微信接口'''
  52. def __init__(self,user):
  53. self.CORPID = '' #企业ID, 登陆企业微信,在我的企业-->企业信息里查看
  54. self.CORPSECRET = '' #自建应用,每个自建应用里都有单独的secret
  55. self.AGENTID = '' #应用代码
  56. self.TOUSER = user # 接收者用户名, @all 全体成员
  57.  
  58. def _get_access_token(self):
  59. url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
  60. values = {'corpid': self.CORPID,
  61. 'corpsecret': self.CORPSECRET,
  62. }
  63. req = requests.post(url, params=values)
  64. data = json.loads(req.text)
  65. # print (data)
  66. return data["access_token"]
  67.  
  68. def get_access_token(self):
  69. try:
  70. with open('access_token.conf', 'r') as f:
  71. t, access_token = f.read().split()
  72. except:
  73. with open('access_token.conf', 'w') as f:
  74. access_token = self._get_access_token()
  75. cur_time = time.time()
  76. f.write('\t'.join([str(cur_time), access_token]))
  77. return access_token
  78. else:
  79. cur_time = time.time()
  80. if 0 < cur_time - float(t) < 7200: #token的有效时间7200s
  81. return access_token
  82. else:
  83. with open('access_token.conf', 'w') as f:
  84. access_token = self._get_access_token()
  85. f.write('\t'.join([str(cur_time), access_token]))
  86. return access_token
  87.  
  88. def send_data(self, msg):
  89. send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
  90. send_values = {
  91. "touser": self.TOUSER,
  92. "msgtype": "text",
  93. "agentid": self.AGENTID,
  94. "text": {
  95. "content": msg
  96. },
  97. "safe": ""
  98. }
  99. send_msges=(bytes(json.dumps(send_values), 'utf-8'))
  100. respone = requests.post(send_url, send_msges)
  101. respone = respone.json()#当返回的数据是json串的时候直接用.json即可将respone转换成字典
  102. # print (respone["errmsg"])
  103. return respone["errmsg"]
  104.  
  105. def dataInit():
  106. ''' get data info'''
  107. instanceInfo = {
  108. 'rm-阿里域名':'业务线',
  109. 'rm-':'',
  110. 'rm-':'',
  111. 'rm-':'',
  112. 'rm-':'',
  113. }
  114. alarmList = ['','','','','']#收报警人列表
  115. for dbUrl in instanceInfo.keys():
  116. nowTime = time.strftime("%Y-%m-%dT%H:%MZ")
  117. second = time.time() - 24*60*60 #查询间隔 自己定义
  118. tago = time.strftime('%Y-%m-%dT%H:%MZ', time.localtime(second))
  119. rdsinfo = rdsInfo(dbUrl,tago,nowTime)
  120. slowlog_data = rdsinfo.slowlogGet()
  121. instance_data = rdsinfo.instanceGet()
  122. try:
  123. for recode in slowlog_data['Items']['SQLSlowRecord']:
  124. #print(recode)
  125. ParseRowCounts = recode['ParseRowCounts']
  126. ReturnRowCounts = recode['ReturnRowCounts']
  127. QueryTimes = recode['QueryTimes']
  128. HostAddress = recode['HostAddress']
  129. LockTimes = recode['LockTimes']
  130. ExecutionStartTime = recode['ExecutionStartTime']
  131. SQLText = recode['SQLText']
  132. DBName = recode['DBName']
  133. content = '''
  134. 业务线 :{url}
  135. SQL来源:{HostAddress}
  136. 执行时间:{ExecutionStartTime}
  137. 数据库名:{DBName}
  138. 执行时长:{QueryTimes}
  139. 锁定时长:{LockTimes}
  140. 解析行数:{ParseRowCounts}
  141. 返回行数:{ReturnRowCounts}
  142. SQL详情:{SQLText}
  143. ''' .format(url=instanceInfo[dbUrl],HostAddress=HostAddress,ExecutionStartTime\
  144. =ExecutionStartTime,DBName=DBName,QueryTimes=QueryTimes,LockTimes=LockTimes,\
  145. ParseRowCounts=ParseRowCounts,ReturnRowCounts=ReturnRowCounts,SQLText=SQLText)
  146. #print(content)
  147. logging.info(content)
  148. for alarm in alarmList:
  149. wx = WeChat(alarm)
  150. wx.send_data(msg=content)
  151. except Exception as e:
  152. WARNING('[%s]')%(e)
  153. class Daemon:
  154. ''' Daemon '''
  155. def createDaemon(self):
  156. try:
  157. if os.fork() > 0: os._exit(0) # exit father…
  158. except OSError as error:
  159. print ('fork #1 failed: %d (%s)' % (error.errno, error.strerror))
  160. os._exit(1)
  161. # it separates the son from the father
  162. os.chdir('/')
  163. os.setsid()
  164. os.umask(0)
  165. # create - fork 2
  166. try:
  167. pid = os.fork()
  168. if pid > 0:
  169. print ('Daemon PID %d' % pid)
  170. logging.info('Daemon PID %d' % pid)
  171. os._exit(0)
  172. except OSError as error:
  173. print ('fork #2 failed: %d (%s)' % (error.errno, error.strerror))
  174. os._exit(1)
  175. self.run() # function demo
  176.  
  177. def run(self):
  178. while True:
  179. dataInit()
  180. time.sleep(24*60*60) #deamon运行间隔时间
  181. #time.sleep(5)
  182. #except Exception,e:
  183. # traceback.print_exc()
  184.  
  185. if __name__ == '__main__':
  186. daemon = Daemon()
  187. 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. JVM内存管理之垃圾搜集器精解(让你在垃圾搜集器的世界里耍的游刃有余)

    引言 在上一章我们已经探讨过hotspot上垃圾搜集器的实现,一共有六种实现六种组合.本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何. 为了方便各位的观看与对比,LZ决定采用当初写设 ...

  2. 电脑桌面文件图标经常显示异常&&右键桌面文件属性不显示

    桌面图标经常失效,但文件可以正常点开使用. 右键桌面文件的属性,电脑无反应. 解决方法 ① cmd-sfc/scannow 此方法无效 ② 点击上图的运行疑难解答,最终找到问题,重启后解决! PS 型 ...

  3. my.conf配置大全

    [client]port = 3306socket = /tmp/mysql.sock [mysqld]port = 3306socket = /tmp/mysql.sock basedir = /u ...

  4. TMS320CC657基本外围电路调试

    一.本文内容 本文主要包含以下三个基本外围电路的调试过程与调试结果: 电源模块 时钟模块 复位模块 二.电源模块调试 无论对FPGA还是DSP而言,对电源的上电顺序都有一定的要求,且不同型号的器件对电 ...

  5. Java堆外内存之七:JVM NativeMemoryTracking 分析堆外内存泄露

    Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能.我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据. NMT介绍 工欲 ...

  6. 问题排查-JVM堆外内存问题排查

    首先确认堆占用 jmap 查看heap内存使用情况 jmap -heap pid 1 可以查看到MetaspaceSize,CompressedClassSpaceSize,MaxMetaSize j ...

  7. java6枚举类型

    java.lang.Enum > 使用enum定义. 类如: public class EnumDemo { enum Edge { TOP, BOTTOM, LEFT, RIGHT//定义了一 ...

  8. 017:磁盘I/0介绍和测试

    一. 磁盘 1. 磁盘的访问模式 顺序访问 顺序的访问磁盘上的块: 一般经过测试后,得到该值的单位是MB/s,表示为磁盘带宽,普通硬盘在 50~ 100 MB/s 随机访问 随机的访问磁盘上的块 也可 ...

  9. MySQL升级指南

    一 .MySQL升级 1.官方升级策略 注意 升级过程中必须使用具有管理权限的MySQL帐户来执行SQL语句. 1.升级方法 逻辑升级: 涉及使用 mysqldump从旧的MySQL版本导出现有数据 ...

  10. Ajax显示隐藏

    $(function(){ $('#search').click(function(){ if($(".search_div").is(":visible")) ...