【问题标题】:Clouldwatch client of boto3 moduleboto3模块的Cloudwatch客户端
【发布时间】:2020-03-13 18:34:59
【问题描述】:
import boto3
from datetime import timedelta
from datetime import datetime

def lambda_handler(event, context):
    # TODO implement
    region = 'us-east-1'
    cwWindow = 60
    cloudwatch = boto3.client('cloudwatch', region_name='us-east-1')

# List metrics through the pagination interface
    response = cloudwatch.get_metric_statistics(
    Namespace='AWS/EC2',
    MetricName='CPUUtilization',
    Dimensions=[
        {
            'Name': 'InstanceId',
            'Value': 'i-09deabee19c5fc46d'
        },
    ],
    StartTime=datetime.utcnow() - timedelta(minutes = 60),
    EndTime=datetime.utcnow(),
    Period=300,
    Statistics=['Average', 'Maximum'],
    Unit='Percent'
)

    return response

我们已经编写了函数来获取我的 ec2 实例的 CPUUtilization 指标,但出现以下错误“datetime.datetime(2020, 3, 11, 12, 3, tzinfo=tzlocal()) is not JSON serializable ":

Response
{
    "errorType": "TypeError",
    "errorMessage": "datetime.datetime(2020, 3, 11, 12, 3, tzinfo=tzlocal()) is not JSON serializable",
    "stackTrace": [
        "  File \"/var/lang/lib/python3.6/json/__init__.py\", line 238, in dumps\n    **kw).encode(obj)\n",
        "  File \"/var/lang/lib/python3.6/json/encoder.py\", line 199, in encode\n    chunks = self.iterencode(o, _one_shot=True)\n",
        "  File \"/var/lang/lib/python3.6/json/encoder.py\", line 257, in iterencode\n    return _iterencode(o, 0)\n",
        "  File \"/var/runtime/awslambda/bootstrap.py\", line 149, in decimal_serializer\n    raise TypeError(repr(o) + \" is not JSON serializable\")\n"
    ]
}

Function Logs
An error occurred during JSON serialization of response: datetime.datetime(2020, 3, 11, 12, 3, tzinfo=tzlocal()) is not JSON serializable
Traceback (most recent call last):
  File "/var/lang/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/var/lang/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/var/lang/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/var/runtime/awslambda/bootstrap.py", line 149, in decimal_serializer
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: datetime.datetime(2020, 3, 11, 12, 3, tzinfo=tzlocal()) is not JSON serializable

Request ID
057aa5a4-74f6-1881-a024-74f6c2134125

我们使用与 boto3 文档中所述相同的格式,但仍然出现错误。如果有人有boto3的cloudwatch客户端经验。需要帮助。

【问题讨论】:

  • 无法重现该问题。你用的是什么python版本?
  • 我使用的是 python 3.6。你用过boto3模块的cloudwatch客户端吗?
  • 是的。但现在我刚刚用我的实例检查了你的代码。没有发现问题。
  • 它是否提供数据点?你能发布你的代码和回复吗?您使用的是哪个 IDE?我正在尝试使用 cloud9。
  • 是的。这是一个示例输出:pastebin.com/raw/DsQv6eJ0

标签: python amazon-web-services datetime boto3 amazon-cloudwatch-metrics


【解决方案1】:

您的 sn-p 有效。我只是将其更改为我的实例 ID。示例输出如下。

{
   "Label":"CPUUtilization",
   "Datapoints":[
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         6,
         2,
         "tzinfo=tzutc())",
         "Average":0.06612021857923481,
         "Maximum":0.166666666666666,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         32,
         "tzinfo=tzutc())",
         "Average":0.112052730696798,
         "Maximum":0.169491525423728,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         6,
         7,
         "tzinfo=tzutc())",
         "Average":0.0672316384180794,
         "Maximum":0.169491525423731,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         37,
         "tzinfo=tzutc())",
         "Average":0.06668519033064779,
         "Maximum":0.169491525423728,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         6,
         12,
         "tzinfo=tzutc())",
         "Average":0.06559139784946219,
         "Maximum":0.166666666666666,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         42,
         "tzinfo=tzutc())",
         "Average":0.06612021857923481,
         "Maximum":0.166666666666666,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         47,
         "tzinfo=tzutc())",
         "Average":0.09890710382513698,
         "Maximum":0.166666666666666,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         52,
         "tzinfo=tzutc())",
         "Average":0.0344827586206896,
         "Maximum":0.172413793103448,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         57,
         "tzinfo=tzutc())",
         "Average":0.1328054089098826,
         "Maximum":0.169491525423728,
         "Unit":"Percent"
      }
   ],
   "ResponseMetadata":{
      "RequestId":"f69967e9-be32-49eb-8442-f06000e7e842",
      "HTTPStatusCode":200,
      "HTTPHeaders":{
         "x-amzn-requestid":"f69967e9-be32-49eb-8442-f06000e7e842",
         "content-type":"text/xml",
         "content-length":"2185",
         "vary":"accept-encoding",
         "date":"Thu, 12 Mar 2020 06:19:39 GMT"
      },
      "RetryAttempts":0
   }
}

我的代码:

import boto3
from datetime import timedelta
from datetime import datetime

dev = boto3.session.Session(profile_name='la')

cloudwatch = dev.client('cloudwatch', region_name='us-east-1')


response = cloudwatch.get_metric_statistics(
    Namespace='AWS/EC2',
    MetricName='CPUUtilization',
    Dimensions=[
        {
            'Name': 'InstanceId',
            'Value': 'i-0b2762b6610c73e02'
        },
    ],
    StartTime=datetime.utcnow() - timedelta(minutes = 60),
    EndTime=datetime.utcnow(),
    Period=300,
    Statistics=['Average', 'Maximum'],
    Unit='Percent'
)

print(response)

【讨论】:

  • 你能发布代码吗?因为我没有得到我正在使用的上述代码的输出。
  • @papali 我添加了代码。我需要为自己使用自定义会话,但调用 get_metric_statistics 是一样的。
  • 是因为我正在使用我的 Office 网络来访问我的 Lambda 函数吗?您为什么要为自己使用自定义会话?
  • @papali 我不知道,但您对get_metric_statistics 的调用是正确的。一定是发生了其他事情。
  • 每当我给出 timedelta(minute = 2) 时,数据点就会出现 []。但是,如果给出 timedelta(minute = 60),则会抛出上述错误。
【解决方案2】:

问题不在您的 boto 代码中,而在于您正在从 lambda 返回响应。响应不可序列化。

为什么需要 lambda 来返回响应?让 lambda 做它需要做的事情并返回“OK”或类似的东西。

【讨论】:

  • 你能解释一下你所说的吗?实际上,我们想要构建一个仪表板应用程序,它将具有:- 按成本中心的成本每月趋势(最多 1 年)。按使用类型 - EC2、S3、RDS 等的成本每月趋势(最多 1 年)。通常有大约 20 多种使用类型。按成本中心按使用类型划分的当月截至日期的消耗。预计当月使用率相同。将其与上个月的值进行比较。能够深入了解服务器级别的信息。
  • 也许看看 GetMetricWidgetImage API。您可以直接从 CloudWatch 获取图表,而不是获取数据,并且您自己绘制图表。
猜你喜欢
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2020-10-06
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多