klen.github.io

in Blog

Graphite-beacon — простая система оповещений для Graphite

Измерение производительности популярных python web-фреймворков Ctrl→
←Ctrl Mixer -- удобная генерация данных для тестирования

Для мониторинга своих проектов я использую связку из Graphite + Grafana. Данные с серверов собирает Collectd, метрики приложений принимает Statsd.

Недавно в очередной раз поднимая эту инфраструктуру, я понял, что мне не хватает сигналов на основе данных метрик из Graphite. Например оповещения при падении свободной памяти ниже критического значения и тп.

Разумеется я не первый у кого возникла такая необходимость и существует ряд OpenSource приложений для данной задачи. Вот некоторые их них: Seyren, Cabot, graphite-pager, graphite-alerts. Вооружившись системой конфигурирования серверов я уже начал писать роли для развертывания одного из перечисленных решений, но через некоторое время осознал, что хочу сделать еще одно.

Итак, что же мне не понравилось?

Seyren — Java приложение (требует установленного MongoDB) при настройке возникли проблемы (я уже не помню какого рода) и я вернулся к другим вариантам.

Поддерживает множество типов оповещений: SMTP, Hubit, IRC, HipChat и прочее.

graphite-pager — Python-приложение (требует установленного Redis). При установке лично у меня возникли конфликты в python-зависимостях, в целом решаемые. Главная для меня проблема: нет поддержки SMTP.

graphite-alerts — Форк graphite-pager, как я понимаю добавлен веб-интерфейс для настройки. Также требует Redis, плюс судя по зависимостям БД для SQLAlchemy. Понятно, что можно использовать SQLLite, но тем не менее. Установка описана очень поверхностно и желания разбираться не вызывает. Плюс наследует от прародителя главный для меня недостаток: нет поддержки SMTP.

Cabot — Подозреваю самое мощное решение из перечисленных. Для установки предлагается использовать поставляемый с исходниками fabfile, требования и зависимости нигде не описаны. Судя по исходникам запускает Django + Gunicorn для веб-интерфейса и Celery для переодических задач. Хочет Postgres и Redis для базы данных и брокера соответственно.

Не понравился прежде всего мутной процедурой установки (в принципе все ясно), но могли бы и прямо написать. Но это не главное, прежде всего я не хочу запускать столько процессов чтобы иметь оповещения об изменении метрик из Graphite.

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

Поэтому на свет появился Graphite-beacon.

Это простое python-приложение не требуещее для работы базы данных или очереди задач. Работает на основе Tornado и написано в асинхронном стиле. На текущий момент для оповещений поддерживается SMTP и HipChat. При необходимости несложно добавить новые.

Конфигурируется «маяк» при помощи JSON файлов и имеет интуитивно понятный формат:

// Да здесь даже можно использовать комментарии
{
"graphite_url": "http://g.server.org",
"smtp": {
    "from": "beacon@server.org",
    "to": ["me@gmail.com"]
},
"alerts": [
    {   "name": "MEM",
        "format": "bytes",
        "query": "aliasByNode(sumSeriesWithWildcards(collectd.*.memory.{memory-free,memory-cached}, 3), 1)",
        "rules": ["critical: < 200MB", "warning: < 400MB"] },
    {   "name": "CPU",
        "format": "percent",
        "interval": "30m",
        "query": "aliasByNode(sumSeriesWithWildcards(collectd.*.cpu-*.cpu-user, 2), 1)",
        "rules": ["critical: >= 80%", "warning: >= 70%"] }
]}

В данном примере «маяк» получает информацию по всем нодам, и высылает предупреждения при низком количестве памяти или высокой загрузки процессора на каком либо из подключенных серверов. Включая вложенные в письма графики из Graphite.

Подробнее смотрите в описании Graphite-beacon.

Для Debian систем существует репозиторий с готовыми пакетами: http://dl.bintray.com/klen/deb

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

Задачи на будущее:

  • Анализ аномальных пиков на метриках;
  • Прикручивание поддержки Hubot;
  • Веб-интерфейс, но зачем?
Измерение производительности популярных python web-фреймворков Ctrl→
←Ctrl Mixer -- удобная генерация данных для тестирования
alt