Привет хабравчане!Недавно сменил место работы, но всё так же поглощён облачными технологиями. И проектов у меня теперь будет гораздо больше, а с ними и статей, я надеюсь, интересных.
Итак, потребовалось создать метрики по параметрам, которые Cloud Watch считать не умеет. Можно мерять много чего, но, например, возьмём Load Average. Этот странный, но понятный всем параметр, объясняет состояние системы. В целом, мы можем оценивать здоровье сервера по этому состоянию. Естественно, не всегда, но как пример LA идеален.
Что же нам для этого нужно?
1. Amazon CloudWatch Command Line Tools
2. Несколько скриптов
Начнём приготовления на сервере.
- В папке /opt создадим папку — aws
- Распакуем утилиты командной строки в папку /opt/aws/mon
- Ключ и сертификат pk-**.pem и cert-**.pem. Уложим в папку /opt/aws/keys
- Нужную папку c Java симлинком направим на /usr/java/latest
Во первых, поймём как мы будем получать Load Average. Мне нравится так:
load_average=$(uptime | awk -F'load average:' '{ print $2 }' | awk '{ print $2 }') load_average=${load_average%%','}
В этой переменной мы сохраним LA за 5 минут (второй).
Далее, нам нужен TimeStamp в определённом формате:
timestamp=$(date -u +%Y-%m-%dT%H:%M:%S.000Z)
Ну и последнее — регистрация значения метрики:
mon-put-data --metric-name "LoadAverage" --namespace "CustomMetric" --timestamp $timestamp --value $load_average
--metric-name «LoadAverage» — имя метрики
--namespace «CustomMetric» — где эта метрика будет находиться
Итак, конечный скрипт с переменными, вечным циклом и логгированием выглядит так:
/opt/aws/cw_scaler.sh
#!/bin/bash export AWS_CLOUDWATCH_HOME=/opt/aws/mon export AWS_CLOUDWATCH_URL=https://monitoring.amazonaws.com export PATH=$AWS_CLOUDWATCH_HOME/bin:$PATH export JAVA_HOME=/usr/java/latest export TOOLS_HOME=/opt/aws export EC2_PRIVATE_KEY=$TOOLS_HOME/keys/pk-GWO6MOXPTCZA5EY7**********RSFJ.pem export EC2_CERT=$TOOLS_HOME/keys/cert-GWO6MOXPTCZA5EY7**********RSFJ.pem while [ true ]; do load_average=$(uptime | awk -F'load average:' '{ print $2 }' | awk '{ print $2 }') load_average=${load_average%%','} timestamp=$(date -u +%Y-%m-%dT%H:%M:%S.000Z) mon-put-data --metric-name "LoadAverage" --namespace "CustomMetric" --timestamp $timestamp --value $load_average echo "$timestamp: Load Average $load_average" >>$TOOLS_HOME/cw_scaler.log echo "" >>$TOOLS_HOME/cw_scaler.log sleep 14 done
Не забудем про init скрипт для старта/стопа нашего минидемона:
/etc/init.d/cw_scaler-init
#!/bin/bash1 #chkconfig: 2345 55 25 # source function library . /etc/rc.d/init.d/functions #Set environement export TOOLS_HOME=/opt/aws start() { $TOOLS_HOME/cw_scaler.sh& } stop() { kill $(ps ax | grep '/opt/aws/cw_scaler.sh' | grep -v "grep" | awk '{print $1}') } case "$1" in start) echo "Starting Cloud Watch scaler." start ;; stop) echo "Stopping Cloud Watch scaler." stop ;; *) echo $"Usage: cw_scaler.sh {start|stop}" exit 1 ;; esac
Ну с собственно, что мы получили в конце? Через 5-10 минут у вас в панели Cloud Watch появится тип метрик: CustomMetric, а в нём — LoadAverage:

Да, господа, всё очень просто, и вы можете снимать любого рода данные, которые можно передать в числовом эквиваленте и на их основе уже строить автомасштабирование.
ЗЫ. Если заметели, это моя первая статья в корпоративном блоге EPAM Systems. Прошу любить и жаловать! = )