Monitorizando el sistema con Collectd+InfluxDB+Grafana (Debian)

por | agosto 7, 2018

Ya hace tiempo que lo tengo montado y tenía pendiente escribir el artículo a modo de wiki. Ya habíamos visto anteriormente cómo utilizar Grafana como capa de presentación con Glances e InfluxDB. Donde antes utilizaba Glances para recolectar métricas ahora tengo Collectd, utilidad más madura y con más opciones de configuración.

Los distintos componentes por tanto son:

  • Collectd como recolector de métricas de sistema.
  • InfluxDB será la Base de Datos para almacenar dichas métricas.
  • Grafana como capa de presentación (dashboard) de las métricas que se vayan almacenando en InfluxDB.

Instalación de los componentes

Collectd e InfluxDB están en repositorios por lo que utilizaremos apt-get:

apt-get install collectd collectd-utils influxdb influxdb-client

Por su parte Grafana en estos momentos no lo tenemos en los repos Debian Stretch. Para instalarlo o bien instalamos el paquete .deb directamente o añadimos el repositorio correspondiente. En mi caso añadí el repositorio en /etc/apt/sources.list:

deb https://packagecloud.io/grafana/stable/debian/ stretch main

Después incluí la clave GPG:

curl https://packagecloud.io/gpg.key | sudo apt-key add -

Y finalmente instalé el paquete:

sudo apt-get update
sudo apt-get install grafana

Tenéis todas las opciones de instalación para distintas distros y métodos en la web oficial.

La gestión de todos los servicios se hace con systemctl:

systemctl [ status | stop | start | restart ] collectd.service
systemctl [ status | stop | start | restart ] influxdb.service
systemctl [ status | stop | start | restart ] grafana.service

Configuración de la recolección de métricas con Collectd

En primer lugar tendremos que activar los plugins de Collectd que se encargarán de recolectar las distintas métricas. En el fichero /etc/collectd/collectd.conf tengo en mi caso activados (descomentados) los siguientes plugins:

LoadPlugin syslog
LoadPlugin apache
LoadPlugin battery
LoadPlugin conntrack
LoadPlugin contextswitch
LoadPlugin cpu
LoadPlugin df
LoadPlugin disk
LoadPlugin entropy
LoadPlugin ethstat
LoadPlugin fhcount
LoadPlugin interface
LoadPlugin irq
LoadPlugin load
LoadPlugin memory
LoadPlugin network
LoadPlugin processes
LoadPlugin protocols
LoadPlugin rrdtool
LoadPlugin sensors
LoadPlugin swap
LoadPlugin tcpconns
LoadPlugin uptime
LoadPlugin users

A su vez en el mismo fichero algunos plugins los tengo personalizados. El resto están comentados por lo que se aplica la configuración por defecto:

  • Plugin cpu:
    <Plugin cpu>
        ReportByCpu true
        ReportByState true
        ValuesPercentage true
    </Plugin>
  • Plugin df:
    <Plugin df>
    #   Device "/dev/sda2"
    #   Device "192.168.0.2:/mnt/nfs"
    #   MountPoint "/"
    #   FSType "ext4"
    
        # ignore rootfs; else, the root file-system would appear twice, causing
        # one of the updates to fail and spam the log
    #   FSType rootfs
        # ignore the usual virtual / temporary file-systems
    #   FSType sysfs
    #   FSType proc
    #   FSType devtmpfs
    #   FSType devpts
    #   FSType tmpfs
    #   FSType fusectl
    #   FSType cgroup
    #   IgnoreSelected true
    
    #   ReportByDevice false
        ReportInodes true
    
    #   ValuesAbsolute true
    #   ValuesPercentage false
    </Plugin>
  • Plugin memory:
    <Plugin memory>
        ValuesAbsolute true
        ValuesPercentage false
    </Plugin>
    
  • Plugin network. Muy importante este plugin ya que configura Collectd en modo servidor con puerto de escucha 25826 en localhost. Posteriormente InfluxDB actuará como cliente y conectará con Collectd en dicho socket para recolectar y almacenar las métricas en BBDD. En este caso 127.0.0.1:25826:
    <Plugin network>
        # client setup:
        Server "127.0.0.1" "25826"
        #<Server "127.0.0.1" "25826">
        #   SecurityLevel Encrypt
        #   Username "user"
        #   Password "secret"
        #   Interface "br0"
        #   ResolveInterval 14400
        #</Server>
        #TimeToLive 128
    #
    #   # server setup:
        #Listen "127.0.0.1" "25826"
        #<Listen "127.0.0.1" "25826">
        #   SecurityLevel Sign
        #   AuthFile "/etc/collectd/passwd"
        #   Interface "br0"
        #</Listen>
        #MaxPacketSize 1452
    #
    #   # proxy setup (client and server as above):
    #   Forward true
    #
    #   # statistics about the network plugin itself
        ReportStats false
    #
    #   # "garbage collection"
        #CacheFlush 1800
    </Plugin>
  • Plugin protocols:
    <Plugin protocols>
        Value "/^Tcp:/"
    #   IgnoreSelected false
    </Plugin>
    
  • Plugin tcpconns:
    <Plugin tcpconns>
        ListeningPorts true
        AllPortsSummary true
    #   LocalPort "25"
    #   RemotePort "25"
    </Plugin>
    

Creación de BBDD en InfluxDB

En primer lugar tendremos que crear una BBDD donde almacenar las métricas de Collectd. Para ello conectamos con la CLI de InfluxDB con el comando influx:

influx

Una vez dentro creamos un usuario administrativo y la BBDD:

CREATE USER jota WITH PASSWORD '<password>' WITH ALL PRIVILEGES
CREATE DATABASE collectd_db
exit

En el fichero de configuración /etc/influx/influxdb.conf tendremos que configurar dónde escucha Collectd (localhost:25826) y la BBDD donde almacenaremos las métricas (collectd_db):

###
### [collectd]
###
### Controls one or many listeners for collectd data.
###

[[collectd]]
  enabled = true
   bind-address = "localhost:25826"
   database = "collectd_db"
   typesdb = "/usr/share/collectd/types.db"

Grafana: capa de presentación

En Grafana configuraremos un dashboard donde poder ver las distintas métricas. Antes de esto hay que configurar un datasource que apuntará a la Base de Datos de InfluxDB, donde se están almacenando los datos.

En mi caso lo tengo configurado de la siguiente manera. Rellenamos los datos en función de nuestras especificaciones:

Una vez configurado el datasource tendremos que crear un dashboard donde se representarán las distintas métricas. Por suerte en la Comunidad de Grafana ya tenemos unos cuantos dashboards para empezar a trabajar sin demasiadas complicaciones. En mi caso para las métricas de sistema utilicé este. Descargamos el fichero JSON y lo importamos en Grafana:

Una vez cargado ya podremos ver nuestras métricas de carga, CPU, memoria, nº de procesos…:

También métricas de red:

Estos dashboards podremos modificarlos a nuestro gusto posteriormente y hay más en la web de Grafana. A la hora de descargar más dashboards, fijaos si cumplís las dependencias de componentes (algunos son para Prometheus en vez de Collectd, etc…)