Системы мониторинга систем и сервисов — это уже стандарт в любой сети. С их помощью админы могут собирать информацию о текущих параметрах и получать предупреждения, когда возникают проблемы. Однако с появлением кластеров и виртуальных машин сегодня само понятие сервер и сервис несколько не отвечает традиционным представлениям, а значит, иногда требуются специфические инструменты. Prometheus относят к системе мониторинга следующего поколения, здесь используется несколько иной подход и архитектура.

 

Проект Prometheus

Проект Prometheus стартовал в 2012 году как система мониторинга для музыкальной социальной сети SoundCloud. Дело в том, что под используемую в SoundCloud архитектуру микросерверов не совсем подходили традиционные системы мониторинга сервисов и хостов. Со временем Prometheus зарекомендовал себя как одно из лучших решений для подобных случаев.

Сегодня это базовая система в таких проектах, как Docker и Boxever. Представляет собой организованный набор инструментов, предлагающий метрики для хранения, агрегации, визуализации и оповещения. В большинстве традиционных систем агенты периодически отправляют данные на центральный сервер. В Prometheus децентрализованная самоуправляемая (self-managed) архитектура, когда легко можно контролировать сотни серверов с одного места, при этом отдельные команды могут использовать свои независимые серверы мониторинга.

Основу Prometheus составляет prometheus server, работающий автономно и сохраняющий все данные локально. Сервисы обнаруживаются автоматически, при помощи поиска и статических установок, подготовленных разработчиками. Такой подход очень упрощает развертывание. Для контроля одной системы не нужно разворачивать распределенную систему мониторинга, фактически достаточно установить сервер, и система мониторинга уже работает.

Все данные представлены в виде временных рядов. Метки времени имеют точность до миллисекунд, значения представлены c 64-битной точностью. Гибкий язык запросов позволяет выбрать и при необходимости сохранить отдельно любую информацию из полученного набора, строить на их основе графики или генерировать алерты. Кроме этого, сервер при помощи клиентских библиотек или компонента pushgateway может получать информацию с систем, включающихся в сеть периодически.

Проект предоставляет клиентские библиотеки, написанные на Go, Java, Python и Ruby, есть сторонние решения на bash, Node.js, Haskell и С#/.NET. Для передачи данных между компонентами выбран HTTP.

Сервер способен отображать графики, но они подходят для эпизодического наблюдения или при отладке. В качестве постоянного интерфейса предлагается компонент PromDash, который может подключаться к любым выбранным серверам для визуализации данных на панелях. PromDash выводит данные с собственно Prometheus или Graphite. Доступен API, который может быть использован для визуализации собранных данных на сторонних инструментах, шаблоны консоли, позволяющие построить свою консоль для визуализации нужных данных, и консольный prometheus_cli.

За обработку алертов отвечает Alertmanager, умеющий на сегодня отправлять сообщения по email и PagerDuty, хотя при желании легко прикрутить другие варианты. Написан на Go (Golang) — это компилируемый многопоточный язык программирования, разработанный в Google. PromDash написан на Ruby. Распространяется на условиях Apache License 2.0.

 

Установка Prometheus на сервер Ubuntu 14.04 LTS

Проект предлагает исходные тексты и сборку сервера под 32- и 64-битные процессоры. Сборка рекомендуется для установки, но, если учесть, что Prometheus состоит из нескольких элементов, при необходимости доустановки их уже придется компилировать. Есть Chef cookbooks и контейнер для Docker. Проект предоставляет инструкцию по установке и документацию, описывающую разнообразные параметры. С ними следует ознакомиться, чтобы понять все возможности, заложенные в Prometheus.

Установим Prometheus на сервер под управлением Ubuntu 14.04 LTS. Для работы нам понадобится собственно Go. В репозиториях Ubuntu он есть и ставится просто: sudo apt-get install golang. Единственный момент: в репозитории далеко не самый последний релиз — 1.2.1, тогда как последняя сборка Prometheus использовала уже 1.4.2, то есть вероятность того, что все будет работать, не так велика. Наверное, поэтому сами разработчики рекомендуют брать версию с официального сайта Go:

$ wget -c https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz
$ cd /opt
$ tar -xvzf ~/go1.5.1.linux-amd64.tar.gz

Необходимо занести путь к распакованному Go в переменную PATH и GOROOT, прописав в /etc/profile или $HOME/.profile:

