Экспортер Prometheus для метрик сервера PostgreSQL.
Версии PostgreSQL, протестированные CI: 11
, 12
, 13
, 14
, 15
, 16
Этот пакет доступен для Docker:
# Start an example database
docker run --net=host -it --rm -e POSTGRES_PASSWORD=password postgres
# Connect to it
docker run
--net=host
-e DATA_SOURCE_URI="localhost:5432/postgres?sslmode=disable"
-e DATA_SOURCE_USER=postgres
-e DATA_SOURCE_PASS=password
quay.io/prometheuscommunity/postgres-exporter
Тест с:
curl " http://localhost:9187/metrics "
Пример конфигурации Прометея:
scrape_configs :
- job_name : postgres
static_configs :
- targets : ["127.0.0.1:9187"] # Replace IP with the hostname of the docker container if you're running the container in a separate network
Теперь используйте DATA_SOURCE_PASS_FILE с смонтированным файлом, содержащим пароль, чтобы предотвратить попадание пароля в переменную среды.
Процесс контейнера запускается с идентификатором uid/gid 65534 (важно для прав доступа к файлам).
Эта функция находится в стадии бета-тестирования и может потребовать изменений в будущих выпусках. Обратная связь приветствуется.
Этот экспортер поддерживает многоцелевой шаблон. Это позволяет запустить один экземпляр этого экспортера для нескольких целей Postgres. Использование многоцелевой функциональности этого экспортера не является обязательным и предназначено для случаев, когда невозможно установить экспортер в качестве дополнительной программы, например, для служб, управляемых SaaS.
Чтобы использовать функцию нескольких целей, отправьте HTTP-запрос на конечную точку /probe?target=foo:5432
, где в качестве цели задан DSN экземпляра postgres, из которого нужно очистить метрики.
Чтобы избежать размещения конфиденциальной информации, такой как имя пользователя и пароль, в URL-адресе, предварительно настроенные модули аутентификации поддерживаются через раздел auth_modules файла конфигурации. auth_modules для DSN можно использовать с конечной точкой /probe
, указав http-параметр ?auth_module=foo
.
Пример конфигурации Прометея:
scrape_configs :
- job_name : ' postgres '
static_configs :
- targets :
- server1:5432
- server2:5432
metrics_path : /probe
params :
auth_module : [foo]
relabel_configs :
- source_labels : [__address__]
target_label : __param_target
- source_labels : [__param_target]
target_label : instance
- target_label : __address__
replacement : 127.0.0.1:9116 # The postgres exporter's real hostname:port.
Файл конфигурации управляет поведением экспортера. Его можно установить с помощью флага командной строки --config.file
и по умолчанию — postgres_exporter.yml
.
В этом разделе определяются предустановленные параметры аутентификации и подключения для использования в многоцелевой конечной точке. auth_modules
— это карта модулей, где ключ является идентификатором, который можно использовать в конечной точке /probe
. В настоящее время поддерживается только тип userpass
.
Пример:
auth_modules :
foo1 : # Set this to any name you want
type : userpass
userpass :
username : first
password : firstpass
options :
# options become key=value parameters of the DSN
sslmode : disable
git clone https://github.com/prometheus-community/postgres_exporter.git
cd postgres_exporter
make build
./postgres_exporter <flags>
Чтобы создать образ Docker:
make promu
promu crossbuild -p linux/amd64 -p linux/armv7 -p linux/arm64 -p linux/ppc64le
make docker
Это создаст образ докера как prometheuscommunity/postgres_exporter:${branch}
.
help
Показать контекстно-зависимую справку (также попробуйте --help-long и --help-man).
[no-]collector.database
Включить сборщик database
(по умолчанию: включено).
[no-]collector.database_wraparound
Включить сборщик database_wraparound
(по умолчанию: отключено).
[no-]collector.locks
Включить сборщик locks
(по умолчанию: включено).
[no-]collector.long_running_transactions
Включить сборщик long_running_transactions
(по умолчанию: отключено).
[no-]collector.postmaster
Включить сборщик postmaster
(по умолчанию: отключен).
[no-]collector.process_idle
Включить process_idle
(по умолчанию: отключен).
[no-]collector.replication
Включить сборщик replication
(по умолчанию: включено).
[no-]collector.replication_slot
Включить сборщик replication_slot
(по умолчанию: включено).
[no-]collector.stat_activity_autovacuum
Включить сборщик stat_activity_autovacuum
(по умолчанию: отключено).
[no-]collector.stat_bgwriter
Включить сборщик stat_bgwriter
(по умолчанию: включено).
[no-]collector.stat_database
Включить сборщик stat_database
(по умолчанию: включено).
[no-]collector.stat_statements
Включить сборщик stat_statements
(по умолчанию: отключено).
[no-]collector.stat_user_tables
Включить сборщик stat_user_tables
(по умолчанию: включено).
[no-]collector.stat_wal_receiver
Включить сборщик stat_wal_receiver
(по умолчанию: отключено).
[no-]collector.statio_user_indexes
Включите сборщик statio_user_indexes
(по умолчанию: отключено).
[no-]collector.statio_user_tables
Включить сборщик statio_user_tables
(по умолчанию: включено).
[no-]collector.wal
Включить сборщик wal
(по умолчанию: включено).
[no-]collector.xlog_location
Включить сборщик xlog_location
(по умолчанию: отключено).
config.file
Установите путь к файлу конфигурации. По умолчанию — postgres_exporter.yml
web.systemd-socket
Использовать прослушиватели активации сокетов systemd вместо прослушивателей портов (только для Linux). По умолчанию — false
web.listen-address
Адрес для прослушивания веб-интерфейса и телеметрии. По умолчанию :9187
.
web.config.file
Файл конфигурации для использования TLS и/или базовой аутентификации. Формат файла описан в репозитории экспортера-инструментария.
web.telemetry-path
Путь, по которому будут предоставляться метрики. По умолчанию — /metrics
.
disable-default-metrics
Используйте только метрики, предоставленные из queries.yaml
через --extend.query-path
. По умолчанию — false
.
disable-settings-metrics
Используйте этот флаг, если вы не хотите очищать pg_settings
. По умолчанию — false
.
auto-discover-databases
(УСТАРЕЛО) Следует ли динамически обнаруживать базы данных на сервере. По умолчанию — false
.
extend.query-path
(УСТАРЕЛО) Путь к файлу YAML, содержащему пользовательские запросы для запуска. Ознакомьтесь с queries.yaml
чтобы увидеть примеры формата.
dumpmaps
Не запускать — печатать внутреннее представление карт метрик. Полезно при отладке файла пользовательских запросов.
constantLabels
(УСТАРЕЛО) Ярлыки для установки во всех метриках. Список пар label=value
, разделенных запятыми.
version
Показать версию приложения.
exclude-databases
(УСТАРЕЛО) Список баз данных, которые необходимо удалить, если включено autoDiscoverDatabases.
include-databases
(УСТАРЕЛО) Список баз данных, которые следует включать только при включении autoDiscoverDatabases.
log.level
Установить уровень ведения журнала: один из debug
, info
, warn
, error
.
log.format
Установите формат журнала: один из logfmt
, json
.
Следующие переменные среды настраивают экспортер:
DATA_SOURCE_NAME
устаревший формат по умолчанию. Принимает форму URI и аргументы формы ключ=значение. URI может содержать имя пользователя и пароль для подключения.
DATA_SOURCE_URI
альтернатива DATA_SOURCE_NAME
, которая принимает исключительно имя хоста без компонента имени пользователя и пароля. Например, my_pg_hostname
или my_pg_hostname:5432/postgres?sslmode=disable
.
DATA_SOURCE_URI_FILE
То же, что и выше, но считывает URI из файла.
DATA_SOURCE_USER
При использовании DATA_SOURCE_URI
эта переменная среды используется для указания имени пользователя.
DATA_SOURCE_USER_FILE
То же самое, но считывает имя пользователя из файла.
DATA_SOURCE_PASS
При использовании DATA_SOURCE_URI
эта переменная среды используется для указания пароля для подключения.
DATA_SOURCE_PASS_FILE
То же, что и выше, но считывает пароль из файла.
PG_EXPORTER_WEB_TELEMETRY_PATH
Путь для предоставления метрик. По умолчанию — /metrics
.
PG_EXPORTER_DISABLE_DEFAULT_METRICS
Используйте только метрики, предоставленные из queries.yaml
. Значение может быть true
или false
. По умолчанию — false
.
PG_EXPORTER_DISABLE_SETTINGS_METRICS
Используйте этот флаг, если вы не хотите очищать pg_settings
. Значение может быть true
или false
. По умолчанию — false
.
PG_EXPORTER_AUTO_DISCOVER_DATABASES
(УСТАРЕЛО) Следует ли динамически обнаруживать базы данных на сервере. Значение может быть true
или false
. По умолчанию — false
.
PG_EXPORTER_EXTEND_QUERY_PATH
Путь к файлу YAML, содержащему пользовательские запросы для запуска. Ознакомьтесь с queries.yaml
чтобы увидеть примеры формата.
PG_EXPORTER_CONSTANT_LABELS
(УСТАРЕЛО) Ярлыки для установки во всех метриках. Список пар label=value
, разделенных запятыми.
PG_EXPORTER_EXCLUDE_DATABASES
(УСТАРЕЛО) Список баз данных, разделенных запятыми, которые необходимо удалить, если включено autoDiscoverDatabases. По умолчанию — пустая строка.
PG_EXPORTER_INCLUDE_DATABASES
(УСТАРЕЛО) Список баз данных, разделенных запятыми, которые следует включать только при включении autoDiscoverDatabases. По умолчанию — пустая строка, что означает разрешение всего.
PG_EXPORTER_METRIC_PREFIX
Префикс, используемый для каждой метрики по умолчанию, экспортируемой postgres-exporter. По умолчанию – pg
Настройки, заданные переменными среды, начинающимися с PG_
будут перезаписаны соответствующим флагом CLI, если он задан.
Имя источника данных сервера PostgreSQL должно быть установлено через переменную среды DATA_SOURCE_NAME
.
Для локального запуска при установке Debian/Ubuntu по умолчанию это будет работать (при необходимости транспонируйте в сценарий инициализации):
sudo -u postgres DATA_SOURCE_NAME="user=postgres host=/var/run/postgresql/ sslmode=disable" postgres_exporter
Кроме того, вы можете установить список источников для очистки разных экземпляров из одной настройки экспортера. Просто определите строку, разделенную запятыми.
sudo -u postgres DATA_SOURCE_NAME="port=5432,port=6432" postgres_exporter
См. модуль github.com/lib/pq, чтобы узнать о других способах форматирования строки подключения.
Экспортер попытается динамически экспортировать дополнительные показатели, если они будут добавлены в будущем, но они будут помечены как «нетипизированные». Дополнительные карты метрик можно легко создать из документации Postgres, скопировав таблицы и используя следующий фрагмент Python:
x = """tab separated raw text of a documentation table"""
for l in StringIO ( x ):
column , ctype , description = l . split ( ' t ' )
print """"{0}" : {{ prometheus.CounterValue, prometheus.NewDesc("pg_stat_database_{0}", "{2}", nil, nil) }}, """ . format ( column . strip (), ctype , description . strip ())
Соответствующим образом откорректируйте значение результирующего типа значения Prometheus. Это помогает экспортеру создавать богатые самодокументируемые показатели.
Эта функция устарела в пользу встроенных функций сборщика. Для общего мониторинга базы данных SQL см. файл sql_exporter.
Аргумент командной строки -extend.query-path указывает файл YAML, содержащий дополнительные запросы для запуска. Некоторые примеры приведены в файле query.yaml.
Для работы с неофициально поддерживаемыми версиями Postgres (например, 8.2.15) или вариантами Postgres (например, Greenplum) вы можете отключить метрики по умолчанию с помощью флага --disable-default-metrics
. При этом удаляются все встроенные метрики и используются только метрики, определенные запросами в предоставленном вами файле queries.yaml
(поэтому вы должны указать один, иначе экспортер не вернет ничего, кроме внутренних статусов, а не вашей базы данных).
Чтобы очистить метрики из всех баз данных на сервере базы данных, DSN базы данных можно динамически обнаружить с помощью флага --auto-discover-databases
. Если это правда, SELECT datname FROM pg_database WHERE datallowconn = true AND datistemplate = false and datname != current_database()
запускается для всех настроенных DSN. В результате создается новый набор DSN, для которого собираются метрики.
Кроме того, опция --exclude-databases
добавляет возможность фильтровать результаты автоматического обнаружения, чтобы исключить ненужные вам базы данных.
Если вы хотите включить только подмножество баз данных, вы можете использовать опцию --include-databases
. Экспортер по-прежнему выполняет запрос к таблице pg_database
, но выполняет очистку только в том случае, если база данных находится в списке включения.
Чтобы иметь возможность собирать метрики из представлений pg_stat*
от имени пользователя, не являющегося суперпользователем, в версиях сервера PostgreSQL >= 10, вы можете предоставить пользователю встроенные роли pg_monitor
или pg_read_all_stats
. Если вам необходимо отслеживать старые серверы PostgreSQL, вам придется создавать функции и представления в качестве суперпользователя и назначать им разрешения отдельно.
-- To use IF statements, hence to be able to check if the user exists before
-- attempting creation, we need to switch to procedural SQL (PL/pgSQL)
-- instead of standard SQL.
-- More: https://www.postgresql.org/docs/9.3/plpgsql-overview.html
-- To preserve compatibility with <9.0, DO blocks are not used; instead,
-- a function is created and dropped.
CREATE OR REPLACE FUNCTION __tmp_create_user () returns void as $$
BEGIN
IF NOT EXISTS (
SELECT -- SELECT list can stay empty for this
FROM pg_catalog . pg_user
WHERE usename = ' postgres_exporter ' ) THEN
CREATE USER postgres_exporter ;
END IF;
END;
$$ language plpgsql;
SELECT __tmp_create_user();
DROP FUNCTION __tmp_create_user();
ALTER USER postgres_exporter WITH PASSWORD ' password ' ;
ALTER USER postgres_exporter SET SEARCH_PATH TO postgres_exporter,pg_catalog;
-- If deploying as non-superuser (for example in AWS RDS), uncomment the GRANT
-- line below and replace <MASTER_USER> with your root user.
-- GRANT postgres_exporter TO <MASTER_USER>;
GRANT CONNECT ON DATABASE postgres TO postgres_exporter;
Выполните следующую команду, если вы используете версии PostgreSQL >= 10.
GRANT pg_monitor to postgres_exporter;
Выполняйте следующие команды SQL только в том случае, если вы используете версии PostgreSQL старше 10. В PostgreSQL представления запускаются с разрешениями пользователя, который их создал, поэтому они могут выступать в качестве барьеров безопасности. Необходимо создать функции для обмена этими данными с пользователями, не являющимися суперпользователями. Только при создании представлений самые важные биты данных будут упущены.
CREATE SCHEMA IF NOT EXISTS postgres_exporter;
GRANT USAGE ON SCHEMA postgres_exporter TO postgres_exporter;
CREATE OR REPLACE FUNCTION get_pg_stat_activity () RETURNS SETOF pg_stat_activity AS
$$ SELECT * FROM pg_catalog . pg_stat_activity ; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;
CREATE OR REPLACE VIEW postgres_exporter .pg_stat_activity
AS
SELECT * from get_pg_stat_activity();
GRANT SELECT ON postgres_exporter . pg_stat_activity TO postgres_exporter;
CREATE OR REPLACE FUNCTION get_pg_stat_replication () RETURNS SETOF pg_stat_replication AS
$$ SELECT * FROM pg_catalog . pg_stat_replication ; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;
CREATE OR REPLACE VIEW postgres_exporter .pg_stat_replication
AS
SELECT * FROM get_pg_stat_replication();
GRANT SELECT ON postgres_exporter . pg_stat_replication TO postgres_exporter;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE OR REPLACE FUNCTION get_pg_stat_statements () RETURNS SETOF pg_stat_statements AS
$$ SELECT * FROM public . pg_stat_statements ; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;
CREATE OR REPLACE VIEW postgres_exporter .pg_stat_statements
AS
SELECT * FROM get_pg_stat_statements();
GRANT SELECT ON postgres_exporter . pg_stat_statements TO postgres_exporter;
ПРИМЕЧАНИЕ
Не забудьте использовать имя базы данныхpostgres
в строке подключения:DATA_SOURCE_NAME=postgresql://postgres_exporter:password@localhost:5432/postgres?sslmode=disable
# Run the unit tests
make test
# Start the test database with docker
docker run -p 5432:5432 -e POSTGRES_DB=circle_test -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=test -d postgres
# Run the integration tests
DATA_SOURCE_NAME='postgresql://postgres:test@localhost:5432/circle_test?sslmode=disable' GOOPTS='-v -tags integration' make test