Сегодня покажу, как прикрутить экспортера для сбора метрик с базы postgresql.
Установка postgres экспортера
Итак мы имеем сервер с установленным на нем postgresql. Создадим пользователя, через которого экспортер будет подключатся к базе, так как использовать стандартного пользователя postgres
не есть хорошо. Новый пользователь будет иметь полный read-only доступ к базе:
sadmin@db01:~$ sudo -u postgres psql
---
postgres=# create user postgresql_exporter with password 'Pwdpwd1122';
postgres=# grant select on all tables in schema public to postgresql_exporter;
Проверим доступ к базе, подключится из под этого пользователя и попробуем создать базу например:
sadmin@db01:~$ psql -U postgresql_exporter -h localhost postgres
---
postgres=> create database test1;
ERROR: permission denied to create database
Пользователь postgresql_exporter
теперь имеет доступ ко всем созданным таблицам на текущий момент. При появлении новых схем или табличек в базе нам нужно будет повторно переназначать права. Что бы избежать повторных действий, можем воспользоваться фичей дефолтного назначения прав.:
postgres=# alter default privileges in schema public
postgres-# grant select on tables to postgresql_exporter;
Подготовительные моменты закончены, идем в гитхаб и выбираем последний релиз с экспортером. Копируем ссылку, с качаем архив:
sadmin@db01:~$ cd /tmp/
sadmin@db01:/tmp$ wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.12.0/postgres_exporter-0.12.0.linux-amd64.tar.gz
Распаковываем архив, бинарь с экспортером кладем в каталог исполняемых файлов - /usr/local/bin
:
sadmin@db01:/tmp$ tar -zxvf postgres_exporter-0.12.0.linux-amd64.tar.gz
sadmin@db01:/tmp$ sudo mv postgres_exporter-0.12.0.linux-amd64/postgres_exporter /usr/local/bin/
Ну и наконец пишем systemd-unit на запуск экспортера.
sadmin@db01:~$ sudo vim /etc/systemd/system/postgres-exporter.service
---
[Unit]
Description=Prometheus PostgreSQL Exporter
After=network.target
[Service]
Type=simple
Restart=always
User=postgres
Group=postgres
Environment=DATA_SOURCE_NAME="postgresql://postgresql_exporter:Pwdpwd1122@localhost/postgres?sslmode=disable"
ExecStart=/usr/local/bin/postgres_exporter
[Install]
WantedBy=multi-user.target
Перечитываем конфигурацию systemd, и запускаем сервис:
sadmin@db01:~$ sudo systemctl daemon-reload
sadmin@db01:~$ sudo systemctl enable --now postgres-exporter
Теперь можем кинуть curl запрос на локальный порт, что бы проверить что все отдается.
sadmin@db01:~$ curl -v http://localhost:9187/metrics
Отлично все работает, остается решить вопрос с безопасностью. Как я понял в режим бетки включена возможность Basic Auth/TLS, и для включения этих фишек достаточно прописать конфигурационный файл в postgres_exporter.yml
.
Но так как большинство серверов баз данных спрятано за вебсервером или каким то прокси, то думаю проще будет размутить эти фишки на проксе.
В качестве прокси сервера у меня уже настроен nginx. И помните ранее при настройки node_exporter я описывал конфигурацию, как через один виртуальный сервер разрулить доступ на все экспортеры. Так вот открывает этот же конфиг и просто добавляем новый location
:
server {
listen 443 ssl;
server_name node-exporter.local;
access_log off;
error_log off;
allow 10.8.10.14/32;
allow 10.8.10.15/32;
deny all;
ssl_certificate /etc/ssl/node_exporter/node_exporter.crt;
ssl_certificate_key /etc/ssl/node_exporter/node_exporter.key;
auth_basic "Exporters area";
auth_basic_user_file /etc/nginx/.htpasswd;
location /node-exporter {
proxy_pass http://localhost:9100/metrics;
}
location /postgres-exporter {
proxy_pass http://localhost:9187/metrics;
}
}
Уже в имеющийся конфиг я добавил:
location /postgres-exporter {
proxy_pass http://localhost:9187/metrics;
}
Про остальные директивы можно почитать тут. Стоит упомянуть про сертификаты, я временно выписал самоподписной серт, и закинул его на сервер с prometheus. Если же есть возможность использовать серты от LE, выписываейте их.
Конфигурация prometheus
Перезапускаем nginx, и пробуем с сервера мониторинга кинуть запрос на этот урл.
root@prometheus01:~# curl --insecure --user prometheus https://node-exporter.local/postgres-exporter
В результате выполнения команды, должно отсыпать много метрик.
Создадим новую джобу в конфигурации prometheus:
root@prometheus01:~# vim /etc/prometheus/prometheus.yml
---
- job_name: postgres-exporter-tls
scheme: https
basic_auth:
username: prometheus
password: "Pwdpwd1122"
tls_config:
ca_file: /etc/prometheus/exporter_ssl/node_exporter.crt
insecure_skip_verify: true
metrics_path: /postgres-exporter
static_configs:
- targets:
- node-exporter.local:443
Перезапускаем прометей, и идем в графану добавлять дешку под экспортер:
root@prometheus01:~# systemctl restart prometheus
В графане импортируем вот этот или этот дэшбоард и радуемся.