export GOROOT=/opt/go
export PATH=$PATH:/opt/bin

Понадобятся инструменты для работы с Git:

$ sudo apt-get install git

Скачиваем актуальный релиз с GitHub. Удобнее применять уже скомпилированную версию:

$ wget -c https://github.com/prometheus/prometheus/releases/download/0.15.1/prometheus-0.15.1.linux-amd64.tar.gz

Можно сразу скачать и текущий срез, так как там есть документация и файлы-примеры:

$ git clone https://github.com/prometheus/prometheus.git

Лучше все компоненты Prometheus собрать внутри родительского каталога, это уменьшает путаницу при установке, обновлении и настройке. Создаем каталог для сервера, куда распаковываем полученный пакет:

$ mkdir -p ~/prometheus/server
$ cd ~/prometheus/server
$ tar -xvzf ~/prometheus-0.15.1.linux-amd64.tar.gz

Проверяем:

$ ./prometheus -version
    prometheus, version 0.15.1 (branch: master, revision: 64349aa)
    build user:       julius@julius-thinkpad
    build date:       20150727-17:56:51
    go version:       1.4.2

Установки для Prometheus можно указать в строке запуска или при помощи конфигурационного файла. В Git в каталоге documentation/examples находится шаблон конфигурационного файла prometheus.yml, копируем его в ~/prometheus/server. Это самый простой вариант с минимумом настроек, его пока достаточно, более полный находится в config/testdata/conf.good.yml. Если надумаешь использовать его, то для удобства переименуй в prometheus.yml. Файл в YAML-формате, все установки и значения по умолчанию можно узнать, введя prometheus -h.

Сейчас самые важные секции — scrape_configs и target_groups:

scrape_configs:
    - job_name: 'node'
    scrape_interval: 5s
    scrape_timeout: 10s

target_groups:
    - targets: ['localhost:9090']

В принципе, что будет написано в job_name, роли не играет. Это просто имя процесса. Но здесь есть один нюанс, затерянный глубоко в документации. Как уже говорилось, в Prometheus есть шаблоны консоли, позволяющие просматривать графики часто используемых показателей. Разработчики уже подготовили несколько готовых решений. Такую консоль можем увидеть, только если установить job_name в Node, также есть варианты HAProxy, CloudWatch и Cassandra.

Просмотр параметров Prometheus
Просмотр параметров Prometheus
 

Установка Node Exporter

В Prometheus для сохранения метрик используется Node Exporter. Для его работы нам понадобится mercurial:

$ sudo apt-get install make mercurial

Клонируем репозиторий:

$ cd ~/prometheus
$ git clone https://github.com/prometheus/node_exporter.git

Переходим в каталог node_exporter и собираем:

$ cd node_exporter
$ make

В результате в текущем каталоге появится исполняемый файл node_exporter, его можно скопировать куда-нибудь, где его будет видно в PATH, но лучше сделать символическую ссылку. Так будет проще обновлять в будущем:

$ sudo ln -s ~/prometheus/node_exporter/node_exporter /usr/bin

В Ubuntu используется Upstart. Создадим файл для запуска Node Exporter:

$ sudo nano /etc/init/node_exporter.conf

    start on startup
    script
        /usr/bin/node_exporter
    end script

Запускаем:

$ sudo service node_exporter start
    node_exporter start/running, process 3124

Можно проверить работу, подключившись браузером к http://server_ip:9100/metrics.

Метрики, собранные Prometheus
Метрики, собранные Prometheus

Теперь можем запустить сервер Prometheus, он автоматически считает конфигурационный файл prometheus.yml, если он находится в текущем каталоге, поэтому можно не указывать. Иначе используем флаг -config.file. Чтобы увидеть процесс загрузки и убедиться, что ошибок нет, первый запуск лучше произвести просто:

$ ./prometheus
Запуск Prometheus
Запуск Prometheus

В дальнейшем для автоматического запуска сервера Prometheus можно поступить, как и для node_exporter. Теперь можем перейти в браузере по http://server_ip:9090/ и просмотреть настройки сервера и данные метрик. В самом верху окна есть меню. В Graph можем генерировать графики. Вкладка Console предлагает два варианта: ввести команду вручную или выбрать в списке (команда переносится в строку ввода, и ее можно корректировать). Выбираем одну для примера и нажимаем Execute, после чего во вкладке Graph можем просмотреть график.

