Exportador de Prometheus para métricas del servidor PostgreSQL.
Versiones de PostgreSQL probadas por CI: 11
, 12
, 13
, 14
, 15
, 16
Este paquete está disponible para 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
Prueba con:
curl " http://localhost:9187/metrics "
Ejemplo de configuración de Prometheus:
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
Ahora use DATA_SOURCE_PASS_FILE con un archivo montado que contenga la contraseña para evitar tener la contraseña en una variable de entorno.
El proceso del contenedor se ejecuta con uid/gid 65534 (importante para los permisos de archivos).
Esta función está en versión beta y puede requerir cambios en versiones futuras. Los comentarios son bienvenidos.
Este exportador admite el patrón de múltiples objetivos. Esto permite ejecutar una única instancia de este exportador para múltiples objetivos de Postgres. El uso de la funcionalidad multidestino de este exportador es opcional y está destinado a casos en los que es imposible instalar el exportador como sidecar, por ejemplo, servicios administrados por SaaS.
Para utilizar la funcionalidad de múltiples objetivos, envíe una solicitud http al punto final /probe?target=foo:5432
donde el objetivo está configurado en el DSN de la instancia de postgres para extraer las métricas.
Para evitar incluir información confidencial como nombre de usuario y contraseña en la URL, se admiten módulos de autenticación preconfigurados a través de la sección auth_modules del archivo de configuración. auth_modules para DSN se puede utilizar con el punto final /probe
especificando el parámetro http ?auth_module=foo
.
Ejemplo de configuración de Prometheus:
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.
El archivo de configuración controla el comportamiento del exportador. Se puede configurar usando el indicador de línea de comando --config.file
y el valor predeterminado es postgres_exporter.yml
.
Esta sección define los parámetros de autenticación y conexión preestablecidos para su uso en el punto final de múltiples objetivos. auth_modules
es un mapa de módulos cuya clave es el identificador que se puede utilizar en el punto final /probe
. Actualmente solo se admite el tipo userpass
.
Ejemplo:
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>
Para crear la imagen de Docker:
make promu
promu crossbuild -p linux/amd64 -p linux/armv7 -p linux/arm64 -p linux/ppc64le
make docker
Esto creará la imagen de la ventana acoplable como prometheuscommunity/postgres_exporter:${branch}
.
help
Muestra ayuda contextual (pruebe también con --help-long y --help-man).
[no-]collector.database
Habilite el recopilador database
(predeterminado: habilitado).
[no-]collector.database_wraparound
Habilite el recopilador database_wraparound
(predeterminado: deshabilitado).
[no-]collector.locks
Habilita el recopilador locks
(predeterminado: habilitado).
[no-]collector.long_running_transactions
Habilite el recopilador long_running_transactions
(predeterminado: deshabilitado).
[no-]collector.postmaster
Habilita el recopilador postmaster
(predeterminado: deshabilitado).
[no-]collector.process_idle
Habilita el recopilador process_idle
(predeterminado: deshabilitado).
[no-]collector.replication
Habilite el recopilador replication
(predeterminado: habilitado).
[no-]collector.replication_slot
Habilite el recopilador replication_slot
(predeterminado: habilitado).
[no-]collector.stat_activity_autovacuum
Habilite el recolector stat_activity_autovacuum
(predeterminado: deshabilitado).
[no-]collector.stat_bgwriter
Habilite el recopilador stat_bgwriter
(predeterminado: habilitado).
[no-]collector.stat_database
Habilite el recopilador stat_database
(predeterminado: habilitado).
[no-]collector.stat_statements
Habilite el recopilador stat_statements
(predeterminado: deshabilitado).
[no-]collector.stat_user_tables
Habilite el recopilador stat_user_tables
(predeterminado: habilitado).
[no-]collector.stat_wal_receiver
Habilita el recopilador stat_wal_receiver
(predeterminado: deshabilitado).
[no-]collector.statio_user_indexes
Habilite el recopilador statio_user_indexes
(predeterminado: deshabilitado).
[no-]collector.statio_user_tables
Habilite el recopilador statio_user_tables
(predeterminado: habilitado).
[no-]collector.wal
Habilita el recopilador wal
(predeterminado: habilitado).
[no-]collector.xlog_location
Habilite el recopilador xlog_location
(predeterminado: deshabilitado).
config.file
Establece la ruta del archivo de configuración. El valor predeterminado es postgres_exporter.yml
web.systemd-socket
Utilice escuchas de activación de sockets systemd en lugar de escuchas de puertos (solo Linux). El valor predeterminado es false
web.listen-address
Dirección para escuchar la interfaz web y la telemetría. El valor predeterminado es :9187
.
web.config.file
Archivo de configuración para usar TLS y/o autenticación básica. El formato del archivo se describe en el repositorio del kit de herramientas del exportador.
web.telemetry-path
Ruta bajo la cual exponer las métricas. El valor predeterminado es /metrics
.
disable-default-metrics
Utilice solo las métricas proporcionadas desde queries.yaml
a través de --extend.query-path
. El valor predeterminado es false
.
disable-settings-metrics
Utilice la bandera si no desea eliminar pg_settings
. El valor predeterminado es false
.
auto-discover-databases
(DEPRECated) Si se deben descubrir las bases de datos en un servidor dinámicamente. El valor predeterminado es false
.
extend.query-path
(OBSECUTIVO) Ruta a un archivo YAML que contiene consultas personalizadas para ejecutar. Consulte queries.yaml
para ver ejemplos del formato.
dumpmaps
No ejecutar: imprime la representación interna de los mapas de métricas. Útil al depurar un archivo de consultas personalizadas.
constantLabels
(DEPRECated) Etiquetas para establecer en todas las métricas. Una lista de pares label=value
, separados por comas.
version
Muestra la versión de la aplicación.
exclude-databases
(DEPRECADO) Una lista de bases de datos para eliminar cuando autoDiscoverDatabases está habilitado.
include-databases
(DEPRECated) Una lista de bases de datos que se incluirán solo cuando autoDiscoverDatabases esté habilitado.
log.level
Establece el nivel de registro: uno de debug
, info
, warn
, error
.
log.format
Establece el formato de registro: uno de logfmt
, json
.
Las siguientes variables de entorno configuran el exportador:
DATA_SOURCE_NAME
el formato heredado predeterminado. Acepta argumentos en forma de URI y clave=valor. El URI puede contener el nombre de usuario y la contraseña para conectarse.
DATA_SOURCE_URI
una alternativa a DATA_SOURCE_NAME
que acepta exclusivamente el nombre de host sin un componente de nombre de usuario y contraseña. Por ejemplo, my_pg_hostname
o my_pg_hostname:5432/postgres?sslmode=disable
.
DATA_SOURCE_URI_FILE
Lo mismo que arriba pero lee el URI de un archivo.
DATA_SOURCE_USER
Cuando se usa DATA_SOURCE_URI
, esta variable de entorno se usa para especificar el nombre de usuario.
DATA_SOURCE_USER_FILE
Lo mismo, pero lee el nombre de usuario de un archivo.
DATA_SOURCE_PASS
Cuando se usa DATA_SOURCE_URI
, esta variable de entorno se usa para especificar la contraseña para conectarse.
DATA_SOURCE_PASS_FILE
Lo mismo que arriba pero lee la contraseña de un archivo.
PG_EXPORTER_WEB_TELEMETRY_PATH
Ruta bajo la cual exponer las métricas. El valor predeterminado es /metrics
.
PG_EXPORTER_DISABLE_DEFAULT_METRICS
Utilice solo métricas proporcionadas desde queries.yaml
. El valor puede ser true
o false
. El valor predeterminado es false
.
PG_EXPORTER_DISABLE_SETTINGS_METRICS
Utilice la bandera si no desea eliminar pg_settings
. El valor puede ser true
o false
. El valor predeterminado es false
.
PG_EXPORTER_AUTO_DISCOVER_DATABASES
(DEPRECATED) Si se deben descubrir las bases de datos en un servidor de forma dinámica. El valor puede ser true
o false
. El valor predeterminado es false
.
PG_EXPORTER_EXTEND_QUERY_PATH
Ruta a un archivo YAML que contiene consultas personalizadas para ejecutar. Consulte queries.yaml
para ver ejemplos del formato.
PG_EXPORTER_CONSTANT_LABELS
(DEPRECATED) Etiquetas para establecer en todas las métricas. Una lista de pares label=value
, separados por comas.
PG_EXPORTER_EXCLUDE_DATABASES
(DEPRECATED) Una lista de bases de datos separadas por comas para eliminar cuando autoDiscoverDatabases está habilitado. El valor predeterminado es una cadena vacía.
PG_EXPORTER_INCLUDE_DATABASES
(DEPRECATED) Una lista de bases de datos separadas por comas que se incluirán únicamente cuando autoDiscoverDatabases esté habilitado. El valor predeterminado es una cadena vacía, lo que significa permitir todo.
PG_EXPORTER_METRIC_PREFIX
Un prefijo que se utilizará para cada una de las métricas predeterminadas exportadas por postgres-exporter. El valor predeterminado es pg
Las configuraciones establecidas por las variables de entorno que comienzan con PG_
se sobrescribirán con el indicador CLI correspondiente, si se proporciona.
El nombre de la fuente de datos del servidor PostgreSQL se debe configurar mediante la variable de entorno DATA_SOURCE_NAME
.
Para ejecutarlo localmente en una instalación predeterminada de Debian/Ubuntu, esto funcionará (transpóngalo al script de inicio según corresponda):
sudo -u postgres DATA_SOURCE_NAME="user=postgres host=/var/run/postgresql/ sslmode=disable" postgres_exporter
Además, puede configurar una lista de fuentes para extraer diferentes instancias de la configuración de un exportador. Simplemente defina una cadena separada por comas.
sudo -u postgres DATA_SOURCE_NAME="port=5432,port=6432" postgres_exporter
Consulte el módulo github.com/lib/pq para conocer otras formas de formatear la cadena de conexión.
El exportador intentará exportar dinámicamente métricas adicionales si se agregan en el futuro, pero se marcarán como "sin tipo". Se pueden crear fácilmente mapas de métricas adicionales a partir de la documentación de Postgres copiando las tablas y usando el siguiente fragmento de 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 ())
Ajuste apropiadamente el valor del tipo de valor prometheus resultante. Esto ayuda a crear métricas ricas y autodocumentadas para el exportador.
Esta característica está en desuso en favor de las funciones de recopilador integradas. Para el monitoreo genérico de bases de datos SQL, consulte sql_exporter.
El argumento de línea de comandos -extend.query-path especifica un archivo YAML que contiene consultas adicionales para ejecutar. Se proporcionan algunos ejemplos en queries.yaml.
Para trabajar con versiones de Postgres no compatibles oficialmente (por ejemplo, 8.2.15) o variantes de Postgres (por ejemplo, Greenplum), puede desactivar las métricas predeterminadas con la marca --disable-default-metrics
. Esto elimina todas las métricas integradas y utiliza solo métricas definidas por consultas en el archivo queries.yaml
que usted proporciona (por lo que debe proporcionar una; de lo contrario, el exportador no devolverá nada más que estados internos y no su base de datos).
Para extraer métricas de todas las bases de datos en un servidor de bases de datos, los DSN de la base de datos se pueden descubrir dinámicamente mediante el indicador --auto-discover-databases
. Cuando sea verdadero, SELECT datname FROM pg_database WHERE datallowconn = true AND datistemplate = false and datname != current_database()
se ejecuta para todos los DSN configurados. A partir del resultado se crea un nuevo conjunto de DSN para el cual se eliminan las métricas.
Además, la opción --exclude-databases
agrega la posibilidad de filtrar el resultado del descubrimiento automático para descartar bases de datos que no necesita.
Si desea incluir solo un subconjunto de bases de datos, puede usar la opción --include-databases
. El exportador todavía realiza una solicitud a la tabla pg_database
, pero la elimina solo si la base de datos está en la lista de inclusión.
Para poder recopilar métricas de vistas pg_stat*
como no superusuario en versiones del servidor PostgreSQL >= 10, puede otorgar las funciones integradas pg_monitor
o pg_read_all_stats
al usuario. Si necesita monitorear servidores PostgreSQL más antiguos, tendrá que crear funciones y vistas como superusuario y asignarles permisos por separado.
-- 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;
Ejecute el siguiente comando si usa versiones de PostgreSQL>= 10
GRANT pg_monitor to postgres_exporter;
Ejecute los siguientes comandos SQL solo si usa versiones de PostgreSQL anteriores a 10. En PostgreSQL, las vistas se ejecutan con los permisos del usuario que las creó para que puedan actuar como barreras de seguridad. Es necesario crear funciones para compartir estos datos con quienes no son superusuarios. Solo la creación de vistas omitirá los datos más importantes.
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;
NOTA
Recuerde usar el nombre de la base de datospostgres
en la cadena de conexión: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