通过python脚本获取阿里云rds慢请求日志并发送到指定邮件

干货脚本如下

import os
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.auth.credentials import AccessKeyCredential
from openpyxl import Workbook
from openpyxl.styles import Alignment
from datetime import datetime, timedelta
from pytz import timezone
import smtplib
import email.mime.multipart
import email.mime.text
import email.mime.imageclass QuerySlowLogsExporter:def __init__(self, access_key_id, access_key_secret, region_id='cn-xxxx', mysql_ids=None):self.access_key_id = access_key_idself.access_key_secret = access_key_secretself.region_id = region_idself.mysql_ids = mysql_ids if mysql_ids else []self.client = self.create_client()def create_client(self):# 创建AcsClient实例credentials = AccessKeyCredential(self.access_key_id, self.access_key_secret)return AcsClient(region_id=self.region_id, credential=credentials)def send_email(self, to_emails, subject, body, attachment_paths):# 设置发件人信息from_address = "xxx@xxx.cn"cc_addresses = ["xxx@xxx.cn"]# 设置邮件服务器信息mail_host = "smtp.feishu.cn"mail_user = "xxx@xxx.cn"mail_pass = "xxxx"ssl_port = "465"# 创建邮件主体main_msg = email.mime.multipart.MIMEMultipart('related')content = email.mime.text.MIMEText(body)main_msg.attach(content)# 添加附件for attachment_path in attachment_paths:with open(attachment_path, 'rb') as f:att = email.mime.text.MIMEText(f.read(), 'base64', 'utf-8')att["Content-Type"] = 'application/octet-stream'att["Content-Disposition"] = 'attachment; filename=' + os.path.basename(attachment_path)main_msg.attach(att)# 设置邮件头部信息main_msg['From'] = from_addressmain_msg['To'] = ','.join(to_emails)main_msg['Cc'] = ','.join(cc_addresses)main_msg['Subject'] = subjectfull_text = main_msg.as_string()try:# 连接邮件服务器并发送邮件smtp_obj = smtplib.SMTP_SSL(mail_host, ssl_port)smtp_obj.ehlo()smtp_obj.login(mail_user, mail_pass)smtp_obj.sendmail(from_address, to_emails + cc_addresses, full_text)except Exception as e:print("邮件发送失败:", e)finally:smtp_obj.quit()def get_time_range(self):# 获取最近7天的时间current_time = datetime.now(timezone('UTC'))seven_days_ago = current_time - timedelta(days=7)time_format = "%Y-%m-%dT%H:%MZ"last_week_time = seven_days_ago.strftime(time_format)today_time = current_time.strftime(time_format)# 生成日志文件名log_file_name = "saas3_time_log-" + current_time.strftime("%Y-%m-%d") + ".xlsx"# 检查目录是否存在,不存在则创建xls_dir = './xlsl'if not os.path.exists(xls_dir):os.makedirs(xls_dir)return last_week_time, today_time, os.path.join(xls_dir, log_file_name)def export_query_slow_logs(self, start_time, end_time, sql_hash, db_name="", page_size=30):all_logs = []for mysql_id in self.mysql_ids:# 查询慢日志request = CommonRequest()request.set_accept_format('json')request.set_domain('rds.aliyuncs.com')request.set_method('POST')request.set_protocol_type('https')  # https | httprequest.set_version('2014-08-15')request.set_action_name('DescribeSlowLogRecords')request.add_query_param('StartTime', start_time)request.add_query_param('EndTime', end_time)request.add_query_param('DBInstanceId', mysql_id)request.add_query_param('SQLHASH', sql_hash)request.add_query_param('DBName', db_name)request.add_query_param('PageSize', str(page_size))response = self.client.do_action(request)response_data = str(response, encoding='utf-8')parsed_response = json.loads(response_data)all_logs.extend(parsed_response["Items"]["SQLSlowRecord"])return all_logsdef write_to_excel(self, logs, file_path):# 根据 QueryTimeMS 排序sorted_logs = sorted(logs, key=lambda x: x["QueryTimeMS"], reverse=True)# 写入Excelworkbook = Workbook()worksheet = workbook.activeworksheet.title = "最近一周慢日志明细"headers = ["QueryTimes", "ExecutionStartTime", "ReturnRowCounts", "DBName", "ParseRowCounts", "HostAddress", "QueryTimeMS", "SQLText"]for col_idx, header in enumerate(headers):worksheet.cell(row=1, column=col_idx + 1, value=header)worksheet.cell(row=1, column=col_idx + 1).alignment = Alignment(horizontal="center", vertical="center")row_idx = 2for log_entry in sorted_logs:worksheet.cell(row=row_idx, column=1, value=log_entry["QueryTimes"])worksheet.cell(row=row_idx, column=2, value=log_entry["ExecutionStartTime"])worksheet.cell(row=row_idx, column=3, value=log_entry["ReturnRowCounts"])worksheet.cell(row=row_idx, column=4, value=log_entry["DBName"])worksheet.cell(row=row_idx, column=5, value=log_entry["ParseRowCounts"])worksheet.cell(row=row_idx, column=6, value=log_entry["HostAddress"])worksheet.cell(row=row_idx, column=7, value=log_entry["QueryTimeMS"])worksheet.cell(row=row_idx, column=8, value=log_entry["SQLText"])row_idx += 1workbook.save(file_path)if __name__ == "__main__":access_key_id = "xxxxx"access_key_secret = "xxxxxxxx"mysql_ids = ["pgm-xxxxxx", "pgr-xxxxxx"]exporter = QuerySlowLogsExporter(access_key_id, access_key_secret, mysql_ids=mysql_ids)last_week_time, today_time, log_file_name = exporter.get_time_range()all_logs = exporter.export_query_slow_logs(last_week_time, today_time, "U2FsdGVk****")exporter.write_to_excel(all_logs, log_file_name)to_mails = ["xxxx@xxxx.com", "xxxx@xxx.com"]subject = "xxx慢日志通知"body = "xxxx慢日志通知"attachment_paths = [log_file_name]exporter.send_email(to_mails, subject, body, attachment_paths)

