1、需求说明
因业务发展需要,需要将aws rds的慢查询日志统计出来,发送给开发来处理
2、rds慢查询设置
在aws的rds中开启慢查询,并且能够直接在提控制台Cloudwatch里查询,需要配置rds的配置文件如下:
slow_query_log:1
general_log:1
long_query_time:1
log_output option:FILE
3、安装awslogs
因为aws自带的工具要做到实时告警比较复杂,所以我们采用开源的方案awslogs来处理
安装awslogs
pip install awslogs
4、配置aws权限
awslogs运行权限包含在CloudWatchLogsReadOnlyAccess AWS 托管权限中,具体如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:Describe*",
"logs:Get*",
"logs:List*",
"logs:StartQuery",
"logs:StopQuery",
"logs:TestMetricFilter",
"logs:FilterLogEvents"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
5、python任务
创建一个python任务,来执行获取clouwatch里面的rds慢查询,代码如下:
import os
import json
import requests
db = ""
sql = ""
time = ""
# 每分钟获取一次cloudwatch中rds慢查询的日志
os.system("/usr/local/bin/awslogs get /aws/rds/instance/xxxx/slowquery --start='1min ago' > /tmp/mysql-slowlog.txt")
with open("/tmp/mysql-slowlog.txt") as f:
f = f.readlines()
for line in f:
if line.startswith("/aws/rds"):
db=line.split("/")[4]
if line.startswith("# Query_time"):
time=line.split(" ")[2]
if line.startswith("select"):
sql=line
content="告警环境: Prod\n告警团队: DBA\n告警DB: " + db + "\n查询耗时: " + time + "\n告警SQL: \n" + sql
payload={"channel": "#mysql-slowlog", "username": "webhookbot", "text": content}
data = json.dumps(payload).encode("utf8")
url="你的slack webhook地址"
response = requests.post(url=url,data=data)
print(response)
6、创建定时任务
# 每分钟执行一次获取rds慢查询
*1 * * * * python3 /script/mysql_slowlog_alert.py > /dev/null 2>&1
评论区