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":

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>

Tener en cuenta que el nombre utilizado para identificar la base de datos no corresponde con una base de datos dentro de la instancia de PostgreSQL en sí, sino que es un nombre de fantasía para identificar las métricas dentro de la base de collectd (en este caso InfluxDB). Ya que se recolectan las estadísticas del servidor incluyendo todas sus bases de datos (no de una única base de datos).

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


Tal vez pueda interesarte


Compartí este artículo