J'aimerais obtenir une capture d'écran Cloudwatch automatiquement car j'ai de nombreuses instances.

Mais quand j'essaye d'exécuter get-metric-widget-image par l'outil de commande aws cli, j'obtiens toujours une erreur.

Une erreur s'est produite (ValidationError) lors de l'appel de l'opération GetMetricWidgetImage: la propriété MetricWidget 'metricWidget' a un contenu JSON incorrect.

Y a-t-il quelqu'un qui pourrait m'aider? Merci.

Je n'ai pas pu trouver d'exemple dans aws doc. Aucun exemple exact dans le lien ci-dessous. https://docs.aws.amazon.com /AmazonCloudWatch/latest/APIReference/CloudWatch-Metric-Widget-Structure.html

Ma commande est comme ça.

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" 
7
ingsnow kwan 20 nov. 2018 à 09:19

4 réponses

Meilleure réponse

La meilleure façon d'obtenir le json correct pour votre demande est d'utiliser CloudWatch Console pour construire le graphique, puis de cliquer sur l'onglet Source, sélectionnez Image API vue et cliquez sur Copy Source pour copier le json généré là-bas. Vous devez également envelopper le json entre guillemets simples, comme ceci:

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"
}'

La réponse à cela sera une image encodée en base64, comme ceci:

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

Si vous avez besoin de l'image png brute, vous devrez décoder la réponse en faisant quelque chose comme ceci:

aws cloudwatch get-metric-widget-image --metric-widget 'JSON_GOES_HERE' | grep MetricWidgetImage | awk '{split($0,a,"\""); print a[4]}' | base64 --decode > graph.png
10
Dejan Peretin 20 nov. 2018 à 08:14

JSONLint indique que vous en avez un } supplémentaire à la fin de votre JSON. Essayez également d'encapsuler tout le bloc JSON avec des guillemets simples ' pour une différenciation plus facile et sans avoir besoin d'échapper aux guillemets doubles dans la chaîne JSON.

Cela devrait fonctionner pour vous:

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"
2
Gabe Hollombe 20 nov. 2018 à 06:50

Voici un script que j'utilise pour télécharger des images pour la même métrique pour chaque jour. Le script montre comment invoquer aws cloudwatch get-metric-widget-image avec des arguments variables et convertir la sortie en un fichier 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

Un autre outil d'analyse utile que je l'utilise pour combiner tout ou partie des graphiques en un seul en utilisant ImageMagick convert -compose Multiply. Par exemple,

convert ReadIOPS-mydb1-2019-0*.png -compose Multiply -layers flatten ReadIOPS-mydb1-2019-composite.png
0
Nicholas Sushkin 6 mars 2019 à 22:21

Voici une réponse différente. Dans https://github.com/kcrossen/CloudWatch_Remote_Monitor/blob/master/Source_Code/ il existe un script Python qui va digérer le code source de votre tableau de bord mentionné par Tartaglia ci-dessus et générer les paramètres json appropriés pour GetMetricWidgetImage. Il existe également un script Kivy pour afficher les images PNG renvoyées.

0
kcrossen 4 mars 2019 à 19:31