Prometheus: Ansible, NGINX и Grafana dashboard

Автор: | 23/10/2017
 

Продолжаем с Prometheus

Последней задачей было Azure: подключение volume – ARM, Ansible и данные Prometheus.

Теперь – добавим Grafana для визуализации данных.

Надо – обновить docker-compose файл, добавить запуск контейнера с Grafana, и в самой Grafana – настроить backend, что бы она получала данные с Prometheus сервера.

Кроме того – надо обновить NGINX (в нём в блоге не писал), что бы он в качестве бекенда использовал не Prometheus, а Grafana.

В целом сетап сейчас выглядит так, как описано в посте Ansible: роли для Docker Compose, Prometheus и node_exporter: есть запуск Prometheus из Docker Compose, есть установка и запуск node_exporter из Ansible. Docker и всё прочее тоже управляется через Ansible роли.

Grafana

Grafana и HTTP Auth

Grafana использует файл настроек /etc/grafana/grafana.ini.

Т.к. у нас она будет работать за NGINX revers-proxy, на котором включена http-авторизация – надо выключить авторизацию в самой Grafana.

В каталоге ansible/jm-monitoring/roles/prometheus/files/ добавляем файл настроек для Grafanaansible/jm-monitoring/roles/prometheus/files/grafana.ini, в котором отключаем авторизацию:

...
#################################### Basic Auth ##########################
[auth.basic]
enabled = false
...

Без этого – будет возникать ошибка:

{‘message” : “Basic auth failed”}

Другой вариант – передать параметр через переменные окружения Grafana.

Обновляем роль prometheus, в tasks которой выполняется копирование файлов – добавляем создание каталога для конфига:

...
- name: Create Grafana config directory
  file:
    path: "/etc/grafana"
    state: directory
    owner: "{{ prometheus_user }}"
    group: "{{ prometheus_group }}"
    mode: 0775
    recurse: yes
...

И копирование конфига для Grafana:

...
- name: Create Grafana config directory
  file:
    path: "/etc/grafana"
    state: directory
    owner: "{{ prometheus_user }}"
    group: "{{ prometheus_group }}"
    mode: 0775
    recurse: yes
...

Позже, наверно – Grafana надо будет вынести в отдельную роль.

Docker Compose

Docker Compose запускается из шаблона, который лежит в Ansible роли prometehus:

[simterm]

$ ls -l ansible/jm-monitoring/roles/prometheus/templates/
total 4
-rw-r--r-- 1 setevoy setevoy 256 Oct 12 13:35 docker-compose.yml.j2

[/simterm]

Во время провижена из Jenkins – файл обновляется с данными из переменных, копируется на хост, и там запускаются docker-контейнеры.

Обновляем его, добавляем запуск Grafana:

version: '2'
  
services:

  prometheus:

    network_mode: "host"

    image: prom/prometheus
    expose:
      - 9090
    ports:
      - 9090:9090
    volumes:
      - /etc/prometheus/:/etc/prometheus/
      - {{ prometheus_data_mount_path }}:/prometheus

  grafana-ui:

    network_mode: "host"
    image: grafana/grafana
    ports:
    - 3000:3000
    volumes:
      - /etc/grafana/grafana.ini:/etc/grafana/grafana.ini

NGINX

NGINX устанавливается из роли nginx:

[simterm]

$ ls -l ansible/jm-monitoring/roles/nginx/
total 20
drwxr-xr-x 2 setevoy setevoy 4096 Sep 26 14:26 files
drwxr-xr-x 2 setevoy setevoy 4096 Sep 25 17:04 handlers
drwxr-xr-x 2 setevoy setevoy 4096 Sep 27 11:39 tasks
drwxr-xr-x 2 setevoy setevoy 4096 Sep 27 11:39 templates
drwxr-xr-x 2 setevoy setevoy 4096 Sep 26 16:10 vars

[/simterm]

Файл настроек создаётся из шаблона:

[simterm]

$ ls -l ansible/jm-monitoring/roles/nginx/templates/
total 8
-rw-r--r-- 1 setevoy setevoy  875 Sep 20 17:31 nginx.conf
-rw-r--r-- 1 setevoy setevoy 1477 Sep 27 11:18 nginx_vhost.conf

[/simterm]

Обновляем nginx_vhost.conf, добавляем upstream для Grafana:

...
upstream grafana_ui {
    server 127.0.0.1:3000;
}
...

И обновляем location /:

...
    location / {

        auth_basic_user_file /var/www/{{ inventory_hostname }}/.htaccess;
        auth_basic "Password-protected Area";

        allow {{ nginx_allow_kiev_ip }};
        allow {{ nginx_allow_berlin_ip }};
        deny  all;

        proxy_redirect          off;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://{{ upstream_name }}$request_uri;
    }
...

Добавляем переменную upstream_name в переменные – файл provision.yml:

- hosts: all
  become:
    true
  roles:
    ...
    - role: nginx
      nginx_allow_kiev_ip: 194.***.***.45
      nginx_allow_berlin_ip: 37.***.***.130
      upstream_name: grafana_ui
    - role: mongrelion.docker
    - role: docker-compose
    - role: prometheus
    - role: UnderGreen.prometheus-node-exporter
      prometheus_node_exporter_config_flags:
        'web.listen-address': '127.0.0.1:9100'
        'log.level': 'info'

Вроде всё.

Пушим изменения в репозиторий, запускам билд Jenkins – готово:

Логин-пароль по умолчанию – admin:admin, логинимся – красота:

Настройка Grafana

Grafana хранит все свои данные в каталоге /var/lib/grafana:

[simterm]

root@63315edb890f:/# ls -l /var/lib/grafana
total 120
-rw-r--r-- 1 grafana grafana 109568 Oct 23 11:47 grafana.db
drwxr-xr-x 2 grafana grafana   4096 Oct 23 11:06 plugins
drwx------ 5 grafana grafana   4096 Oct 23 11:47 sessions

[/simterm]

Наверно надо будет монтировать его тоже отдельным разделом из Azure Storage.

Другой вариант – использовать внешнюю базу, MySQL или Postgres. Документация – тут>>>.

Добавление Data Source Prometehus

Добавляем Prometehus. Документация – тут>>>.

Кликаем на Add Data Source, указываем параметры Prometheus сервера:

Добавление Dashboard

Самый простой способ – импортировать готовую с Grafana Labs.

Позже – напишем свой велосипед.

У нас есть node_exporter, добавим для него графики.

Слева кликаем Dashboards > Import, указываем ID.

Например – Node Exporter Server Metrics, ID 405:

Жмём Import – и получаем графики из метрик, полученных от node_exporter через Prometheus:

Настройка графиков – в следующий раз.

Ссылки по теме

Документация – шикарна:

Using Prometheus in Grafana

Configuration

Running Grafana behind a reverse proxy

Adding & Editing Graphs and Panels

Dashboards