У меня есть скрипт, который в настоящее время отправляет данные в 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](https://i.stack.imgur.com/GcMyA.png)
Мой текущий скрипт 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"