WEBKT

告别熬夜!用 Python 自动化生成服务器监控报告,运维效率翻倍

26 0 0 0

1. 需求分析

2. 技术选型

3. 代码实现

3.1 安装依赖库

3.2 编写监控脚本

3.3 配置邮箱

3.4 运行脚本

4. 优化建议

5. 总结

6. 常见问题解答

作为一名资深运维工程师,我深知服务器监控的重要性。每天登录服务器,手动查看 CPU、内存、磁盘、网络等指标,不仅耗时费力,还容易遗漏关键信息。更痛苦的是,领导时不时要一份服务器运行状况报告,加班熬夜整理数据更是家常便饭。

为了摆脱这种苦逼的状况,我决定用 Python 写一个自动化脚本,定期生成服务器监控报告,并自动发送给相关人员。经过一段时间的摸索和实践,我终于成功地实现了这个目标。现在,我每天早上上班第一件事就是打开邮件,查看自动生成的服务器监控报告,服务器的运行状况一目了然,再也不用担心错过任何异常情况了。领导对我的工作效率也赞不绝口,升职加薪指日可待!

今天,我就将这个自动化脚本的实现过程分享给大家,希望能帮助大家摆脱繁琐的服务器监控工作,提高运维效率,早日实现升职加薪的梦想。

1. 需求分析

在编写脚本之前,我们需要明确以下需求:

  • 监控指标:CPU 使用率、内存使用率、磁盘空间、网络流量
  • 报告格式:包含指标的趋势图和统计数据
  • 报告发送:自动发送给指定邮箱
  • 定时执行:每天定时执行一次

2. 技术选型

  • 编程语言:Python
  • 监控工具:psutil
  • 绘图工具:matplotlib
  • 邮件发送:smtplib
  • 定时任务:schedule

3. 代码实现

3.1 安装依赖库

首先,我们需要安装所需的 Python 库:

pip install psutil matplotlib schedule

3.2 编写监控脚本

接下来,我们编写监控脚本 monitor.py

import psutil
import matplotlib.pyplot as plt
import datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import schedule
import time
# 配置信息
EMAIL_HOST = 'smtp.example.com' # SMTP 服务器地址
EMAIL_PORT = 587 # SMTP 端口
EMAIL_HOST_USER = 'your_email@example.com' # 发件人邮箱
EMAIL_HOST_PASSWORD = 'your_email_password' # 发件人邮箱密码
EMAIL_TO = ['recipient1@example.com', 'recipient2@example.com'] # 收件人邮箱列表
# 数据存储
cpu_usage_history = []
memory_usage_history = []
disk_usage_history = []
network_sent_history = []
network_received_history = []
timestamps = []
def get_cpu_usage():
return psutil.cpu_percent(interval=1)
def get_memory_usage():
return psutil.virtual_memory().percent
def get_disk_usage():
return psutil.disk_usage('/').percent
def get_network_usage():
net_io = psutil.net_io_counters()
return net_io.bytes_sent, net_io.bytes_recv
def collect_data():
cpu_usage = get_cpu_usage()
memory_usage = get_memory_usage()
disk_usage = get_disk_usage()
network_sent, network_received = get_network_usage()
timestamp = datetime.datetime.now()
cpu_usage_history.append(cpu_usage)
memory_usage_history.append(memory_usage)
disk_usage_history.append(disk_usage)
network_sent_history.append(network_sent)
network_received_history.append(network_received)
timestamps.append(timestamp)
print(f"{timestamp}: CPU={cpu_usage}%, Memory={memory_usage}%, Disk={disk_usage}%, Network Sent={network_sent}, Received={network_received}")
def generate_report():
# 创建图表
fig, axs = plt.subplots(2, 2, figsize=(16, 12))
# CPU 使用率
axs[0, 0].plot(timestamps, cpu_usage_history)
axs[0, 0].set_title('CPU Usage (%)')
axs[0, 0].set_xlabel('Time')
axs[0, 0].set_ylabel('Usage (%)')
axs[0, 0].tick_params(axis='x', rotation=45)
axs[0, 0].grid(True)
# 内存使用率
axs[0, 1].plot(timestamps, memory_usage_history)
axs[0, 1].set_title('Memory Usage (%)')
axs[0, 1].set_xlabel('Time')
axs[0, 1].set_ylabel('Usage (%)')
axs[0, 1].tick_params(axis='x', rotation=45)
axs[0, 1].grid(True)
# 磁盘使用率
axs[1, 0].plot(timestamps, disk_usage_history)
axs[1, 0].set_title('Disk Usage (%)')
axs[1, 0].set_xlabel('Time')
axs[1, 0].set_ylabel('Usage (%)')
axs[1, 0].tick_params(axis='x', rotation=45)
axs[1, 0].grid(True)
# 网络流量
axs[1, 1].plot(timestamps, network_sent_history, label='Sent')
axs[1, 1].plot(timestamps, network_received_history, label='Received')
axs[1, 1].set_title('Network Traffic (Bytes)')
axs[1, 1].set_xlabel('Time')
axs[1, 1].set_ylabel('Bytes')
axs[1, 1].tick_params(axis='x', rotation=45)
axs[1, 1].grid(True)
axs[1, 1].legend()
# 调整布局
plt.tight_layout()
# 保存图表
report_filename = 'server_report.png'
plt.savefig(report_filename)
plt.close(fig)
return report_filename
def send_email_report(report_filename):
msg = MIMEMultipart()
msg['From'] = EMAIL_HOST_USER
msg['To'] = ', '.join(EMAIL_TO)
msg['Subject'] = '服务器监控报告'
text = """尊敬的运维团队:
附件是服务器监控报告,请查阅。
祝您工作顺利!
"""
msg.attach(MIMEText(text, 'plain'))
with open(report_filename, 'rb') as f:
img_data = f.read()
from email.mime.image import MIMEImage
image = MIMEImage(img_data, name=report_filename)
msg.attach(image)
try:
server = smtplib.SMTP(EMAIL_HOST, EMAIL_PORT)
server.starttls()
server.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
server.sendmail(EMAIL_HOST_USER, EMAIL_TO, msg.as_string())
print('邮件发送成功')
except Exception as e:
print(f'邮件发送失败: {e}')
finally:
server.quit()
def job():
print('开始收集数据...')
collect_data()
print('数据收集完成.')
print('开始生成报告...')
report_file = generate_report()
print('报告生成完成.')
print('开始发送邮件...')
send_email_report(report_file)
print('邮件发送完成.')
# 每天早上 8 点执行任务
schedule.every().day.at("08:00").do(job)
while True:
schedule.run_pending()
time.sleep(60) # 每分钟检查一次是否有任务需要执行

