Продолжаем с 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/ добавляем файл настроек для Grafana — ansible/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:
Настройка графиков — в следующий раз.
Ссылки по теме
Документация — шикарна:
Running Grafana behind a reverse proxy
Adding & Editing Graphs and Panels








