You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:20:22