Мониторинг ресурсов с помощю Prometheus + Grafana

Автор: | 14.11.2021

Настройка Prometheus и Grafana

Сами Prometheus и Grafana вполне себе не плохо чувствуют себя в docker-контейнерах (хотя я пропобвал и локальную установку, но так проще дропать сервис если надоест) и по этой причине так в итоге и было сделано. Для запуска проще использовать docker-compose, конфигурация которого будет приведена ниже, но сначала нужно создать файлы конфигурации prometheus.yml и web-config.yml для сервиса prometheus, которые будут лежать в папке config рядом с docker-compose.yml. Так же понадобится создать вручную папку metrics и сделать ее владельцем пользователя с UID=65534 и группой GID=65534. Это нужно чтобы у Prometheus’a не возникло проблем с созданием базы для хранения метрик.

Файл prometheus.yml:

# Sample config for Prometheus.

global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'example'

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['localhost:9093']

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    scrape_timeout: 5s

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

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

  - job_name: node
    # If prometheus-node-exporter is installed, grab stats about the local
    # machine by default.
    static_configs:
      - targets: ['remote_host_ip:9100']

  - job_name: process
    # Prometheus process exporter
    static_configs:
      - targets: ['remote_host_ip:9256']

В разделе scrape_configs, для заданий job_name: node и job_name: process необходимо будет прописать вместо remote_host_ip правильный адрес хоста, который мы будем мониторить. Установка самих exporter-ов (агентов для сбора метрик) будет описана ниже.

Файл web-config.yml:

# TLS and basic authentication configuration example.
#
# Additionally, a certificate and a key file are needed.
# tls_server_config:
#   cert_file: server.crt
#   key_file: server.key

http_server_config:
  # Enable HTTP/2 support. Note that HTTP/2 is only supported with TLS.
  # This can not be changed on the fly.
  # http2: false

# Usernames and passwords required to connect to Prometheus.
# Passwords are hashed with bcrypt: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md#about-bcrypt
basic_auth_users:
  # password 'web'
  web: $2y$10$bIprcxc.jAZYHkGlVujX6OR891UNNyQ7/PZDGSTU9eyQcN5j3sw.y
  # password 'grafana'
  grafana: $2y$10$RpURPsp/cG2.gd4j2PPj/uxo.sm/D18.Dsi92Y8Lh3iwE4IebAfuG

Если вы захотите изменить пароли для пользователей (а точнее служб), которые будут брать данные из prometheus, то вам понадобится установить пакет apache2-utils, а затем сгенерировать свои хеши паролей выполнив:

htpasswd -nBC 10 "" | tr -d ':\n'

Файл docker-compose.yml

version: '3.2'
services:
  prometheus:
    image: prom/prometheus:v2.30.3
    container_name: prometheus
    restart: always
    ports:
    - 9090:9090
    command:
    - --config.file=/etc/prometheus/prometheus.yml
    - --web.config.file=/etc/prometheus/web-config.yml
    - --storage.tsdb.path=/var/lib/prometheus/metrics2/
    volumes:
    - ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
    - ./config/web-config.yml:/etc/prometheus/web-config.yml:ro
    - ./metrics:/var/lib/prometheus/metrics2:rw

  grafana:
    image: grafana/grafana:8.2.2
    container_name: grafana
    restart: always
    ports:
    - 3000:3000

Далее выполняем docker-compose up -d, проверяем что все запустилось с помощью docker-compose ps. В теории у обоих сервисов должно быть состояние "Up". Так же мы можем понаблюдать за логами каждого из сервисов docker-compose logs -f prometheus и docker-compose logs -f grafana. Если там все выглядит нормально и логи не колбасит из-за постоянных рестартов, то значит все идет по плану. В противном случае выполняем docker-compose down, думаем что мы могли упустить, исправляем, запускаем. И так по кругу пока все не заработает.

Настройка exporter-ов (агентов сборам метрик)

Следующим шагом будет настройка exporter’ов. Exporter — это по сути приложение-агент, которое собирает и передает некоторый набор метрик когда к нему обращается сервер Prometheus.

В решении моей задачи я использовал node-exporter — штатный инструмент для сбора общей статистики хоста, а также process-exporter — для сбора статистики по каждому процессу в системе.

Для удобства их установки был создан bash-скрипт, который распоковывает бинарники в нужное место, создает конфигурацию для process-exporter’a, добавляет конфигурации для запуска процессов по средствам systemctl и запускает сервисы.

Рядом с представленым выше скриптом должны находмться два архива, например node_exporter-1.2.2.linux-amd64.tar.gz и process-exporter-0.7.9.linux-amd64.tar.gz. После чего можно запускать скрипт и в теории все должно получиться. Я проверял его работаспособность на Ubuntu 18.04 и Ubuntu 20.04.

Настройка datasource-ов и dashboard-ов в Grafana

Теперь нам необходимо указать в Grafana источник данных для отображения данных в doashboard-ах. Для этого переходим Configuration -> Data sources и нажимаем кнопку Add datasource. В появившейся форме необходимо заполнить поля:

  • Name — имя самого источника.
  • URL — адрес Prometheus-сервера. В нашем случае это будет http://prometheus:9090
  • Basic auth — включить, после чего появятся поля User и Password
  • User — имя пользователя из файла web-config.yml. В данном примере это будет пользователь: grafana
  • Password — пароль пользователя. В нашем случае он тоже будет grafana

Всё остальное оставляем как есть и нажимаем кнопку Save & test. Мы должны увидеть сообщение Datasource is working. Если мы видим что-то другое, то думаем что пошло не так, где была допущена ошибка до тех пор пока на этом шаге всё не получится.

Теперь остаётся добавить дашборды и мы уже сможем видеть данные метрик собираемы с хоста который мы хотим мониторить. Сначала будем импортировать дашборд для Node Exporter’a. Для этого переходим раздел Dashboards -> Manage, нажимаем кнопку Import и в поле Import via panel json вставляем содержимого json-файла, нажимаем кнопку Load. В появившейся форме ничего менять не нужно, только проверить что в поле источника данных Prometheus выбран источник который мы создавали ранее.

По аналогии с предыдущим импортируются json’ы дашбордов для Process Exporter’a. Их у нас будет два, один отображает топ процессов, а второй позволяет отображат на графиках все или только те которые нужны по средствам фильтра.

Далее мы переходим в раздел Dashboards -> General, заходим в нужный дашборд и если всё удалось, то наблюдаем за статистикой в красивой форме. У меня это выглядит так:
Dashboard