这是一个用于监控阿里云和华为云RDS实例慢SQL并通过企业微信发送告警的Python程序集合。
RDS_SlOW_SQL/
├── aliyun_rds/ # 阿里云RDS监控程序
│ ├── aliyun_rds_slow_sql_monitor.py
│ ├── config.ini
│ ├── requirements.txt
│ └── Dockerfile
├── huaweiyun_rds/ # 华为云RDS监控程序
│ ├── huawei_rds_slow_sql_monitor.py
│ ├── config.ini
│ ├── requirements.txt
│ └── Dockerfile
└── README.md
- 支持监控多个RDS实例
- 支持每个实例监控指定数据库或所有数据库
- 定期获取RDS实例的慢SQL日志(默认每分钟一次)
- 按实例和数据库分割生成告警
- 通过企业微信webhook以文件形式发送告警信息
- 支持自定义监控时间间隔
- 支持CST/UTC时区自动转换
- 支持Docker容器化部署
为什么采用文件下载方式获取慢日志?
虽然华为云和阿里云都提供了 DescribeSlowLogRecords(忘记了会不会截断,官文没写,阿里测试较少)、ListSlowlogForLts API 接口来直接查询慢日志记录,但是这些API接口存在一个共同的问题:

- SQL截断问题:当SQL语句过长时,API会自动截断SQL内容,导致返回的SQL显示不完整
- 影响排查:不完整的SQL语句会严重影响开发人员对慢查询问题的分析和优化
因此,采用了不同的技术方案:
- 阿里云:使用API方式,适合大部分场景的快速查询
- 华为云:采用下载完整日志文件的方式,确保SQL语句的完整性
这样既保证了监控的实时性,又确保了SQL内容的完整性,便于问题排查和性能优化。
- 进入阿里云监控目录
cd aliyun_rds- 安装依赖
pip install -r requirements.txt-
配置文件 编辑
config.ini文件,填入相关配置 -
运行程序
python aliyun_rds_slow_sql_monitor.py- 构建Docker镜像
cd aliyun_rds
docker build -t aliyun-rds-slow-sql-monitor .- 运行容器
# 使用配置文件挂载
docker run -d \
--name aliyun-rds-slow-sql-monitor \
-v $(pwd)/config.ini:/app/config.ini \
aliyun-rds-slow-sql-monitor- 进入华为云监控目录
cd huaweiyun_rds- 安装依赖
pip install -r requirements.txt-
配置文件 编辑
config.ini文件,填入相关配置 -
运行程序
python huawei_rds_slow_sql_monitor.py- 构建Docker镜像
cd huaweiyun_rds
docker build -t huawei-rds-monitor .- 运行容器
docker run -d \
--name huawei-rds-monitor \
-v $(pwd)/config.ini:/app/config.ini \
-v $(pwd)/logs:/app/logs \
-v $(pwd)/alerts:/app/alerts \
huawei-rds-monitor编辑 aliyun_rds/config.ini 文件:
[aliyun]
# 阿里云访问凭证
access_key_id = 您的阿里云AccessKey_ID
access_key_secret = 您的阿里云AccessKey_Secret
[instances]
# 要监控的实例ID列表,用逗号分隔
instance_list = rm-example001, rm-example002
# 每个实例的数据库配置
# 如果databases为空,则监控该实例下所有数据库
[rm-example001]
databases = db1, db2
[rm-example002]
databases =
[wechat]
# 企业微信机器人webhook地址
webhook_url = https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY
[monitor]
# 监控间隔时间(秒)
query_interval = 60编辑 huaweiyun_rds/config.ini 文件:
[huaweicloud]
# 华为云访问凭证
access_key_id = 您的Access_Key_ID
access_key_secret = 您的Secret_Access_Key
project_id = 您的Project_ID
# 区域,默认为cn-north-4
region = cn-north-4
[instances]
# 实例ID列表,用逗号分隔
instance_list = instance-example001, instance-example002
[wechat]
# 企业微信机器人webhook地址
webhook_url = https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY
[monitor]
# 监控间隔时间(秒)
query_interval = 60access_key_id: 阿里云账号的AccessKey IDaccess_key_secret: 阿里云账号的AccessKey Secret- 建议使用RAM子账号的AccessKey,并只授予RDS只读权限
access_key_id: 华为云账号的Access Key IDaccess_key_secret: 华为云账号的Secret Access Keyproject_id: 项目IDregion: 区域,默认为cn-north-4
instance_list: 要监控的RDS实例ID列表,多个实例用逗号分隔- 阿里云支持每个实例单独配置要监控的数据库列表
- 如果某个实例的
databases配置为空,则监控该实例的所有数据库
webhook_url: 企业微信机器人的Webhook地址- 在企业微信群中添加机器人后可获取
query_interval: 监控检查间隔时间,单位为秒
两个监控程序都会生成标准格式的告警文件:
- 阿里云:
慢查询sql文件_{实例ID}_{数据库名}_{时间戳}.txt - 华为云:
慢查询sql文件_{实例ID}_{时间戳}.txt
- 数据库实例ID
- 数据库名称(阿里云)
- 告警时间
- 慢SQL数量
阿里云包含:
- 执行时间(CST时区)
- 执行耗时(秒)
- 返回行数
- 解析行数
- 锁定时间(秒)
- 访问来源
- SQL哈希值
- SQL语句
华为云包含:
- 执行时间
- 数据库名称
- 用户来源
- 执行耗时(秒)
- 锁等待时间(秒)
- 返回行数
- 扫描行数
- 是否全表扫描
- 是否使用临时表
- 是否使用磁盘临时表
- SQL语句
程序运行时会输出以下类型的日志:
- INFO: 正常运行信息,包括启动、监控和告警发送状态
- ERROR: 错误信息,包括API调用失败、告警发送失败等
- DEBUG: 调试信息,包括详细的API返回结果(需要调整日志级别)
- 基于 Python 3.9 镜像构建
- 已配置好Asia/Shanghai时区
- 支持通过挂载配置文件进行配置
- 支持通过环境变量调整配置
# 停止容器
docker stop aliyun-rds-slow-sql-monitor
# 启动容器
docker start aliyun-rds-slow-sql-monitor
# 重启容器
docker restart aliyun-rds-slow-sql-monitor
# 查看日志
docker logs -f aliyun-rds-slow-sql-monitor
# 删除容器
docker rm -f aliyun-rds-slow-sql-monitor# 停止容器
docker stop huawei-rds-monitor
# 启动容器
docker start huawei-rds-monitor
# 重启容器
docker restart huawei-rds-monitor
# 查看日志
docker logs -f huawei-rds-monitor
# 删除容器
docker rm -f huawei-rds-monitor-
权限
- 确保云账号有RDS只读权限
- 建议使用RAM子账号并只授予必要权限
-
通用
- 确保config.ini文件的权限设置正确,防止敏感信息泄露
- 确保服务器可以访问对应云厂商的API
- 确保服务器可以访问企业微信API
- 华为云监控需要确保有足够的带宽下载日志文件
- 阿里云: 程序内部使用UTC时间与阿里云API交互,显示时会自动转换为CST
- 华为云: 使用Asia/Shanghai时区处理时间
- 程序会定期调用云厂商API,请注意API调用有频率限制
- 如监控多个实例,建议适当调整监控间隔时间
- 华为云监控会在本地保存日志文件,请确保有足够的磁盘空间
- 华为云: 程序会在本地保存最新的慢日志文件,会自动清理旧的日志文件
- 后端: Python 3.9+
- 依赖管理: requirements.txt
- 容器化: Docker
- 云厂商SDK:
- 阿里云: alibabacloud_rds20140815
- 华为云: huaweicloudsdkrds
- HTTP请求: requests
- 时区处理: zoneinfo
- 配置管理: configparser
- Python 3.9+
- Docker (可选)
- 对应云厂商的API访问权限
- 企业微信机器人权限

