PROM 01: Обзор и установка Prometheus

Описание:

Всем привет! Рады приветствовать вас на практикуме Prometheus by Rebrain!

Сейчас мы начинаем первый урок нашего практикума. Первое задание мы с вами разобьем на две большие части. В первой мы изучим понятие системы мониторинга, основные требования к ней, сделаем небольшой обзор основных систем мониторинга, которые вы можете применять. Во второй части мы переключимся на Prometheus - изучим его ключевые особенности, разберем архитектуру и установим на собственный сервер. Приступим!

В качестве задания этого урока вам необходимо будет установить Prometheus на подготовленную виртуальную машину.

Проще всего представить данный план с точки зрения конкретной рабочей задачи. Сделаем вид, что вы устроились в компанию, которая занимается разработкой онлайн-сервисов. Вы приходите в первый день на работу, а к вам тут же подбегает 5 человек и все одновременно объясняют, что сайт не работает, пользователи не могут оплатить заказы, вообще все пропало. Вы задаете, казалось бы, логичный вопрос: "А как вы узнали о том что все не работает?".

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

Понятие системы мониторинга

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

Основные требования к системе мониторинга

Отлично, с понятием системы мониторинга определились, а теперь давайте разберемся, зачем вам могут понадобиться эти данные:

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

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

Для расследования инцидентов. Кстати, это достаточно частый кейс в реальной жизни. Так часто бывает, что в какой-то момент что-то работает плохо - сайт начинает тормозить, база данных перегружается, количество регистрируемых ошибок у пользователей возрастает. А потом, за одну секунду, все приходит в норму. Именно в этот момент нам требуются исторические данные, чтобы изучить, что произошло, и устранить причину неполадок.

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

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

Обзор систем мониторинга

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

Zabbix - наверное, самый популярный продукт для мониторинга. Имеет центральный сервер, который опрашивает агентов, установленных на узлах инфраструктуры (например, в операционной системе). После чего сохраняет полученные метрики в локальную базу MySQL. Имеет веб-интерфейс, через который можно настраивать алерты, управлять агентами и смотреть интересующие графики.

Graphite - по сути это не система мониторинга, а time series database, то есть база данных, созданная для хранения временных данных - данных, у которых всегда есть поле со временем. Такие базы являются намного более производительными в силу своей специфики, в отличии от реляционных баз общего назначения - MySQL или PostgreSQL. В данном случае Graphite не требует никаких агентов, но требует дополнительного софта типа statsd, который будет принимать метрики от приложений или коллекторов, агрегировать их и записывать в Graphite. Отображать полученные данные можно с помощью внешней системы, например Grafana.

Prometheus - является системой все-в-одном. По аналогии с Zabbix имеет центральный сервер, который периодически подключается к агентам и собирает с них метрики, и впоследствии записывает их в локальную time series database. Помимо этого Prometheus легко интегрируется с Grafan'ой, позволяет настраивать алерты и анализировать данные с помощью собственного языка PromQL.

На самом деле список сервисов для мониторинга намного больше - вы можете использовать также Nagios, Netdata, Munin или какие-то облачные сервисы типа Okmeter, Datadog или Newrelic. В любом случае все системы работают примерно одинаково - вы устанавливаете агента на ваши серверы, и они сами отправляют метрики в систему мониторинга (push модель), либо же центральный сервер опрашивает их (pull модель).

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

Ключевые особенности Prometheus

Давайте посмотрим на ключевые особенности Prometheus:

Встроенная TSDB (Time Series Database) - как мы уже упоминали ранее, Prometheus использует свою собственную реализацию TSDB, что позволяет оперировать огромным количеством метрик без большой потери производительности.

Multi-dimensional data model - внутри базы у вас будут храниться как названия метрик, так и теги, привязанные к ним. Это позволит вам гибко фильтровать выборку метрик, что очень удобно при проведении анализа данных.

Для работы с метриками Prometheus предлагает свой собственный язык - PromQL. Он позволит вам проводить агрегацию метрик, а так же их фильтрацию и сравнение.

Сбор метрик осуществляется по pull модели (сервер опрашивает агентов) по HTTP протоколу - простота реализации и открытый протокол делают систему более стабильной и масштабируемой.

Service Discovery - ключевая функция Prometheus. Благодаря большим возможностям в автоопределении объектов мониторинга, вы можете использовать Prometheus в Kubernetes - он сам будет определять сервисы и поды, которые необходимо мониторить. Также вы сможете интегрировать Prometheus с dns или с Docker Swarm.

Архитектура Prometheus

Итак, с основами разобрались, давайте теперь переходить к архитектуре Prometheus:

Источник картинки: тут

Давайте разберемся с основными компонентами, которые представлены на схеме:

В центре находится Prometheus сервер - единый бинарный файл, который содержит внутри себя:

базу данных TSDB для хранения метрик;