代码解释:

  1. 导入所需库psutil 用于获取系统信息,matplotlib 用于绘制图表,smtplib 用于发送邮件,schedule 用于定时执行任务。
  2. 配置信息:需要配置 SMTP 服务器地址、端口、发件人邮箱、密码、收件人邮箱等信息。
  3. 数据存储:使用列表存储 CPU、内存、磁盘、网络等指标的历史数据。
  4. get_cpu_usage()get_memory_usage()get_disk_usage()get_network_usage():分别用于获取 CPU 使用率、内存使用率、磁盘空间、网络流量。
  5. collect_data():用于收集各项指标数据,并将数据存储到列表中。
  6. generate_report():用于生成监控报告,包括 CPU、内存、磁盘、网络等指标的趋势图,并将图表保存为 server_report.png 文件。
  7. send_email_report():用于发送邮件报告,将 server_report.png 文件作为附件发送给指定邮箱。
  8. job():定义一个任务,包括收集数据、生成报告、发送邮件。
  9. schedule.every().day.at("08:00").do(job):设置每天早上 8 点执行 job() 任务。
  10. while True:循环执行 schedule.run_pending(),用于检查是否有任务需要执行。

3.3 配置邮箱

在使用脚本之前,需要在邮箱中开启 SMTP 服务,并获取授权码。不同邮箱的开启方式可能有所不同,请参考相关文档。

注意: 为了安全起见,建议使用专门用于发送邮件的邮箱,并设置独立密码。

3.4 运行脚本

将脚本保存为 monitor.py 文件,并在终端中运行:

python monitor.py

脚本会每分钟检查一次是否有任务需要执行,当时间到达早上 8 点时,会自动执行 job() 任务,收集数据、生成报告、发送邮件。

4. 优化建议

  • 数据持久化:可以将监控数据存储到数据库中,方便后续分析和查询。
  • 告警功能:可以设置告警阈值,当指标超过阈值时,自动发送告警邮件或短信。
  • 更丰富的监控指标:可以添加更多监控指标,例如进程状态、TCP 连接数等。
  • Web 界面:可以将监控报告展示在 Web 界面上,方便用户查看。
  • 日志记录:添加日志记录功能,方便排查问题。
  • 异常处理:增加异常处理,例如网络连接失败、邮箱发送失败等。

5. 总结

通过编写 Python 脚本,我们可以自动化生成服务器监控报告,极大地提高了运维效率。当然,这只是一个简单的示例,大家可以根据自己的需求进行扩展和优化。

希望这篇文章能帮助大家摆脱繁琐的服务器监控工作,提高运维效率,早日实现升职加薪的梦想!

6. 常见问题解答

  • Q:为什么我收不到邮件?
    • A:请检查邮箱配置是否正确,包括 SMTP 服务器地址、端口、发件人邮箱、密码、收件人邮箱等。另外,请确保邮箱已开启 SMTP 服务,并获取授权码。同时检查邮件是否被拦截到垃圾箱。
  • Q:为什么我的图表显示不出来中文?
    • A:需要在代码中设置字体,例如:plt.rcParams['font.sans-serif']=['SimHei']
  • Q:为什么我的脚本运行报错?
    • A:请检查是否安装了所需的 Python 库,例如 psutilmatplotlibschedule。另外,请仔细阅读报错信息,根据提示进行排查。
  • Q:如何修改定时执行的时间?
    • A:修改 schedule.every().day.at("08:00").do(job) 中的时间即可,例如修改为 schedule.every().day.at("10:00").do(job) 表示每天早上 10 点执行。
  • Q:如何添加更多的监控指标?
    • A:可以参考 psutil 库的文档,获取更多的系统信息,例如进程状态、TCP 连接数等。然后,将这些信息添加到 collect_data() 函数中,并在 generate_report() 函数中绘制相应的图表。

最后,祝大家使用愉快!如果在使用过程中遇到任何问题,欢迎留言交流。

效率工具人 服务器监控Python自动化运维脚本

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/9989