在这个脚本中

  1. 通过sdk获取阿里云的rds慢日志
  2. 把慢日志通过xlsl表格存储到本地
  3. 通过邮箱发送给相关的人员

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过红黑树封装 map 和 set 容器

一、红黑树的迭代器 红黑树的遍历默认为中序遍历 —— key 从小到大,因此 begin() 应该获取到红黑树的最左节点 —— 最小,end() 获取到红黑树最右节点的下一个位置, operator() 也应保证红黑树的遍历为中序的状态。 首先对红黑树节点进行改造…

骨传导耳机怎么选?五款高分热销榜骨传导耳机单品推荐!

骨传导耳机哪个牌子好?作为资深数码博主,许多朋友都希望我能够分享一些关于骨传导耳机的选购技巧。随着时间的发展,市面上的骨传导耳机种类日渐繁多,其中品牌的专业实力参差不齐,产品质量也千差万别。一些黑心商家为了…

家装空间3D建模素材:打造理想家园的必备工具

在家装过程中,设计师和业主往往需要通过3D建模技术来实现对空间的精确规划和设计。3D建模素材作为这一领域的基础元素,为设计师提供了丰富的想象空间,帮助他们更好地呈现业主的期望和需求。 这些3D建模素材可以涵盖各种家装元素,如…

新疆维吾尔自治区工程系列生态环境保护专业职称评审条件

新疆维吾尔自治区工程系列生态环境保护专业职称评审条件链接关于印发《新疆维吾尔自治区工程系列生态环境保护专业技术职务任职资格评审条件(试行)》的通知_政策文件_新疆维吾尔自治区人力资源和社会保障厅类别基本条件业绩成果备注工程师1.具备硕士学位…

roofline model加速模型部署最后一公里

文章目录 模型部署教程来啦:)什么是Roofline Model?算法模型相关指标计算量计算峰值参数量访存量带宽计算密度kernel size对计算密度的影响output size对计算密度的影响channel size对计算密度的影响group convolution对计算密度的影响tensor reshape对计算密度的影…

linux 性能监控命令之dstat

1. dstat 系统默认为安装,直接安装阿里源后,yum install -y dstat安装即可,该命令整合了 vmstat , iostat 和 ifstat,我们先看下效果: 我们先看看具体参数: [rootk8s-master ~]# dstat --help …

Python AI库pandas读写数据库的应用操作——以sqlite3为例