http сервер для работы веб-интерфейса;

модуль retrieval, который опрашивает агентов и получает у них метрики;

модуль service discovery, который определяет цели для мониторинга - например ищет их в dns или в Kubernetes;

модуль алертинга, который отправляет сообщения о проблемах в Alertmanager;

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

Alertmanager - это отдельный сервис, который принимает оповещения о проблемах от Prometheus, фильтрует их и отправляет в нужные каналы оповещений. Например, критичные проблемы будут отправлены в pagerduty, а менее важные - в Slack.

Дополнительные сервисы - Grafana, API clients - могут подключаться к Prometheus и забирать из него данные для последующей обработки.

Установка Prometheus

Итак, давайте попробуем установить Prometheus на свой собственный сервер. Сделать это можно по-разному, например используя уже собранные бинарники или же с помощью Docker контейнера. В официальной документации не приводятся репозитории apt или yum для установки, но вы можете воспользоваться готовой ansible ролью для установки - Cloud Alchemy.
Напомню, что Ansible - это система управления конфигурациями, в которой вы описываете желаемое состояние сервера в yaml формате, а после запускаете Ansible, и он настраивает вам сервер.

Best Practice: Поскольку Docker стал стандартом в ИТ индустрии и опираясь на наш опыт поддержки более сотни различных проектов, мы рекомендуем в production запускать Prometheus внутри Docker контейнера. Это даст вам несколько основных преимуществ. Во-первых, вам не придется думать, что находится внутри контейнера - не потребуется скачивать и устанавливать бинарники. Во-вторых, вы буквально одной командой сможете обновить вашу инсталляцию Prometheus. Ну и в-третьих, вы сможете легко запускать Prometheus с помощью систем оркестрации, таких как Kubernetes и Docker Swarm. Для запуска через Docker стоит воспользоваться всего лишь одной командой:

docker run -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

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

Скачать архив с сервером Prometheus и рассмотреть его содержимое.

Определиться с тем, где Prometheus хранит конфигурацию, и понять основные параметры запуска.

Запустить Prometheus и создать для него файл автозапуска systemd.

Итак, поехали!

1. Скачиваем архив и изучаем его содержимое

Для начала нам предстоит скачать Prometheus с официального сайта и распаковать в директорию /opt/prometheus. Директория большого значения не имеет, но мы будем использовать указанную здесь:

root@node1:~# cd /opt/
root@node1:/opt# wget https://github.com/prometheus/prometheus/releases/download/v2.26.0/prometheus-2.26.0.linux-amd64.tar.gz
... skipped ...
root@node1:/opt# tar zxf prometheus-2.26.0.linux-amd64.tar.gz
root@node1:/opt# mv prometheus-2.26.0.linux-amd64 prometheus

Внутри распакованной директории находятся все необходимые для работы Prometheus файлы:

root@node1:/opt/prometheus# ls -la
total 162708
drwxr-xr-x 4 3434 3434 4096 Mar 31 12:10 .
drwxr-xr-x 5 root root 4096 Apr 7 09:42 ..
-rw-r--r-- 1 3434 3434 11357 Mar 31 12:07 LICENSE
-rw-r--r-- 1 3434 3434 3646 Mar 31 12:07 NOTICE
drwxr-xr-x 2 3434 3434 4096 Mar 31 12:07 console_libraries
drwxr-xr-x 2 3434 3434 4096 Mar 31 12:07 consoles
-rwxr-xr-x 1 3434 3434 88636724 Mar 31 11:58 prometheus
-rw-r--r-- 1 3434 3434 926 Mar 31 12:07 prometheus.yml
-rwxr-xr-x 1 3434 3434 77930000 Mar 31 12:00 promtool
root@node1:/opt/prometheus#

Давайте рассмотрим основные файлы:

console_libraries - директория, которая содержит библиотеки для html шаблонов;

consoles - директория, содержащая шаблоны html страниц для веб-интерфейса;

prometheus - исполняемый файл Prometheus сервера;

prometheus.yml - конфигурационный файл Prometheus;

promtool - утилита для проверки конфигурации, работы с TSDB и получения метрик.

2. Основные параметры запуска

Конфигурационный файл мы начнем рассматривать в следующем задании, а сейчас давайте посмотрим на основные ключи запуска Prometheus:

--config.file="prometheus.yml" - какой конфигурационный файл использовать;

--web.listen-address="0.0.0.0:9090" - адрес, который будет слушать встроенный веб-сервер;

--web.enable-admin-api - включить или отключить административный API через веб-интерфейс;

--web.console.templates="consoles" - путь к директории с шаблонами html;

--web.console.libraries="console_libraries" - путь к директории с библиотеками для шаблонов;

--web.page-title - заголовок веб-страницы (title);

--web.cors.origin=".*" - настройки CORS для веб-интерфейса;