Просмотр настроек
Просмотр настроек
Графики в Graph
Графики в Graph

Так как мы выбрали job_name: 'node', можем посмотреть консоль. Для этого переходим в http://server_ip:9090/consoles/node.html, выбираем свой сервер, и нам доступны графики и различная статистическая информация, собранная метриками. Теперь мы можем просматривать графики, экспериментируя с запросами, но такая схема удобна только для разовых действий и во время отладки. Для повседневной работы лучше использовать PromDash, позволяющий создавать настраиваемые и более наглядные панели.

 

Установка PromDash

В отличие от остальных компонентов, PromDash написан на Ruby:

$ sudo apt-get install ruby bundler libsqlite3-dev sqlite3

Дальше как обычно:

$ cd ~/prometheus
$ git clone https://github.com/prometheus/promdash.git
$ cd promdash

PromDash для хранения информации может использовать SQLite (по умолчанию для небольших нагрузок), MySQL или PostgreSQL. Для простоты возьмем SQLite:
$ bundle install --without mysql postgresql

Далее будут дозагружены и доустановлены недостающие библиотеки Ruby. В Ubuntu в результате получил две одинаковые ошибки:

NoMethodError: undefined method `size' for nil:NilClass

Лечится ручной установкой thread_safe и rdoc, при этом будут поставлены более новые версии этих пакетов, чем требовал мастер. Затем повторяем процесс установки:

$ sudo gem install thread_safe
$ sudo gem install rdoc

Создаем каталог для хранения данных SQLite3, ассоциированных с PromDash:

$ mkdir ~/prometheus/databases

После запуска внутри будет создан файл mydb.sqlite3. Путь к этому каталогу следует прописать в переменной DATABASE_URL, кроме этого, зададим режим работы PromDash через переменную RAILS_ENV (значения можно подсмотреть в документации и в Git).

$ nano ~/.bashrc
export DATABASE_URL=sqlite3:$HOME/prometheus/databases/mydb.sqlite3
export RAILS_ENV=production

Применяем изменения:

$ . ~/.bashrc

Находясь в каталоге promdash, создаем таблицы:

$ rake db:migrate

Использование Rails Asset Pipeline подразумевает прекомпиляцию некоторых элементов:

$ rake assets:precompile

В составе PromDash идет легкий веб-сервер Thin, написанный также на Ruby. Чтобы его запустить, вводим

$ bundle exec thin start -d

Подключаемся браузером к 3000-му порту (http://server_ip:3000/) и можем наблюдать главную страницу PromDash. Здесь пока ничего нет, только две вкладки Dashboard и Servers с кнопками, позволяющими создавать элементы. Для начала нужно подключить PromDash к серверам. Он у нас пока один. Просто переходим во вкладку Servers, выбираем New Server, в появившейся форме указываем имя, URL http://server_ip:9090 и выбираем тип Prometheus. Нажимаем Create Server. Если есть другие серверы Prometheus или Graphite, то аналогичным образом прописываем остальные. Переходим в Dashboard.

Чтобы было удобно структурировать данные, панели размещаются в каталогах. Жмем New Directory, вводим название и нажимаем Create Directory. Теперь можно создавать панель. Алгоритм прост. Нажимаем New Dashboard, вводим имя, выбираем в списке каталог и создаем. Все, перед нами пустой Dashboard, который требуется сконфигурировать. Это просто: при наведении курсора на заголовок Title откроются несколько кнопок, позволяющих произвести основные операции. Изменить заголовок и формат отображения можно, выбрав четвертую кнопку Graph and Axis Settings icon. Теперь добавим графики. Нажимаем Add Expression и вводим или выбираем из списка выражение, например process_cpu_second_total, и задаем дополнительные параметры.

Когда все заполнено, нажимаем левую кнопку Refresh и видим график на Dashboard. Больше графиков и прочих элементов можем добавить при помощи кнопок внизу страницы. Кнопки вверху позволяют установить другую тему оформления, указать период обновления. Чтобы сохранить настройки Dashboard, нажимаем Save Changes. Теперь, перейдя в Dashboards, увидим ссылку на нашу панель, откуда можем ее просмотреть, а также переименовать, удалить и клонировать.

График в Dashboards
График в Dashboards
 

Вывод

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

Оставить мнение