Пытаясь воссоздать макет CloudWatch, я собрал его с помощью команд консоли. Попытка использовать агент CloudWatch и файл config.json. - PullRequest
0 голосов
/ 23 октября 2019

У меня есть скрипт, который в настоящее время отправляет данные в CloudWatch, которые отражают используемую память, соединения, время ожидания ввода-вывода, используемое CPU и дисковое пространство. Он использует команды интерфейса командной строки AWS для настройки структуры метрики и отправки данных в CloudWatch (см. «Мой текущий сценарий CloudWatch» в конце этого поста). У меня есть скрипт, который запускается каждые шестьдесят секунд через Cron на моих серверах.

Используя эту настройку, у меня есть метрика, названная в честь моей группы автоматического масштабирования с датой. В этой метрике у меня есть список с каждым измерением для каждого экземпляра в ASG. Это дает мне простой способ найти и посмотреть статистику для каждого экземпляра в те дни.

Я посмотрел на свой биллинг для CloudWatch, и он кажется немного высоким, поэтому я пытаюсь получить точно такую ​​же настройкус помощью клиента Cloudwatch и настройте файл json для захвата одних и тех же данных с одинаковой структурой. Мне любопытно, будет ли это дешевле. Кто-нибудь знает, если использование клиента ASG вместо CLI с метриками размещения CloudWatch является более дешевой альтернативой, или это не имеет значения, и я должен просто продолжать использовать то, что у меня есть? Есть ли другой способ, о котором я не подумал?

До сих пор я не смог воссоздать ту же метрическую структуру, используя подход с использованием файла json.

Я поставил ниже config.json, который у меня естьиграл с, и я не могу подобраться к той структуре, которая мне нужна. Я перепробовал много итераций этого.

{
    "metrics": {
        "namespace": "ASG-Test2",
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "InstanceId": "${aws:InstanceId}"
        },
        "aggregation_dimensions" : [["AutoScalingGroupName"]],
        "metrics_collected": {
            "collectd": {
                "metrics_aggregation_interval": 0
            },
            "disk": {
                "measurement": [
                        "used_percent"
                ],
                "resources": [
                        "/"
                ],
                "drop_device": true,
                "metrics_collection_interval": 60
            }
        }
    }
}

То, что я ищу - метрика, которая имеет название ASG с датой, и внутри этой метрики перечисляются все экземпляры ec2. Вот изображение того, что у меня сейчас есть в CloudWatch с использованием моего текущего сценария оболочки. Имя метрики - это дата, за которой следует название ASG. Моя ASG имеет четыре экземпляра, поэтому вы видите четыре метрики для каждого имени измерения.

enter image description here

Мой текущий скрипт CloudWatch:

#!/bin/bash
# asg_cloudwatch.sh - Adds the ability to see memory usage, tcp connections, IO wait, CPU and disk space on ec2 instances
#                    by the autoscaling group name that they all reside in
#
# Installed at /opt/utilities

## To be set up in a cron in each of the app servers to run every minute
# added the following to the userdata of the app servers
#            "echo \"$(echo \'*/1 * * * * /opt/utilities/asg_cloudwatch.sh\' ; crontab -l)\" | crontab -\n",

# From https://medium.com/@raxwunter/monitoring-your-ec2-instances-in-aws-autoscaling-group-a7c0b75860a8


PUBLIC_IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
INSTANCE_ID=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
NAME="InstanceID__$INSTANCE_ID...........PublicIP__$PUBLIC_IP"
ASG_NAME=`aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID"  --region us-east-2 | jq '.Tags[] | select(.["Key"] | contains("aws:autoscaling:groupName")) | .Value'`
ASG_NAME=`echo $ASG_NAME | tr -d '"'`
ASG_NAME=`echo $(date +"%m-%d-%Y")...$ASG_NAME`

USEDMEMORY=$(free -m | awk 'NR==2{printf "%.2f\t", $3*100/$2 }')
TCP_CONN_PORT_80=$(netstat -an | grep 80 | wc -l)
IO_WAIT=$(iostat | awk 'NR==4 {print $5}')
PROC=$(mpstat 1 1 | awk '{print ($3)}' | awk 'END{print}')
INSTANCE=$(curl http://169.254.169.254/latest/meta-data/ami-launch-index)
DISK_USED=$(df -hl | awk '/^\/dev/ { sum+=$5 } END { print sum }')

aws cloudwatch put-metric-data --region "us-east-2" --metric-name Measuring-Memory_usage --dimensions $ASG_NAME=$NAME --namespace "Custom" --value $USEDMEMORY
echo "RAM done"

aws cloudwatch put-metric-data --region "us-east-2" --metric-name Measuring-Tcp_connections --dimensions $ASG_NAME=$NAME --namespace "Custom" --value $TCP_CONN_PORT_80
echo "TCP done"

aws cloudwatch put-metric-data --region "us-east-2" --metric-name Measuring-Input_Output_Wait --dimensions $ASG_NAME=$NAME --namespace "Custom" --value $IO_WAIT
echo "IO done"

aws cloudwatch put-metric-data --region "us-east-2" --metric-name Measuring-CPU --dimensions $ASG_NAME=$NAME --namespace "Custom" --value $PROC
echo "CPU done"

aws cloudwatch put-metric-data --region "us-east-2" --metric-name Measuring-Disk_space_used --dimensions $ASG_NAME=$NAME --namespace "Custom" --value $DISK_USED
echo "DISK done"
...