集成Google Spaces与AWS CloudWatch后,如何优化告警消息展示格式?
解决Google Spaces中AWS告警JSON可读性差的问题
直接转CSV在聊天窗口里可读性其实并不理想,更推荐把JSON解析后格式化成结构化的易读文本,类似Slack的告警展示效果。以下是修改后的Lambda函数实现:
修改后的代码
from httplib2 import Http import json def lambda_handler(event, context): url = "<webhook-url>" # 1. 解析SNS中的JSON格式告警消息 try: sns_message = event["Records"][0]["Sns"]["Message"] alarm_data = json.loads(sns_message) except (KeyError, json.JSONDecodeError) as e: # 处理解析失败的情况,返回原始消息或错误提示 bot_message = {"text": f"告警解析失败: {str(e)}\n原始消息: {sns_message}"} message_headers = {"Content-Type": "application/json; charset=UTF-8"} http_obj = Http() response = http_obj.request( uri=url, method="POST", headers=message_headers, body=json.dumps(bot_message), ) return response # 2. 提取告警关键信息并格式化成易读文本 formatted_text = f""" **AWS CloudWatch 告警通知** --- 告警名称: **{alarm_data.get('AlarmName', '未知')}** 告警状态: **{alarm_data.get('NewStateValue', '未知')}** 状态变更时间: {alarm_data.get('StateChangeTime', '未知')} AWS区域: {alarm_data.get('Region', '未知')} 告警原因: {alarm_data.get('NewStateReason', '未知')} """ # 3. 发送格式化后的消息到Google Spaces bot_message = {"text": formatted_text.strip()} message_headers = {"Content-Type": "application/json; charset=UTF-8"} http_obj = Http() response = http_obj.request( uri=url, method="POST", headers=message_headers, body=json.dumps(bot_message), ) return response
关键修改说明
- JSON解析:用
json.loads()把SNS传递的JSON字符串转换成Python字典,方便提取字段。 - 结构化格式化:提取CloudWatch告警的核心字段(告警名、状态、时间、原因等),用Markdown加粗突出关键信息,换行分隔内容,让消息在Google Spaces里清晰易读。
- 异常处理:增加解析失败的容错逻辑,避免因消息格式异常导致Lambda函数报错,同时保留原始消息便于排查问题。
如果确实需要CSV格式(不推荐)
如果一定要转成CSV,可以在解析后把字段拼接成CSV字符串,比如:
# 构造CSV内容 csv_fields = ["AlarmName", "NewStateValue", "StateChangeTime", "Region", "NewStateReason"] csv_rows = [",".join(csv_fields)] csv_rows.append(",".join([str(alarm_data.get(field, "")) for field in csv_fields])) csv_text = "\n".join(csv_rows) bot_message = {"text": f"```\n{csv_text}\n```"} # 用代码块包裹CSV,避免格式混乱
但CSV在聊天窗口里的可读性远不如结构化文本,除非有后续自动处理的需求,否则不建议使用。
内容的提问来源于stack exchange,提问作者rovoda
相关产品推荐
相关产品推荐

