阿里云RDS 慢日志 钉钉报警
需求:通过阿里云sdk把阿里云rds慢日志通过钉钉报警。SDK是阿里云为用户提供的开发工具,支持JAVA、PHP、C#等几种不同的语言,这里我打算用Python脚本调用钉钉api。在Python SDK里提供了一些模块,我们通过调用这些模块、传入一些必要的参数可以简单的实现数据的获取。先安装setuptools工具cd /usr/local/wget https://f...
需求:通过阿里云sdk把阿里云rds慢日志通过钉钉报警。
SDK是阿里云为用户提供的开发工具,支持JAVA、PHP、C#等几种不同的语言,这里我打算用Python脚本调用钉钉api。在Python SDK里提供了一些模块,我们通过调用这些模块、传入一些必要的参数可以简单的实现数据的获取。
先安装setuptools工具
cd /usr/local/
wget https://files.pythonhosted.org/packages/1d/64/a18a487b4391a05b9c7f938b94a16d80305bf0369c6b0b9509e86165e1d3/setuptools-41.0.1.zip
yum install -y unzip zip
unzip setuptools-41.0.1.zip
cd setuptools-41.0.1
python setup.py build //编译
python setup.py install //安装
下载Python SDK
cd /usr/local/
wget https://files.pythonhosted.org/packages/fe/ca/d708a5bf262ab9f3b44045753fc05247214876c73da39024db4b94816e7b/aliyun-python-sdk-rds-2.3.9.tar.gz
tar xf aliyun-python-sdk-rds-2.3.9.tar.gz
mv aliyun-python-sdk-rds-2.3.9/ /usr/local/sdk-rds
cd /usr/local/sdk-rds/
python setup.py install //需要下载两个库文件,一个核心库sdk-core和rds库sdk-rds
这时我们已经装好了阿里云sdk库环境
在aliyun-python-sdk-rds/aliyunsdkrds/request/v20140815路径下有大量的sdk-rds api库文件,我们调用这里的库文件来查找其需要的参数的设置方法和发送请求。
调用阿里云的sdk分为三个步骤:
1、创建 AcsClient 实例并初始化;AcsClient即请求rds的实例,包括accesskeyid、accesskeysecret和regionid。
2、创建 API 请求并设置参数;这里的参数是除了公共参数之外所需要的所有参数,在阿里云文档上查看:
https://help.aliyun.com/document_detail/26279.html?spm=5176.doc26224.6.868.xHBXXo

- 发起请求并打印返回。
完整代码如下(找一台同一区的ecs服务器执行就行):
cat sdk-rds.py
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkrds.request.v20140815.DescribeSlowLogRecordsRequest import DescribeSlowLogRecordsRequest
import datetime
client = AcsClient('xxxxxxxxxxxx', 'xxxxxxxxxxxx', 'cn-beijing')
request = DescribeSlowLogRecordsRequest()
request.set_accept_format('json')
st=(datetime.datetime.now()+datetime.timedelta(hours=-9)).strftime("%Y-%m-%dT%H:%MZ")
et=(datetime.datetime.now()+datetime.timedelta(hours=-8)).strftime("%Y-%m-%dT%H:%MZ")
#request.set_StartTime("2019-08-01T00:00Z")
#request.set_EndTime("2019-08-02T00:00Z")
request.set_DBInstanceId("rr-2zed5jh166a6up9m2")
request.set_StartTime(st)
request.set_EndTime(et)
response = client.do_action_with_exception(request)
print(response)
#注意下面三点:
- client 值需要阿里云根用户两个密钥和rds地域(accessKeyId,accessSecret, cn-beijing);
- request 值是众多日志中的慢日志(slow)接口,可在上面调用第二步官方文档里找到;
- 记录慢日志开始时间和结束时间不能大于一个月;
- rds默认慢日志开启为1秒。
执行结果如下:
[biu@kepler-op ~]$ sudo python sdk-rds.py
{"Items":{"SQLSlowRecord":[]},
"PageNumber":1,
"TotalRecordCount":0,
"DBInstanceId":"rr-'xxxxxxxxxxxx'",
"RequestId":"6D62679F-6D4B-4850-A46E-3BA72CE6E192",
"Engine":"MySQL",
"PageRecordCount":0}
下面只是把慢日志结果采集到服务器,下面还要再写一个python脚本传到钉钉报警:
cat rds-dingding.py
#!/usr/bin/python
#-*- coding: utf-8 -*
import urllib, urllib2, json
import sys, shutil, os, string, datetime,time
#serverip="192.168.135.141"
name="rdsslow.log"
#timenow=datetime.datetime.now().strftime('%Y%m%d')
#logname=name + timenow + ".log" #拼成的日志name
#print logname
#print name
def http_post( errmsg ):
url = "https://oapi.dingtalk.com/robot/send?access_token=af61284a55f8b490dea5728df0b31305239a1049b03363b66cd4ae45f8fad886"
values = {'msgtype': 'text'}
content = {}
content['content'] = serverip + errmsg
values['text'] = content
headers = {'Content-Type':'application/json;charset=UTF-8'}
jdata = json.dumps(values)
print jdata
req = urllib2.Request(url, jdata , headers)
response = urllib2.urlopen(req)
data = json.loads(response.read())
errcode = data['errcode']
print errcode
return errcode
#file = open('/Path/'+ logname)
file = open('/tmp/'+ name)
file.seek(0, os.SEEK_END)
while 1:
where = file.tell()
line = file.readline()
if not line:
time.sleep(1)
file.seek(where)
else:
print line,
http_post(line)
每分钟采集一次rds的慢日志:
[biu@kepler-op ~]$ cat rds-ding.sh
#!/bin/bash
python sdk-rds.py >>/tmp/rdsslow.log #注意这里一定是追加
下面是实际项目的定时任务:每两小时采集次:
[biu@kepler-op ~]$ crontab -l
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/a-ding.sh >/dev/null 2>&1
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/b-ding.sh >/dev/null 2>&1
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/c-ding.sh >/dev/null 2>&1
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/d-ding.sh >/dev/null 2>&1
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/e-ding.sh >/dev/null 2>&1
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/f-ding.sh >/dev/null 2>&1
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/g-ding.sh >/dev/null 2>&1
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/app-ding.sh >/dev/null 2>&1
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/small-ding.sh >/dev/null 2>&1
0 02,04,06,08,10,12,14,16,19,23 * * * /bin/bash ~/bigdata-ding.sh >/dev/null 2>&1
然后后台执行执行调用钉钉接口的脚本(nohup永久后台执行):
[biu@kepler-op ~]$ nohup python rds-dingding.py &
[1] 2263

等待一分钟钉钉就会收到传来的慢日志信息(从下面日志里看到这两天并没有执行过超过1秒的sql语句):

下面是生产记录案例:

返回参数:
TotalRecordCount Integer 总记录数
ParseRowCounts 解析行数
ExecutionStartTime 执行开始时间
RDS文档概述里面记录了所有定义参数的使用解释:
https://blog.csdn.net/hyzhou33550336/article/details/41620931
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)