Сегодня покажу, как прикрутить экспортера для сбора метрик с базы 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

В графане импортируем вот этот или этот дэшбоард и радуемся.