Python AI库pandas读写数据库的应用操作——以sqlite3为例 本文默认读者具备以下技能: 熟悉python基础知识,vscode或其它编辑工具 已阅读Pandas基础操作文章,了解pandas常见操作 具备自主扩展学习能力 在数据分析和人工智能领域,pandas库和s…

怎么批量修改图片的大小?分享几个方法

现在不管是在自媒体还是在各种社交媒体平台中,我们都会用到大量的图片,有时候会发现图片尺寸过大,对上传或者储存带来了不小的困难,在这种情况下,调整图片尺寸显得格外重要,通过修改图片尺寸,我…

# 从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(2)

从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(2) 一、sentinel:通用资源保护 1、Rest 实现熔断 Spring Cloud Alibaba Sentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护, 在构造 RestTemplate…

[华为OD]C卷 BFS 亲子游戏 200

题目: 宝宝和妈妈参加亲子游戏,在一个二维矩阵(N*N)的格子地图上,宝宝和妈妈抽签决定各自 的位置,地图上每个格子有不同的Q糖果数量,部分格子有障碍物。 游戏规则Q是妈妈必须在最短的时间&a…

预兼容性EMC测试基础

介绍――预兼容性EMC测试的重要意义 在产品开发过程中,您最想做的是对器件进行测试,验证其是否正常工作。所有电子器件都必须在经过认证的内部测试中心内成功通过电磁兼容性EMI测试。通过 EMI测试即表明您的器件的 EMI 发射性能达到允许水平,…

Hive UDTF之explode函数、Lateral View侧视图

Hive UDTF之explode函数 Hive 中的 explode() 函数是一种用于处理数组类型数据的 User-Defined Table-Generating Function (UDTF)。它将数组拆分成多行,每个数组元素对应生成的一行数据。这在处理嵌套数据结构时非常有用,例如处理 JSON 格式的数据。 …

详细介绍一下PointPillars算法的网络结构

PointPillars是一种用于3D目标检测的算法,它主要使用了点云数据和深度学习模型。 PointPillars算法的网络结构主要可以分为三个主要阶段: Pillar Feature Net(点云特征处理网络):此阶段的主要任务是将输入的点云数据转…

怎样单独提取PDF文件中的一个或几个文件?分割PDF文件的方法

在现代数字化时代,PDF文件已成为我们日常生活和工作中不可或缺的一部分。 一,首先了解什么是PDF? PDF,即“Portable Document Format”,意为“便携式文档格式”,由Adobe Systems开发。由于其跨平台、不易…

探秘Appium:Capability 进阶技巧揭秘!

简介 Appium 的除了基础的 Capability 设置,还提供了许多辅助配置项,用于优化自动化测试。这些配置项旨在执行基础配置之外的附加操作。例如:指定设备别名、设备 ID 或是设置超时时间等,虽然这些不是必需的选项,但是为…

【Linux系统编程】第十五弹---调试器gdb使用

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、背景 2、安装gdb 3、gdb的使用 总结 1、背景 前面我们学习了文件编辑器,项目自动化构建工具,以及g…

目标检测算法YOLOv6简介

YOLOv6由Chuyi Li等人于2022年提出,论文名为:《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》,论文见:https://arxiv.org/pdf/2209.02976 ,项目网页:https://github.c…

Python程序设计 函数(三)

练习十一 函数 第1关: 一元二次方程的根 定义一个函数qg,输入一元二次方程的系数a,b,c 当判别式大于0,返回1和两个根 当判别式等于0,返回0和两个根 当判别式小于0,访问-1和两个根 在主程序中,根据函数返回…

js逆向之websocket返回数据-xx医药

提示!本文章仅供学习交流,严禁用于任何商业和非法用途,未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,如有侵权,可联系本文作者删除! 网站链接:aHR0cDovL2p4eXljZy5jbi92aWV3LTczZDQxM2I0NDZhYzRiNDM5YTVlN2YwYTM4Z…

大模型微调之 在亚马逊AWS上实战LlaMA案例(三)

大模型微调之 在亚马逊AWS上实战LlaMA案例(三) 使用 QLoRA 增强语言模型:Amazon SageMaker 上 LLaMA 2 的高效微调 语言模型在自然语言处理任务中发挥着关键作用,但训练和微调大型模型可能会占用大量内存且耗时。在本文中&…