需求:通过阿里云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

  1. 发起请求并打印返回。

 

完整代码如下(找一台同一区的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) 

 

#注意下面三点:

  1. client 值需要阿里云根用户两个密钥和rds地域(accessKeyId,accessSecret, cn-beijing);
  2. request 值是众多日志中的慢日志(slow)接口,可在上面调用第二步官方文档里找到;
  3. 记录慢日志开始时间和结束时间不能大于一个月;
  4. 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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