【问题标题】:How to use aws cloudwatch get-metric-widget-image?如何使用 aws cloudwatch get-metric-widget-image?
【发布时间】:2019-04-22 13:28:24
【问题描述】:

我想自动获取 Cloudwatch 屏幕截图,因为我有很多实例。

但是当我尝试通过 aws cli 命令工具运行 get-metric-widget-image 时,总是会出错。

调用 GetMetricWidgetImage 操作时发生错误(ValidationError):MetricWidget 属性“metricWidget”的 JSON 内容错误。

有没有人可以帮帮我?谢谢。

我无法从 aws 文档中找到示例。以下链接中没有确切的示例。 https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/CloudWatch-Metric-Widget-Structure.html

我的命令是这样的。

aws cloudwatch get-metric-widget-image  --metric-widget "{ "width":600,"height":395,"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-01234567890123456",{"stat":"Average"}]],"period":300,"start":"-P30D","end":"PT0H","stacked":false,"yAxis":{"left":{"min":0.1,"max":1},"right":{"min":0}},"title":"CPU","annotations":{"horizontal":[{"color":"#ff6961","label":"Troublethresholdstart","fill":"above","value":0.5}], "vertical":[{"visible":true, "color":"#9467bd","label":"Bugfixdeployed","value":"2018-11-19T07:25:26Z","fill":"after"}]}}}" --output-format "png" 

【问题讨论】:

    标签: amazon-web-services amazon-cloudwatch


    【解决方案1】:

    为您的请求获取正确 json 的最佳方法是使用 CloudWatch 控制台构建图表,然后单击 Source 选项卡,选择 Image API 视图并单击 Copy Source 以复制那里生成的 json。您还需要将 json 用单引号括起来,如下所示:

    aws cloudwatch get-metric-widget-image --metric-widget \
    '{
        "width": 600,
        "height": 395,
        "metrics": [
            [ "AWS/EC2", "CPUUtilization", "InstanceId", "i-01234567890123456", { "stat": "Average" } ]
        ],
        "period": 300,
        "stacked": false,
        "yAxis": {
            "left": {
                "min": 0.1,
                "max": 1
            },
            "right": {
                "min": 0
            }
        },
        "title": "CPU",
        "annotations": {
            "horizontal": [
                {
                    "color": "#ff6961",
                    "label": "Troublethresholdstart",
                    "fill": "above",
                    "value": 0.5
                }
            ],
            "vertical": [
                {
                    "visible": true,
                    "color": "#9467bd",
                    "label": "Bugfixdeployed",
                    "value": "2018-11-19T07:25:26Z",
                    "fill": "after"
                }
            ]
        },
        "view": "timeSeries"
    }'
    

    对此的响应将是一个 base64 编码的图像,如下所示:

    {
        "MetricWidgetImage": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGLEAYA..."
    }
    

    如果您需要原始 png 图像,则需要通过执行以下操作来解码响应:

    aws cloudwatch get-metric-widget-image --metric-widget 'JSON_GOES_HERE' | grep MetricWidgetImage | awk '{split($0,a,"\""); print a[4]}' | base64 --decode > graph.png
    

    【讨论】:

    • 非常感谢,塔尔塔利亚!很详细的回答。我是 AWS 的新手。它对我有用,我可以得到正确的图片。
    • 使用 JQ 更容易使用 jq -r 进行原始输出(从字符串中删除引号);假设图像请求在request.json 文件中(也可以始终内联); aws cloudwatch get-metric-widget-image --metric-widget file://request.json --output-format png | jq -r '.MetricWidgetImage' | base64 --decode >| image.png
    • jq 是不需要的,默认格式总是 png (它实际上是现在唯一的选择)。你可以aws cloudwatch get-metric-widget-image --metric-widget file://request.json --query 'MetricWidgetImage' --output text | base64 -d > image.png
    • 这个帖子和答案可以节省生命/时间!知道如何将其与 Slack 集成吗?
    • @Kwhitejr,对,这取决于你的操作系统,linux 使用 -d,我认为这可能是 GNUism,MacOS 最近允许两者,但一些 BSD 和较旧的 MacOS 需要大写 -D。
    【解决方案2】:

    JSONLint 表示您在 JSON 末尾多了一个 }。此外,请尝试用单引号 ' 将整个 JSON 块包裹起来,以便于区分,并且无需转义 JSON 字符串中的双引号。

    这应该适合你:

    aws cloudwatch get-metric-widget-image --metric-widget '{ "width":600,"height":395,"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-01234567890123456",{"stat":"Average"}]],"period":300,"start":"-P30D","end":"PT0H","stacked":false,"yAxis":{"left":{"min":0.1,"max":1},"right":{"min":0}},"title":"CPU","annotations":{"horizontal":[{"color":"#ff6961","label":"Troublethresholdstart","fill":"above","value":0.5}], "vertical":[{"visible":true, "color":"#9467bd","label":"Bugfixdeployed","value":"2018-11-19T07:25:26Z","fill":"after"}]}}' --output-format "png"
    

    【讨论】:

      【解决方案3】:

      这是一个不同的答案。在https://github.com/kcrossen/CloudWatch_Remote_Monitor/blob/master/Source_Code/ 中有一个 Python 脚本,它将消化上面 Tartaglia 提到的仪表板源代码,并为 GetMetricWidgetImage 生成正确的 json 参数。还有一个 Kivy 脚本来显示返回的 PNG 图像。

      【讨论】:

        【解决方案4】:

        这是我用来为每天下载相同指标的图像的脚本。该脚本展示了如何使用可变参数调用 aws cloudwatch get-metric-widget-image 并将输出转换为 png 文件。

        function getDbDailyMetricImage
        {
            local date=$1
            local dbId=$2
            local metric=${3:-'CPUUtilization'}
            local metricMin=$4
            local metricMax=$5
        
            local dateF=$(date --date="$date" +%F)
            local start="${dateF}T00:00:00.000Z"
            local end="${dateF}T23:59:59.999Z"
        
            echo "Downloading image for $dbId $metric [$metricMin .. $metricMax]" \
                 "and Time [$start .. $end]"
            aws --region us-east-1 cloudwatch get-metric-widget-image --metric-widget \
                '{
                  "metrics": [
                      [ "AWS/RDS", "'$metric'", "DBInstanceIdentifier", "'$dbId'", 
                        { "period": 300, "yAxis": "left" } ]
                  ],
                  "yAxis": {
                     "left": {
                         "min": '$metricMin',
                         "max": '$metricMax'
                     }
                  },
                  "title": "'"$dateF $metric of $dbId vs Time UTC"'",
                  "legend": {
                     "position": "hidden"
                  },
                  "view": "timeSeries",
                  "stacked": true,
                  "period": 300,
                  "width": 1200,
                  "height": 800,
                  "start": "'$start'",
                  "end": "'$end'"
                }' \
                --output-format png --output text | base64 --decode > $metric-$dbId-$dateF.png
        }
        
        for daysAgo in {0..30}
        do
            getDbDailyMetricImage $(date --date="$daysAgo days ago" +%F) mydb1 CPUUtilization 0 100
            getDbDailyMetricImage $(date --date="$daysAgo days ago" +%F) mydb1 ReadIOPS 0 10000
        done
        

        另一个有用的分析工具,我使用 ImageMagick convert -compose Multiply 将所有或部分图形组合成一个。例如,

        convert ReadIOPS-mydb1-2019-0*.png -compose Multiply -layers flatten ReadIOPS-mydb1-2019-composite.png
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-22
          • 2019-11-01
          • 1970-01-01
          • 2020-01-27
          • 1970-01-01
          • 2020-05-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多