Continuando esta serie de artículos sobre monitoreo y análisis de datos de rendimiento con collectd, InfluxDB y Grafana, hoy llega el turno de PostgreSQL. La idea es obtener métricas de performance de un servidor de bases de datos PostgreSQL con collectd, almacenarlas en una base de datos InfuxDB y graficarlas con Grafana.
Artículos previos en la serie "collectd+InfluxDB+Grafana":
- Configuración de correo electrónico y creación de usuarios en Grafana
- Recolectar estadísticas de iptables con collectd
- Transformar contadores a deltas en Grafana sobre datos de InfluxDB
- Monitoreando servidores MySQL con collectd+InfluxDB+Grafana
- Compilar e instalar collectd en CentOS
- Recolectar estadísticas de Apache con collectd en Debian y derivados
- Eliminar (DROP) series en InfluxDB
- Habilitar autenticación para HTTP en InfluxDB
- Monitorear la actividad de Nginx con Grafana+InfluxDB+collectd
- Graficar métricas de collectd con Grafana
- Acceder a Grafana desde un proxy reverso con Nginx
- Compilar y configurar collectd con InfluxDB en Debian y derivados
- Cómo generar gráficos de torta en Grafana
- Creando mi primer dashboard en Grafana
- Agregando un Data Source PostgreSQL en Grafana
- Cómo instalar Grafana en Linux
Creo que nunca había dedicado tantos artículos a una serie. Y hay más por venir
El plugin "postgresql" de collectd permite conectarse a un servidor de bases de datos PostgreSQL y ejecutar consultas SQL. Los resultados retornados son procesados y, dependiendo de la configuración, son convertidos a valores de collectd. Este plugin mantiene una conexión persistente con todas las bases de datos configuradas y se reconecta automáticamente en caso de perder la conexión. Las bases de datos a monitorear se especifican mediante bloques "Database".
Por defecto se recolecta la información entregada por el recolector de estadísticas de Postgres, el cual debe estar habilitado (lo está por defecto).
Sin embargo, más allá de recolectar estadísticas del servidor PostgreSQL, este plugin permite ejecutar cualquier tipo de consulta SQL mediante un bloque de configuración "Query" (incluyendo sentencias INSERT
). Esto permite recolectar información útil de cualquier tabla.
Este artículo sólo explica cómo configurar un bloque "Database" para recolectar las estadísticas provistas por servidor PostgreSQL, no así el uso de sentencias SQL personalizadas.
Manos a la obra
El primer paso consiste en compilar collectd con soporte para Postgres agregando la opción --enable-postgres
.
# ./configure --enable-postgres
Comparto los siguientes scripts de compilación de collectd para Debian y CentOS. Editar adecuadamente las variables y opciones de configuración dentro del script.
La instalación y configuración de InfluxDB, junto con la configuración del plugin "network" (que permite enviar las métricas recolectadas por collectd a una base de datos InfluxBD) se explican detalladamente en el artículo Compilar y configurar collectd con InfluxDB en Debian y derivados.
Configurar el plugin "postgres"
Editar el archivo de configuración de collectd:
# cd /usr/local/collectd/etc/ # nano collectd.conf
Habilitar el plugin "postgres":
LoadPlugin postgres
Luego configurar el plugin "postgres" para que recolecte estadísticas de las instancias de Postgres que se deseen (se pueden incluir múltiples bloques "Database" dentro de la configuración del plugin).
La siguiente configuración permite monitorear la instancia del servidor PostgreSQL escuchando en el puerto 5432
del host local:
<Plugin postgresql> <Database joomla> Host "localhost" Port "5432" User "collectd" Password "trustno1" SSLMode "prefer" </Database> </Plugin>
Configuración de PostgreSQL
Tal como se observa en la configuración del plugin, es necesario contar con un usuario válido para conectarse a cada instancia de PostgreSQL.
Crear un usuario con rol de sólo lectura en las instancias de PostgreSQL que se van a monitorear:
root@pgdb:/usr/local/collectd/etc# su - postgres postgres@pgdb:~$ createuser -h localhost -p 5432 -U postgres -W -D -e -E -g readonly -P -R -S collectd postgres@pgdb:~$ exit
Si se ha compilado una versión personalizada de PostgreSQL, es probable que sea necesario crear un enlace simbólico a la librería libpq.so
para que el plugin funcione en tiempo de ejecución:
root@pgdb:/usr/local/collectd/etc# ln -s /usr/local/pgsql/lib/libpq.so.5 /usr/lib/
Finalmente es necesario reiniciar collectd.
Graficando métricas con InfluxDB+Grafana
A modo de ejemplo, la siquiente consulta InfluxQL permite visualizar la cantidad de consultas SQL INSERT
a lo largo del tiempo:
SELECT derivative(mean("value"), 10s) FROM "postgresql_value" WHERE ("host" = 'pgdb.linuxito.com' AND "instance" = 'joomla' AND "type" = 'pg_n_tup_c' AND "type_instance" = 'ins') AND $timeFilter GROUP BY time($__interval) fill(none)
El recolector de estadísticas de Postgres provee una buena cantidad de información, lo cual permite obtener métricas de consultas, entrada/salida, tamaño de base de datos, uso de índices y más:

Referencias
- Plugin:PostgreSQL - collectd Wiki
- Manpage collectd.conf(5) - Plugin postgresql
- PostgreSQL 9.2.24 Documentation - Chapter 27. Monitoring Database Activity
- Documentation - PostgreSQL 11 - Chapter 28. Monitoring Database Activity
- Cómo crear un usuario en PostgreSQL desde línea de comandos