首页 > 解决方案 > Cloudwatch 原始 json 到 python 中的 JSON 提取

问题描述

我正在尝试创建一个 python 脚本来描述所有 cloudwatch 警报并提取一些关键信息。我使用 boto3 来获得结果,但它是原始形式。如何将其格式化为 json 并仅提取所需的

import json

# Create CloudWatch client
cloudwatch = boto3.client('cloudwatch')

# List alarms of insufficient data through the pagination interface
paginator = cloudwatch.get_paginator('describe_alarms')
for response in paginator.paginate(StateValue='INSUFFICIENT_DATA'):
    print(response['MetricAlarms'])

请帮忙!

标签: pythonjsonamazon-web-services

解决方案


正如@jellycsc 所指出的,您可以简单地使用json.dumps()将返回JSON的内容转换为字典。但是要从返回的响应中提取字段,不确定为什么要将其转换为json然后提取字段。

describe_alarmscall 已经返回了一个字典列表,我们可以简单地使用并提取我们想要的任何字段,响应json.dumps是一个字符串。

#!/usr/bin/env python

import json
#!/usr/bin/env python

import json
import boto3
import datetime


def myconverter(o):
    if isinstance(o, datetime.datetime):
        return o.__str__()

# Create CloudWatch client
cloudwatch = boto3.client('cloudwatch')

# List alarms of insufficient data through the pagination interface
paginator = cloudwatch.get_paginator('describe_alarms')
for response in paginator.paginate(StateValue='ALARM'):
    metric_alarms = response.get('MetricAlarms')
    for metric_alarm in metric_alarms:
        print(metric_alarm.get('AlarmName'))
        # uncomment below if json objects are needed.
        # parsed_alarm_data = json.dumps(metric_alarm, default=myconverter)
        # print(type(parsed_alarm_data))
❯❯ python3 x.py
TargetTracking-table/mytable-AlarmLow-ab20db06-8e66-480c-9952-b9ed751c1003
TargetTracking-table/mytable2-AlarmLow-da22b0b5-987f-4d82-aa5a-0f2e83cc8abf

由于datetime度量数据中的对象不能直接序列化,

TypeError:日期时间类型的对象不是 JSON 可序列化的

所以只需要手动处理,所以额外的类,取决于你的要求,你可以随心所欲地处理。

json.dumps方法可以接受一个名为 default 的可选参数,该参数应该是一个函数。每次 JSON 尝试转换一个不知道如何转换的值时,它都会调用我们传递给它的函数。该函数将接收有问题的对象,并期望返回该对象的 JSON 表示。

我没有任何INSUFFICIENT_DATA状态警报,所以我使用了ALARM状态。


推荐阅读