--storage.tsdb.path="data/" - путь для хранения time series database;

--storage.tsdb.retention.time - время хранения метрик по умолчанию 15 дней, все, что старше, будет удаляться;

--storage.tsdb.retention.size - размер TSDB, после которого Prometheus начнет удалять самые старые данные;

--query.max-concurrency - максимальное одновременное число запросов к Prometheus через PromQL;

--query.timeout=2m - максимальное время выполнения одного запроса;

--enable-feature - флаг для включения различных функций, описанных здесь;

--log.level - уровень логирования.

3. Запуск Prometheus вручную и через systemd

Давайте создадим директорию для хранения данных и запустим наш Prometheus:

root@node1:/opt/prometheus# mkdir data
root@node1:/opt/prometheus# ./prometheus --storage.tsdb.path="/opt/prometheus/data/"
level=info ts=2021-04-07T09:52:31.404Z caller=main.go:380 msg="No time or size retention was set so using the default time retention" duration=15d
level=info ts=2021-04-07T09:52:31.405Z caller=main.go:418 msg="Starting Prometheus" version="(version=2.26.0, branch=HEAD, revision=3cafc58827d1ebd1a67749f88be4218f0bab3d8d)"
level=info ts=2021-04-07T09:52:31.405Z caller=main.go:423 build_context="(go=go1.16.2, user=root@a67cafebe6d0, date=20210331-11:56:23)"
level=info ts=2021-04-07T09:52:31.405Z caller=main.go:424 host_details="(Linux 5.4.0-51-generic #56-Ubuntu SMP Mon Oct 5 14:28:49 UTC 2020 x86_64 node1 (none))"
level=info ts=2021-04-07T09:52:31.405Z caller=main.go:425 fd_limits="(soft=1024, hard=1048576)"
... skipped ...

Собственно, сервер был успешно запущен - теперь можно открывать в браузере IP вашего сервера с портом 9090 и посмотреть на веб-интерфейс Prometheus, который мы будем рассматривать в течение всего практикума.

Для большей красоты можно создать пользователя Prometheus и сервис для systemd:

root@node1:/opt/prometheus# useradd -s /sbin/nologin -d /opt/prometheus prometheus
root@node1:/opt/prometheus# chown -R prometheus:prometheus /opt/prometheus
root@node1:/opt/prometheus# cat /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/opt/prometheus/prometheus \
--config.file=/opt/prometheus/prometheus.yml \
--storage.tsdb.path=/opt/prometheus/data \
--web.console.templates=/opt/prometheus/consoles \
--web.console.libraries=/opt/prometheus/console_libraries

[Install]
WantedBy=default.target

root@node1:/opt/prometheus# systemctl daemon-reload
sysmroot@node1:/opt/prometheus# systemctl enable prometheus
Created symlink /etc/systemd/system/default.target.wants/prometheus.service → /etc/systemd/system/prometheus.service.
root@node1:/opt/prometheus# systemctl start prometheus
root@node1:/opt/prometheus# systemctl status prometheus
● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-04-07 09:56:24 UTC; 4s ago

Таким образом наш Prometheus будет запускаться из-под непривилегированного пользователя и с помощью systemd.

Итоги

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

Полезные ссылки:

Graphite: Million Metrics Per Second

Graphite: 100 000 writes per second

Nagios

Prometheus vs Graphite

Prometheus Overview

Prometheus Disabled Features

Prometheus Installation

Ansible Prometheus

Архитектура Prometheus

Правила выполнения задания:

После нажатия кнопки «Начать выполнение» для вас будет подготовлено окружение, на котором нужно будет выполнить приведенное ниже задание.

Также вам будут выданы переменные (если они будут нужны), которые в задании указаны в фигурных скобках, — их надо будет подставить при выполнении задания.

После выполнения всех пунктов задания нажмите кнопку «Отправить на проверку». В течение ближайших 3-5 минут скрипт проверит выполнение всех условий и выставит вам оценку от 1 до 5 баллов.

В случае, если вы что-то забыли, можно исправить ошибки и отправить на проверку повторно.

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

Задание:

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

Критерии оценки выполнения задания:

Установите Prometheus:

1.1. Исполняемый файл Prometheus должен находиться в директории /usr/local/bin.

1.2. Директории с шаблонами и библиотеками шаблонов должны находиться внутри отдельной директории /etc/prometheus.

1.3. Конфигурационный файл Prometheus должен находиться по пути /etc/prometheus/prometheus.yml.

1.4. База данных Prometheus должна находиться в директории /var/lib/prometheus/data.

1.5. Prometheus должен быть запущен как сервис c помощью systemd и быть описан в файле /etc/systemd/system/prometheus.service.

1.6. Prometheus сервис должен запускаться из-под отдельного пользователя monitoring.

1.7. Prometheus должен быть запущен на порту 9191 и слушать на всех интерфейсах.