Статьи

Как: отслеживать EC2 с помощью Clojure и статистики сервера

Содержание этой статьи первоначально было написано Пауло Сузартом в его блоге .

вступление

Прежде чем идти дальше, обратите внимание на Parallel SSH и мониторинг системы в Clojure .

Сочетая мою потребность в мониторинге экземпляра EC2 под управлением nginx , bamboo и artifactory , с моим желанием кодировать в clojure, я решил использовать server-stats для базового мониторинга моего сервера через ssh.

EC2 поддерживает взаимодействия с использованием SSH без необходимости использования его файла .pem, если вы добавите в него свой открытый ключ. Посмотрите здесь, чтобы увидеть, как.

Это очень простые команды, и, конечно, вы должны использовать более серьезные команды для критически важных служб.

Конфигурационный файл server-stats на самом деле является файлом clojure с именем server-stats.cfg, в который вы помещаете некоторые определения для мониторинга. Сила серверной статистики заключается в том, что она работает с несколькими серверами. Но в этом случае у меня есть только один.

Конфиг файл

(import org.apache.commons.mail.SimpleEmail)


(defn send-mail [alert-msg server-name cmd-output]
    (doto (SimpleEmail.)
     ;; ... my email configs
      (.send)))

(add-alert-handler email [alert-msg server-name cmd-output]
  (send-mail alert-msg server-name cmd-output))

(set-ssh-username "ec2-user")

(add-server-group web-servers
  ["myserver.mydomain.com"])

(add-cmd disk
  {:doc "Get the disk usage using df"
   :cmd "df -h"
   :servers [web-servers]
   :alerts [{:column "Use%"
             :value-type percent
             :handlers [email]
             :msg "Disk space over 55% full"
             :trigger (> 55)}]})

(add-cmd is-nginx
  {:doc "Is nginx Running?"
   :servers [web-servers]
   :cmd "[[ -z `ps aux | grep nginx` ]] && echo 'false' || echo 'true'"
   :alerts [{:value-type bool
             :msg "Nginx is not running"
             :handlers [email]
             :trigger (= false)}]})

(add-cmd app-log
  {:doc "Get last 20 entries in todays app-servers log"
   :servers [web-servers]
   :cmd "tail -20 /home/ec2-user/artifactory-2.5.1.1/logs/access.log"})

(add-cmd http-errors
  {:doc "Show recent non-200s requests"
   :servers [web-servers]
   :cmd "tail -200 /var/log/nginx/error.log"})

(add-cmd is-artifactory
  {:doc "Is Artifactory Running?"
   :servers [web-servers]
   :cmd "[[ -z `ps aux | grep org.artifactory.standalone.main.Main` ]] && echo 'false' || echo 'true'"
   :alerts [{:value-type bool
             :msg "Artifactory is not running"
             :handlers [email]
             :trigger (= false)
             :mute-for 1860000}]})

(add-cmd is-bamboo
  {:doc "Is bamboo Running?"
   :servers [web-servers]
   :cmd "[[ -z `ps aux | grep com.attlassian.bamboo.server.Server` ]] && echo 'false' || echo 'true'"
   :alerts [{:value-type bool
             :msg "Bamboo is not running"
             :handlers [email]
             :trigger (= false)
             :mute-for 1860000}]})

Почти все команды были заимствованы из примера файла cfg. Небольшая, но важная деталь — ключ: отключение в оповещениях. Как видите, приведенная выше ссылка на статистику сервера указывает на мой ответвление.

Немой-за ключ добавляет возможность предотвратить любые запланированные команды SSH с короткими интервалами , чтобы затопить канал связи оповещения (электронная почта в этом CFG). Оповещения отправляются только по истечении времени отключения звука.

Это делается с помощью пустых файлов для управления оповещениями. server-stats проверяет свойство lastModified файла данного оповещения и активирует его, только если интервал отключения звука истек.

Чтобы серверная статистика отправляла оповещения до: отключения времени, вы можете просто удалить файл с именем. {Sanitized_alert_message}. Обеззараженное сообщение — это просто предупреждающее сообщение без символов, которые подчеркнуты. Я должен рассмотреть его хеш-версию, чтобы избежать громких имен для больших сообщений, но пока это нормально.

Обратите внимание, что функция mute-for контролирует активацию предупреждений для каждого сообщения cmd.

Используйте cron

Конечно, вы не можете тратить время на выполнение команд ssh вручную. Итак, есть четыре записи cron для запланированных ssh-взаимодействий:

0 7 * * * SSH_AUTH_SOCK="$(find /tmp/keyring*/ -type s -user paulosuzart -group paulosuzart  -name 'ssh*' | head -n 1)" ~/workspace/p/Server-Stats/run.sh disk -log
*/10 * * * * SSH_AUTH_SOCK="$(find /tmp/keyring*/ -type s -user paulosuzart -group paulosuzart  -name 'ssh*' | head -n 1)" ~/workspace/p/Server-Stats/run.sh is-nginx -log
*/30 * * * * SSH_AUTH_SOCK="$(find /tmp/keyring*/ -type s -user paulosuzart -group paulosuzart  -name 'ssh*' | head -n 1)" ~/workspace/p/Server-Stats/run.sh is-artifactory -log
*/30 * * * * SSH_AUTH_SOCK="$(find /tmp/keyring*/ -type s -user paulosuzart -group paulosuzart  -name 'ssh*' | head -n 1)" ~/workspace/p/Server-Stats/run.sh is-bamboo -log

Run.sh довольно прост. Просто переносит java -jar на серверную статистику. Иногда я хочу записать вывод ssh, чтобы я мог передать опцию -log, и вывод переходит в log / cmd.

#!/bin/bash
# Wraps the start of server-stats. If -log is passed, will save
# the resulting execution to log/cmd
# [email protected]

# java -jar should run from inside the server-stats dir
cd ~/workspace/p/Server-Stats

if [ -z $1 ]; then
  echo "usage: run cmd [-log]"
  exit 2
fi

COMM="java -jar server-stats-0.1-standalone.jar -a $1"
if [[ ! -z $2 && "-log"=$2 ]]; then
  echo "logging to log/$1.out"
  $COMM=$COMM:" > log/$1.out"
fi

echo $COMM
$COMM

Не спрашивайте меня почему, но ssh ведет себя не так, как вы, за исключением случаев, когда он вызывается из команды cron. Но мне удалось найти эту статью, которая очень помогла.

Этот crontable настроен на моем ноутбуке, и любое странное поведение немедленно отправляется на мою электронную почту. Другие cmds (app-log, http-errors) используются напрямую с ./run.sh cmd для просмотра выходных данных.

Вывод

Конечно, функция отключения звука может быть объединена с исходным репо. Итак, я бы порекомендовал вам использовать оригинальную версию server-stats.

Если вам нужны простые или более сложные функции мониторинга, это ваше дело. Просто используйте серверную статистику в качестве основы для этого.