Configuración de Database Monitoring para Postgres autoalojado
Database Monitoring te proporciona una amplia visibilidad de tus bases de datos Postgres mediante la exposición de métricas de consultas, muestras de consultas, explain-plans, estados de bases de datos, conmutaciones por error y eventos.
El Agent recopila telemetría directamente de la base de datos iniciando sesión como usuario de sólo lectura. Realiza la siguiente configuración para habilitar Database Monitoring con tu base de datos Postgres:
- Configura parámetros de bases de datos.
- Concede al Agent acceso a la base de datos.
- Instala el Agent.
Antes de empezar
- Versiones de PostgreSQL compatibles
- 9.6, 10, 11, 12, 13, 14, 15, 16
- Requisitos previos
- Los módulos de Postgres adicionales proporcionados deben estar instalados. En la mayoría de las instalaciones, esto se incluye por defecto, pero las instalaciones menos convencionales pueden requerir una instalación adicional de tu versión del paquete
postgresql-contrib
. - Versiones del Agent compatibles
- v7.36.1 o posterior
- Impacto en el rendimiento
- La configuración de Database Monitoring predeterminada del Agent es conservadora, pero puedes ajustar algunos parámetros como el intervalo de recopilación y la frecuencia de muestreo de consultas según tus necesidades. Para la mayoría de las cargas de trabajo, el Agent representa menos del uno por ciento del tiempo de ejecución de la consulta en la base de datos y menos del uno por ciento del uso de CPU.
Database Monitoring se ejecuta como una integración sobre el Agent de base (consulta las referencias). - Proxies, balanceadores de carga y agrupadores de conexiones
- El Datadog Agent debe conectarse directamente al host que se está monitorizando. Para las bases de datos autoalojadas, se prefiere
127.0.0.1
o el socket. El Agent no debe conectarse a la base de datos a través de un proxy, balanceador de carga o agrupador de conexiones como pgbouncer
. Si el Agent se conecta a diferentes hosts mientras se ejecuta (como en el caso de la conmutación por error, el balanceo de carga, etc.), el Agent calcula la diferencia en las estadísticas entre dos hosts, lo que produce inexactitudes en las métricas. - Consideraciones sobre la seguridad de los datos
- Para saber qué datos recopila el Agent de tus bases de datos y cómo garantizar su seguridad, consulta Información confidencial.
Configuración de parámetros de Postgres
Configura los siguientes parámetros en el archivo postgresql.conf
y luego reinicia el servidor para que la configuración surta efecto. Para obtener más información sobre estos parámetros, consulta la documentación de Postgres.
Parámetro | Valor | Descripción |
---|
shared_preload_libraries | pg_stat_statements | Necesario para métricas postgresql.queries.* . Habilita la recopilación de métricas de consultas utilizando la extensión pg_stat_statements. |
track_activity_query_size | 4096 | Necesario para recopilar consultas de mayor tamaño. Aumenta el tamaño del texto SQL en pg_stat_activity . Si se deja con el valor predeterminado, las consultas de más de 1024 caracteres no se recopilan. |
pg_stat_statements.track | ALL | Opcional. Habilita el seguimiento de sentencias dentro de procedimientos almacenados y funciones. |
pg_stat_statements.max | 10000 | Opcional. Aumenta el número de consultas normalizadas rastreadas en pg_stat_statements . Este parámetro se recomienda para bases de datos de gran volumen que reciben muchos tipos diferentes de consultas de muchos clientes distintos. |
pg_stat_statements.track_utility | off | Opcional. Deshabilita comandos de utilidad como PREPARE y EXPLAIN. Configurar este valor en off significa que sólo se rastrearán consultas como SELECT, UPDATE y DELETE. |
track_io_timing | on | Opcional. Habilita la recopilación de los tiempos de lectura y escritura de bloques para las consultas. |
Conceder acceso al Agent
El Datadog Agent requiere acceso de sólo lectura al servidor de la base de datos para recopilar estadísticas y consultas.
Los siguientes comandos SQL deben ejecutarse en el servidor de base de datos primario (el escritor) en el clúster, si Postgres está replicado. Elige una base de datos PostgreSQL en el servidor de base de datos para que el Agent se conecte a ella. El Agent puede recopilar telemetría de todas las bases de datos del servidor de bases de datos independientemente de a cuál se conecte, por lo que una buena opción es utilizar la base de datos predeterminada postgres
. Elige una base de datos diferente sólo si necesitas que el Agent ejecute consultas personalizadas con datos exclusivos de esa base de datos.
Conéctate a la base de datos elegida como superusuario (u otro usuario con permisos suficientes). Por ejemplo, si la base de datos elegida es postgres
, conéctate como el usuario postgres
a través de psql ejecutando:
psql -h mydb.example.com -d postgres -U postgres
Crea el usuario datadog
:
CREATE USER datadog WITH password '<PASSWORD>';
Proporciona al usuario datadog
permiso en las tablas pertinentes:
ALTER ROLE datadog INHERIT;
Crea el siguiente esquema en cada base de datos:
CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO datadog;
GRANT USAGE ON SCHEMA public TO datadog;
GRANT pg_monitor TO datadog;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
Crea el siguiente esquema en cada base de datos:
CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO datadog;
GRANT USAGE ON SCHEMA public TO datadog;
GRANT pg_monitor TO datadog;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
Crea el siguiente esquema en cada base de datos:
CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO datadog;
GRANT USAGE ON SCHEMA public TO datadog;
GRANT SELECT ON pg_stat_database TO datadog;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
Crea funciones en cada base de datos para que el Agent pueda leer el contenido completo de pg_stat_activity
y pg_stat_statements
:
CREATE OR REPLACE FUNCTION datadog.pg_stat_activity() RETURNS SETOF pg_stat_activity AS
$$ SELECT * FROM pg_catalog.pg_stat_activity; $$
LANGUAGE sql
SECURITY DEFINER;
CREATE OR REPLACE FUNCTION datadog.pg_stat_statements() RETURNS SETOF pg_stat_statements AS
$$ SELECT * FROM pg_stat_statements; $$
LANGUAGE sql
SECURITY DEFINER;
Para la recopilación de datos o métricas personalizadas que requieren consultar tablas adicionales, es posible que tengas que conceder el permiso
SELECT
en esas tablas al usuario
Datadog
. Ejemplo:
grant SELECT on <TABLE_NAME> to datadog;
. Para obtener más información, consulta
Recopilación de métricas personalizadas de PostgreSQL.
Crea la función en cada base de datos para permitir al Agent recopilar explain-plans.
CREATE OR REPLACE FUNCTION datadog.explain_statement(
l_query TEXT,
OUT explain JSON
)
RETURNS SETOF JSON AS
$$
DECLARE
curs REFCURSOR;
plan JSON;
BEGIN
OPEN curs FOR EXECUTE pg_catalog.concat('EXPLAIN (FORMAT JSON) ', l_query);
FETCH curs INTO plan;
CLOSE curs;
RETURN QUERY SELECT plan;
END;
$$
LANGUAGE 'plpgsql'
RETURNS NULL ON NULL INPUT
SECURITY DEFINER;
Verificación
Para verificar que los permisos son correctos, ejecuta los siguientes comandos para confirmar que el usuario del Agent puede conectarse a la base de datos y leer las tablas principales:
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_database limit 1;" \
&& echo -e "\e[0;32mPostgres connection - OK\e[0m" \
|| echo -e "\e[0;31mCannot connect to Postgres\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_activity limit 1;" \
&& echo -e "\e[0;32mPostgres pg_stat_activity read OK\e[0m" \
|| echo -e "\e[0;31mCannot read from pg_stat_activity\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_statements limit 1;" \
&& echo -e "\e[0;32mPostgres pg_stat_statements read OK\e[0m" \
|| echo -e "\e[0;31mCannot read from pg_stat_statements\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_database limit 1;" \
&& echo -e "\e[0;32mPostgres connection - OK\e[0m" \
|| echo -e "\e[0;31mCannot connect to Postgres\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_activity limit 1;" \
&& echo -e "\e[0;32mPostgres pg_stat_activity read OK\e[0m" \
|| echo -e "\e[0;31mCannot read from pg_stat_activity\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_statements limit 1;" \
&& echo -e "\e[0;32mPostgres pg_stat_statements read OK\e[0m" \
|| echo -e "\e[0;31mCannot read from pg_stat_statements\e[0m"
Cuando se te pida una contraseña, utiliza la que introdujiste al crear el usuario datadog
.
Instalación del Agent
Al instalar el Datadog Agent también se instala el check Postgres, necesario para Database Monitoring en Postgres. Si aún no has instalado el Agent para el host de tu base de datos Postgres, consulta las instrucciones de instalación del Agent.
- Edita el archivo
conf.d/postgres.d/conf.yaml
para que apunte a tu host
/ port
y configura los principales para la monitorización. Para conocer todas las opciones de configuración disponibles, consulta la muestra postgres.d/conf.yaml.
init_config:
instances:
- dbm: true
host: localhost
port: 5432
username: datadog
password: '<PASSWORD>'
## Opcional: Si es necesario, conéctate a una base de datos diferente para las `custom_queries`
# dbname: '<DB_NAME>'
init_config:
instances:
- dbm: true
host: localhost
port: 5432
username: datadog
password: '<PASSWORD>'
pg_stat_statements_view: datadog.pg_stat_statements()
pg_stat_activity_view: datadog.pg_stat_activity()
## Opcional: Si es necesario, conéctate a una base de datos diferente para las `custom_queries`
# dbname: '<DB_NAME>'
- Reinicia el Agent.
Recopilación de logs (opcional)
La generación de logs por defecto de PostgreSQL es en stderr
. Estos logs no incluyen información detallada. Se recomienda hacerlo en un archivo con detalles adicionales especificados en el prefijo de la línea de logs. Para obtener más detalles, consulta la documentación de PostgreSQL sobre este tema.
La generación de logs se configura en el archivo /etc/postgresql/<VERSION>/main/postgresql.conf
. Para obtener resultados regulares en logs, incluidos los resultados de sentencias, descomenta los siguientes parámetros en la sección de logs:
logging_collector = on
log_directory = 'pg_log' # directory where log files are written,
# can be absolute or relative to PGDATA
log_filename = 'pg.log' # log file name, can include pattern
log_statement = 'all' # log all queries
#log_duration = on
log_line_prefix= '%m [%p] %d %a %u %h %c '
log_file_mode = 0644
## For Windows
#log_destination = 'eventlog'
Para recopilar métricas de duración detalladas y permitir su búsqueda en la interfaz de Datadog, estas métricas deben configurarse en línea con la propia sentencia. A continuación, consulta las diferencias de configuración recomendadas con respecto a las anteriores y ten en cuenta que las opciones log_statement
y log_duration
están comentadas. Consulta la discusión sobre este tema aquí.
Esta configuración registra todas las sentencias, pero para reducir el resultado a aquellas que tienen una duración determinada, configura el valor log_min_duration_statement
con la duración mínima deseada en milisegundos (comprueba que el registro de la sentencia SQL completa cumple con los requisitos de privacidad de tu organización):
log_min_duration_statement = 0 # -1 is disabled, 0 logs all statements
# and their durations, > 0 logs only
# statements running at least this number
# of milliseconds
#log_statement = 'all'
#log_duration = on
La recopilación de logs está deshabilitada por defecto en el Datadog Agent. Habilítala en tu archivo datadog.yaml
:
Añade y edita este bloque de configuración en tu archivo conf.d/postgres.d/conf.yaml
para empezar a recopilar tus logs PostgreSQL:
logs:
- type: file
path: "<LOG_FILE_PATH>"
source: postgresql
service: "<SERVICE_NAME>"
#To handle multi line that starts with yyyy-mm-dd use the following pattern
#log_processing_rules:
# - type: multi_line
# pattern: \d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])
# name: new_log_start_with_date
Cambia los valores de los parámetros service
y path
a fin de configurarlos para tu entorno. Para ver todas las opciones de configuración disponibles, consulta la muestra postgres.d/conf.yaml.
Reinicia el Agent.
Confirmar
Ejecuta el subcomando de estado del Agent y busca postgres
en la sección Checks o visita la página Bases de datos para empezar.
Ejemplo de configuraciones del Agent
One agent connecting to multiple hosts
It is common to configure a single Agent host to connect to multiple remote database instances (see Agent installation architectures for DBM). To connect to multiple hosts, create an entry for each host in the Postgres integration config.
In these cases, Datadog recommends limiting the number of instances per Agent to a maximum of 10 database instances to guarantee reliable performance.
init_config:
instances:
- dbm: true
host: example-service-primary.example-host.com
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
- dbm: true
host: example-service–replica-1.example-host.com
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
- dbm: true
host: example-service–replica-2.example-host.com
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
[...]
Monitoring multiple databases on a database host
Use the database_autodiscovery
option to permit the Agent to discover all databases on your host to monitor. You can specify include
or exclude
fields to narrow the scope of databases discovered. See the sample postgres.d/conf.yaml for more details.
init_config:
instances:
- dbm: true
host: example-service-primary.example-host.com
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
database_autodiscovery:
enabled: true
# Optionally, set the include field to specify
# a set of databases you are interested in discovering
include:
- mydb.*
- example.*
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
Running custom queries
To collect custom metrics, use the custom_queries
option. See the sample postgres.d/conf.yaml for more details.
init_config:
instances:
- dbm: true
host: localhost
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
custom_queries:
- metric_prefix: employee
query: SELECT age, salary, hours_worked, name FROM hr.employees;
columns:
- name: custom.employee_age
type: gauge
- name: custom.employee_salary
type: gauge
- name: custom.employee_hours
type: count
- name: name
type: tag
tags:
- 'table:employees'
Monitoring relation metrics for multiple databases
In order to collect relation metrics (such as postgresql.seq_scans
, postgresql.dead_rows
, postgresql.index_rows_read
, and postgresql.table_size
), the Agent must be configured to connect to each database (by default, the Agent only connects to the postgres
database).
Specify a single “DBM” instance to collect DBM telemetry from all databases. Use the database_autodiscovery
option to avoid specifying each database name.
init_config:
instances:
# This instance is the "DBM" instance. It will connect to the
# all logical databases, and send DBM telemetry from all databases
- dbm: true
host: example-service-primary.example-host.com
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
database_autodiscovery:
enabled: true
exclude:
- ^users$
- ^inventory$
relations:
- relation_regex: .*
# This instance only collects data from the `users` database
# and collects relation metrics from tables prefixed by "2022_"
- host: example-service-primary.example-host.com
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
dbname: users
dbstrict: true
relations:
- relation_regex: 2022_.*
relkind:
- r
- i
# This instance only collects data from the `inventory` database
# and collects relation metrics only from the specified tables
- host: example-service-primary.example-host.com
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
dbname: inventory
dbstrict: true
relations:
- relation_name: products
- relation_name: external_seller_products
Collecting schemas
To enable this feature, use the collect_schemas
option. You must also configure the Agent to connect to each logical database.
Use the database_autodiscovery
option to avoid specifying each logical database. See the sample postgres.d/conf.yaml for more details.
init_config:
# This instance only collects data from the `users` database
# and collects relation metrics only from the specified tables
instances:
- dbm: true
host: example-service-primary.example-host.com
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
dbname: users
dbstrict: true
collect_schemas:
enabled: true
relations:
- products
- external_seller_products
# This instance detects every logical database automatically
# and collects relation metrics from every table
- dbm: true
host: example-service–replica-1.example-host.com
port: 5432
username: datadog
password: 'ENC[datadog_user_database_password]'
database_autodiscovery:
enabled: true
collect_schemas:
enabled: true
relations:
- relation_regex: .*
Working with hosts through a proxy
If the Agent must connect through a proxy such as the Cloud SQL Auth proxy, all telemetry is tagged with the hostname of the proxy rather than the database instance. Use the reported_hostname
option to set a custom override of the hostname detected by the Agent.
init_config:
instances:
- dbm: true
host: localhost
port: 5000
username: datadog
password: 'ENC[datadog_user_database_password]'
reported_hostname: example-service-primary
- dbm: true
host: localhost
port: 5001
username: datadog
password: 'ENC[datadog_user_database_password]'
reported_hostname: example-service-replica-1
Solucionar problemas
Si has instalado y configurado las integraciones y el Agent como se describe, pero no funcionan como se esperaba, consulta Solucionar problemas.
Referencias adicionales
Más enlaces, artículos y documentación útiles: