Как использовать aws cloudwatch get-metric-widget-image? - PullRequest
0 голосов
/ 20 ноября 2018

Я хотел бы получить скриншот Cloudwatch автоматически, так как у меня много экземпляров.

Но когда я пытаюсь запустить get-metric-widget-image с помощью командного инструмента aws cli, я всегда получаю ошибку.

Произошла ошибка (ValidationError) при вызове операции GetMetricWidgetImage: свойство 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" 

Ответы [ 4 ]

0 голосов
/ 07 марта 2019

Вот скрипт, который я использую для загрузки изображений по одной и той же метрике для каждого дня.Скрипт показывает, как вызвать 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составить умножить.Например,

convert ReadIOPS-mydb1-2019-0*.png -compose Multiply -layers flatten ReadIOPS-mydb1-2019-composite.png
0 голосов
/ 20 ноября 2018

Лучший способ получить правильный json для вашего запроса - использовать консоль CloudWatch для построения графика, затем перейти на вкладку Source, выбрать Image API view и нажать 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
0 голосов
/ 04 марта 2019

Вот другой ответ.В пределах https://github.com/kcrossen/CloudWatch_Remote_Monitor/blob/master/Source_Code/ есть скрипт Python, который будет переваривать исходный код вашей панели, упомянутый выше Tartaglia, и генерировать правильные параметры json для GetMetricWidgetImage.Также есть скрипт Kivy для отображения возвращенных изображений PNG.

0 голосов
/ 20 ноября 2018

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"
...