阿里云监控系统告警数据分析与报告生成脚本
脚本概述
这是一个用于分析阿里云监控系统告警数据并生成可视化报告的Python脚本。它能够自动获取最近7天的告警信息,进行数据分析,生成统计图表,并将报告发送到指定的钉钉群组。
个人博客
个人博客直达地址
网站不断完善中里面拥有大量的脚本,并且源码完全开放 欢迎纯白嫖。
效果图


主要功能
- 数据获取:通过阿里云CMS API获取最近7天的告警数据。
- 数据分析:对获取的告警数据进行统计和分析。
- 可视化:使用matplotlib和seaborn生成多种统计图表。
- 报告生成:创建包含统计摘要和可视化图表的综合报告。
- OSS上传:将生成的报告图片上传到阿里云OSS存储。
- 消息推送:通过钉钉机器人将报告发送到指定群组。
详细功能说明
1. 数据获取
- 使用
create_client()函数创建阿里云CMS客户端。 - 通过
describe_alert_history_list_with_options()函数获取告警历史数据。
2. 数据分析
- 处理获取的告警数据,提取关键信息如实例名称、指标名称、告警级别等。
- 使用pandas进行数据处理和统计分析。
3. 可视化
generate_report()函数生成多个统计图表:
- Top 5 报警次数最多的实例
- Top 5 实例的平均响应时间
- Top 5 实例的最常见报警规则
- Top 5 报警规则的报警次数
- Top 5 报警规则的平均报警值
- 报警等级分布
4. 报告生成
generate_summary_report()函数生成包含实例报警汇总的文字报告。- 将统计图表和摘要报告整合为一个完整的报告。
5. OSS上传
- 使用
upload_image()函数将生成的报告图片上传到阿里云OSS。
6. 消息推送
send_to_webhook()函数将报告通过钉钉机器人发送到指定群组。
使用说明
- 确保已安装所有必要的Python库:alibabacloud_cms20190101, pandas, matplotlib, seaborn, oss2。
- 配置环境变量:
ALIBABA_CLOUD_ACCESS_KEY_ID:阿里云AccessKey IDALIBABA_CLOUD_ACCESS_KEY_SECRET:阿里云AccessKey SecretOSS_ACCESS_KEY_ID:阿里云OSS的AccessKey IDOSS_ACCESS_KEY_SECRET:阿里云OSS的AccessKey Secret
- 修改脚本中的以下参数:
- OSS的bucket名称和endpoint
- 钉钉机器人的webhook URL
- 运行脚本:
python script_name.py
注意事项
- API访问限制:注意阿里云API的访问频率限制,避免频繁调用导致被限制。
- 数据安全:脚本处理敏感的监控数据,确保运行环境的安全性。
- 依赖管理:确保所有依赖库的版本兼容,建议使用虚拟环境。
- 错误处理:脚本包含基本的错误处理,但在生产环境中可能需要更健壮的错误处理机制。
- 定制化:根据实际需求,可能需要调整图表样式、报告内容等。
- 资源消耗:生成大量图表可能消耗较多CPU和内存,注意监控资源使用。
- 字体配置:确保系统中安装了指定的中文字体(wqy-zenhei),否则可能导致中文显示问题。
- OSS配置:确保OSS配置正确,包括访问权限和存储策略。
- 钉钉限制:注意钉钉机器人的消息发送频率和大小限制。
代码结构
脚本主要包含以下几个关键方法:
create_client(): 创建阿里云CMS客户端generate_time_range(): 生成查询时间范围upload_image(): 上传图片到OSSsend_to_webhook(): 发送报告到钉钉generate_report(): 生成可视化报告generate_summary_report(): 生成摘要报告
#!/usr/bin/python3
from datetime import datetime
import time
import os
import json
import requests
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from alibabacloud_cms20190101.client import Client as Cms20190101Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_cms20190101 import models as cms_20190101_models
from alibabacloud_tea_util import models as util_models
from io import BytesIO
from typing import List
from matplotlib.font_manager import FontProperties
import oss2
# 设置字体路径
font_path = "/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc"
font_prop = FontProperties(fname=font_path)
plt.rcParams['font.family'] = font_prop.get_name()
plt.rcParams.update({
'font.size': 14})
class Sample:
@staticmethod
def create_client() -> Cms20190101Client:
config = open_api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], # 脱敏
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'] # 脱敏
)
config.endpoint = f'metrics.cn-hongkong.aliyuncs.com'
return Cms20190101Client(config)
@staticmethod
def generate_time_range() -> (int, int):
end_time = int(time.time() * 1000)
start_time = end_time - 7 * 24 * 60 * 60 * 1000
print(f"生成时间范围: {
start_time} - {
end_time}")
return start_time, end_time
@staticmethod
def save_image(buffer) -> str:
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
file_path = f'/opt/image/报警历史汇总_{
timestamp}.png'
with open(file_path, 'wb') as f:
f.write(buffer.getvalue())
return file_path
@staticmethod
def upload_image(image_buffer, bucket_name):
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
object_name = f'阿里云_{
timestamp}.png'
auth = oss2.Auth(os.getenv('OSS_ACCESS_KEY_ID'), os.getenv('OSS_ACCESS_KEY_SECRET')) # 脱敏
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', bucket_name)
bucket.put_object(object_name, image_buffer)
print(f"文件上传成功: {
object_name}")
return object_name
@staticmethod
def send_to_webhook(image_url:

最低0.47元/天 解锁文章
2075

被折叠的 条评论
为什么被折叠?



