AWS CloudWatch: собственные метрики (Custom Metrics)

    Привет хабравчане!

    Недавно сменил место работы, но всё так же поглощён облачными технологиями. И проектов у меня теперь будет гораздо больше, а с ними и статей, я надеюсь, интересных.

    Итак, потребовалось создать метрики по параметрам, которые Cloud Watch считать не умеет. Можно мерять много чего, но, например, возьмём Load Average. Этот странный, но понятный всем параметр, объясняет состояние системы. В целом, мы можем оценивать здоровье сервера по этому состоянию. Естественно, не всегда, но как пример LA идеален.

    Что же нам для этого нужно?

    1. Amazon CloudWatch Command Line Tools
    2. Несколько скриптов

    Начнём приготовления на сервере.
    1. В папке /opt создадим папку — aws
    2. Распакуем утилиты командной строки в папку /opt/aws/mon
    3. Ключ и сертификат pk-**.pem и cert-**.pem. Уложим в папку /opt/aws/keys
    4. Нужную папку 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. Прошу любить и жаловать! = )
    EPAM 134,03
    Компания
    Поделиться публикацией
    Похожие публикации
    Комментарии 9
    • 0
      Любить и жаловать тебя или блог EPAM на Хабре? :)
      • –1
        Меня в этом блоге)
        • 0
          За что? оО

          P.S. А блог Беларуского EPAM есть?
          • 0
            Любить меня в этом блоге за то, что я в него буду писать интересности.

            Про беларусский ЕРАМ — не знаю.
        • 0
          Проще LA получать так load_average=$(uptime | awk -F', ' '{ print $4 }')
          • 0
            действительно проще)
          • +1
            А у меня такой вопрос: почему не используешь PID файл, а убиваешь по grep'у? Сам просто сейчас то же самое примерно делаю, вот и решил поинтересоваться.
            • 0
              Как говорится, так исторически сложилось)

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое