Prometheus – Instalación del Node Exporter en una Raspberry o en Ubuntu

Uno de los Exporters más habituales que proporciona Prometheus, es el Node Exporter, encargado de exportar métricas de hardware y sistema operativo como uso de memoria, CPU, red, y disco, de *NIX kernels como Linux (para máquinas Windows utilizaríamos el Windows Exporter), que podremos configurar/personalizar mediante el uso de sus módulos colectores. ¿Quieres saber cómo instalarlo en una Raspberry o en Ubuntu?

Hace poco ya explicamos qué es Prometheus y cómo instalarlo en una Raspberry (o en Ubuntu), el Post con el que comenzamos esta serie sobre Prometheus. Hoy te voy a contar cómo instalar el Node Exporter y cómo añadirlo a la configuración de Prometheus (por ahora de forma estática, sin hacer descubrimiento), y cómo especificar qué colectores deseamos utilizar.

Es importante la configuración de los módulos colectores de métricas, ya que de este modo, podemos especificar qué módulos colectores (y en consecuencia, qué métricas) necesitamos. Tenemos disponibles un montón, pero si sólo necesitamos algunos, no es necesario sobrecargar nuestras máquinas para trackear una métricas (e indexarlas en Prometheus) que no vamos a utilizar, y así que tengamos un entorno sencillo, ligero y ágil. Para más detalle, podemos consultar el GitHub del Node Exporter: GitHub – Prometheus Node Exporter – Collectors

Puedes encontrar la documentación oficial del Node Exporter en su GitHub: GitHub – Prometheus Node Exporter

Instalación del Node Exporter

Vamos a instalar el Node Exporter en una Raspberry (en Ubuntu sería exactamente igual, excepto el binario que tendríamos que descargar, como se indica más abajo), para poder monitorizarla desde nuestro servidor Prometheus.

Lo primero, actualizamos el sistema operativo, instalamos algunas utilidades (wget, gurl, y vim), y creamos un grupo y un usuario (que no permite login) para Prometheus (si no lo hemos hecho antes, por ejemplo, si es la misma máquina en la que antes instalamos Prometheus, ya estarían creados), con la intención de evitar que el demonio del Node Exporter se ejecute con un superusuario como root (por motivos de seguridad).

sudo apt update -y && sudo apt upgrade
sudo apt -y install wget curl vim
sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin --system --no-create-home -g prometheus prometheus

Descargamos la última versión del Node Exporter para Raspberry (armv7) sobre un directorio temporal (Prometheus – Download), lo descomprimimos, movemos el binario a /usr/local/bin (así lo podemos ejecutar sin añadir nada al PATH), y cambiamos el propietario del binario por motivos de seguridad.

NOTA: Si se deseas instalar el Node Exporter en Ubuntu, en lugar de filtrar por linux-armv7 bastaría con filtrar por linux-amd64 en el siguiente comando, y ya está. El resto de las instrucciones indicadas en este Post serían válidas.

curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest | grep browser_download_url | grep linux-armv7 |  cut -d '"' -f 4 | wget -qi -
tar xvf node_exporter-*.tar.gz
cd node_exporter*/
sudo mv node_exporter /usr/local/bin/
sudo chown root:root /usr/local/bin/node_exporter

Realizado esto podemos ejecutar el siguiente comando para comprobar la versión instalada de Node Exporter:

node_exporter --version

Para poder manejar el Node Exporter como un servicio o demonio, vamos a crear su fichero de configuración de systemd. En este fichero de configuración, podemos indicar qué colectores queremos activar: Prometheus – Node Exporter – Collectors

sudo tee /etc/systemd/system/node_exporter.service<<EOF
[Unit]
Description=Prometheus Node Exporter
Documentation=https://github.com/prometheus/node_exporter
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/local/bin/node_exporter \
    --collector.cpu \
    --collector.diskstats \
    --collector.filesystem \
    --collector.loadavg \
    --collector.meminfo \
    --collector.filefd \
    --collector.netdev \
    --collector.stat \
    --collector.netstat \
    --collector.systemd \
    --collector.uname \
    --collector.vmstat \
    --collector.time \
    --collector.mdadm \
    --collector.zfs \
    --collector.tcpstat \
    --collector.bonding \
    --collector.hwmon \
    --collector.arp \
    --web.listen-address=0.0.0.0:9100 \
    --web.telemetry-path="/metrics"

[Install]
WantedBy=multi-user.target
EOF

Hecho esto, activamos y arrancamos el servicio de Node Exporter (así queda configurado para arrancar automáticamente con el inicio del sistema):

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
sudo systemctl status node_exporter

Realizado esto, ya tendremos el Node Exporter instalado y con una configuración básica, que podemos adaptar a nuestras necesidades (principalmente qué colectores de métricas deseamos utilizar). Si lo deseamos podemos acceder a la URL de la métricas, tal y como se muestra en la siguiente pantalla.

Para continuar, necesitamos configurar nuestro servidor Prometheus para añadir este nuevo target, y que empiece a recoger sus métricas e ingestarlas en la base de datos de Prometheus. Para ello, nos conectamos al servidor Prometheus por SSH y editamos el fichero de configuración de Prometheus, en nuestro caso, con un comando como este:

vi /etc/prometheus/prometheus.yml

Añadiremos los targets que deseamos monitorizar (scrapear) dentro de la sección scrape_configs. En este caso de ejemplo, vamos a monitorizar tres Raspberries especificando sus direcciones IPs (lo suyo es utilizar nombres DNS, que semánticamente nos van a transmitir mucho más que las direcciones IP, aunque para este laboratorio lo hagamos con direcciones IP a modo de ejemplo).

  # Linux Servers
  - job_name: node_exporter
    static_configs:
      - targets: 
          - '192.168.30.2:9100'  # securepi
          - '192.168.30.3:9100'  # superpi8
          - '192.168.30.4:9100'  # superpi4

Comprobaremos que el fichero de configuración es válido (con promtool) y tras comprobar que está OK, refrescamos la configuración de Prometheus con un killall.

promtool check config /etc/prometheus/prometheus.yml
sudo killall -HUP prometheus

Realizado esto, podremos comprobar en Prometheus, que pasados unos segundos ya empieza a obtener las métricas del nuevo Job que hemos configurado (node_exporter).

En cuanto empecemos a tener datos históricos podremos empezar a lanzar consultas. A continuación se muestra un ejemplo, aunque la habitual es utilizar un Dashboard en Grafana como herramienta de visualización.

Poco más por hoy. Como siempre, confío que la lectura resulte de interés.