Monitoreo de métricas de largo historial con Prometheus y Grafana [Debian9]

Hola comunidad, ya habíamos creado un sistema de monitoreo en tiempo real con Netdata en cascada  aquí. Ahora toca el turno a la posibilidad de almacenar métricas de nuestros servidores por un largo período, para tener un largo historial.

Para lograr esto se escogieron como soluciones las de Prometheus y Grafana, que vinculada a la solución de Netdata, lograremos lo siguiente:

Actualmente Netdata permite exportar sus métricas a Prometheus, pero para evitar la enorme cantidad de métricas, que va a estar siendo duplicadas, tanto en largo como en corto plazo, recomiendo usar mejor Prometheus Node Exporter para exportar sólo aquellas méricas que se deseen. Lo anterior no supondría un problema si tuviesemos una «gestión en banda» (enlace dedicado para la gestión que no afecte el ancho de banda de los servicios).

1-Prometheus

1.1-¿Qué es Prometheus?

Prometheus es un sistema de monitoreo y herramientas de alertas de código. Sus principales características son:

  • Un modelo de datos multidimensional con series de tiempos de datos identificados por nombres de métrica y por pares de valor/llave.
  • Usa PromQL, un lenguaje de encuesta flexible para influenciar esta dimensionalidad.
  • No depende de un almacenamiento distribuido; los servidores encuestados son autónomos.
  • Las series de tiempo de colección de datos sucede vía “pull model” sobre HTTP.
  • Los objetivos o “tarjets” son descubiertos por un servicio de descubrimiento o por configuración estática.
  • Soporta múltiples modos de graficación y “dashboarding”.

1.2-Implementación y configuración de Prometheus

Paquetes necesarios:

apt-get install wget curl

Creando usuario y grupo de sistema para prometheus:

useradd -M -r -s /bin/false Prometheus

Para verificar esto, ingresamos la siguiente línea:

id prometheus

Debe devolver algo como esto:

uid=998(prometheus) gid=998(prometheus) grupos=998(prometheus)

Creando los directorios de configuración:

mkdir /etc/prometheus
mkdir /var/lib/prometheus

Asignando los propietarios a los directorios creados:

chown prometheus:prometheus /etc/prometheus
chown prometheus:prometheus /var/lib/Prometheus

Descargando el compilado:

mkdir /opt/instaladores
cd /opt/instaladores/
wget https://github.com/prometheus/prometheus/releases/download/v2.6.0/prometheus-2.11.1.linux-amd64.tar.gz

Extraemos el paquete:

tar -xzvf prometheus-2.11.1.linux-amd64.tar.gz

Copie los dos ficheros «prometheus» y «promtool» que están dentro de la carpeta del paquete descomprimido y ubicarlos en «/usr/local/bin/»

cp prometheus-2.11.1.linux-amd64/prometheus /usr/local/bin/
cp prometheus-2.11.1.linux-amd64/promtool/usr/local/bin/

Asignando los propietarios a los ficheros copiados en su nuevo destino

chown prometheus:prometheus /usr/local/bin/prometheus
chown prometheus:prometheus /usr/local/bin/promtool

Copie los directorios «consoles/» y «console_libraries/» al directorio “/etc/prometheus”:

cp -r prometheus-2.11.1.linux-amd64/consoles/ /etc/prometheus/
cp -r prometheus-2.11.1.linux-amd64/console_libraries/ /etc/prometheus/

Asignamos el propietario de los directorios anteriores:

chown -R prometheus:prometheus /etc/prometheus/consoles
chown -R prometheus:prometheus /etc/prometheus/console_libraries

Descargando el compilado:

mkdir /opt/instaladores
cd /opt/instaladores/
wget https://github.com/prometheus/prometheus/releases/download/v2.6.0/prometheus-2.11.1.linux-amd64.tar.gz

Extraemos el paquete:

tar -xzvf prometheus-2.11.1.linux-amd64.tar.gz

Copie los dos ficheros «prometheus» y «promtool» que están dentro de la carpeta del paquete descomprimido y ubicarlos en «/usr/local/bin/»:

cp prometheus-2.11.1.linux-amd64/prometheus /usr/local/bin/
cp prometheus-2.11.1.linux-amd64/promtool/usr/local/bin/

Asignando los propietarios a los ficheros copiados en su nuevo destino

chown prometheus:prometheus /usr/local/bin/prometheus
chown prometheus:prometheus /usr/local/bin/promtool

Copie los directorios «consoles/» y «console_libraries/» al directorio “/etc/prometheus”:

cp -r prometheus-2.11.1.linux-amd64/consoles/ /etc/prometheus/
cp -r prometheus-2.11.1.linux-amd64/console_libraries/ /etc/prometheus/

Asignamos el propietario de los directorios anteriores:

chown -R prometheus:prometheus /etc/prometheus/consoles
chown -R prometheus:prometheus /etc/prometheus/console_libraries

1.3-Configurando Prometheus

Ahora que tenemos todos los ficheros de configuración requeridos en su lugar, procedemos a configurar Prometheus. El fichero de configuración por defecto de Prometheus está localizado en el directorio creado tras extraerse su paquete de instalación por compilado. Desde que estamos haciendo una instalación básica, copiaremos ese fichero y lo modificaremos:

cp prometheus-2.11.1.linux-amd64/prometheus.yml /etc/prometheus/

Editamos el fichero de configuración de ejemplo:

nano /etc/prometheus/prometheus.yml

Ajustamos el fichero a como se muestra a continuación:

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
    - targets: ['localhost:9090']

Establecemos el propietario del fichero de configuración:

chown prometheus:prometheus /etc/prometheus/prometheus.yml

1.4-Iniciando Prometheus

La configuración básica de Prometheus está finalizada. Para iniciar Prometheus con nuestra configuración básica, corremos el programa:

prometheus --config.file=/etc/prometheus/prometheus.yml

El programa habrá iniciado, cuando devuelva algo como lo siguiente:

level=info ts=2019-08-14T17:58:16.996Z caller=main.go:621 msg="Server is ready to receive web requests."

Accedemos a la página de estados de Prometheus:

http://server_ip:9090

Creamos el servicio Prometheus en systemd para que inicie con el sistema:

nano /etc/systemd/system/prometheus.service

Agregamos lo siguiente:

[Unit]
Description=Prometheus Time Series Collection and Processing Server
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target

Recargamos la configuración del demonio systemd:

systemctl daemon-reload

Habilitamos e iniciamos el servicio Prometheus para que corra con el inicio del sistema:

systemctl enable prometheus.service
systemctl start prometheus.service

Verificamos el estado del servicio:

systemctl status prometheus

Si sale lo siguiente, entonces Prometheus está corriendo:

prometheus.service - Prometheus Time Series Collection and Processing Server
   Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-08-14 20:08:44 CDT; 5s ago
 Main PID: 1649 (prometheus)
   CGroup: /system.slice/prometheus.service
           └─1649 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/

Reiniciamos el servidor:

reboot

Después que inicie el servidor, verificamos si prometheus inició con el sistema:

systemctl status prometheus.service

#===========================================================

NOTA: Si no inició con el sistema, propongo iniciarlo mediante un script que inicie con el sistema (usted puede hacerlo de otra manera más eficiente si así lo desea):

mkdir -p /config/scripts
nano /config/scripts/prometheus.startup.sh

Agregar lo siguiente:

#!/bin/sh

#----------------------------------------------------------------------------
# El objetivo de este script es iniciar el servicio de prometheus
#----------------------------------------------------------------------------

/usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries

Le damos permisos de ejecución:

chmod +x /config/scripts/prometheus.startup.sh

Editamos el cron:

crontab -e

Agregamos lo siguiente al final:

##############
# PROMETHEUS #
##############

@reboot /config/scripts/prometheus.startup.sh

Reiniciamos y volvemos a verificar cuando inicie el servidor. Ahora sí debe de iniciar prometheus.

#===========================================================

2-Monitoreo de métricas de sistemas Linux con Prometheus Node Exporter

El siguiente procedimiento para implementar y configurar Prometheus Node Exporter es necesario hacerlo en cada host Linux, tanto en el servidor prometheus, como en los demás servidores a monitorear.

2.1-Instalando Prometheus Node Exporter:

Para correr de forma segura el «Node Exporter», necesitamos crear un usuario para ello.

useradd -M -r -s /bin/false node_exporter

Esto creará el usuario especificado con un grupo bajo el mismo nombre. Verificamos:

id node_exporter

Debe devolver algo como esto:

uid=997(node_exporter) gid=997(node_exporter) grupos=997(node_exporter)

Descargando Node Exporter:

cd /opt/instaladores
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz

Desempaquetando «node_exporter-0.18.1.linux-amd64.tar.gz»:

tar xzf node_exporter-0.18.1.linux-amd64.tar.gz

Copiamos el binario de «node_exporter» del directorio creado al destino «/usr/local/bin»:

cp node_exporter-0.18.1.linux-amd64/node_exporter /usr/local/bin/

Establecemos el usuario y grupo propietario del binario:

chown node_exporter:node_exporter /usr/local/bin/node_exporter

2.2-Iniciando Node Exporter

Node Exporter puede ser configurado para exponer específicos sistemas métricos. A continuación, se crea el servicio «node_exporter» en systemd para que inicie con el sistma, brindando información colectada de CPU, uso de disco, estadísticas de memoria, entre otros:

nano /etc/systemd/system/node_exporter.service

Agregar lo siguiente:

[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
        --collector.cpu \
        --collector.cpufreq \
        --collector.diskstats \
        --collector.meminfo \
        --collector.loadavg \
        --collector.filesystem \
        --collector.hwmon \
        --collector.netdev \
        --collector.netstat \
        --collector.time \

[Install]
WantedBy=multi-user.target

Recargamos la configuración del demonio systemd:

systemctl daemon-reload

Iniciamos y habilitamos el servicio «node_exporter» para que corra con el inicio del sistema:

systemctl start node_exporter.service
systemctl enable node_exporter.service

Verificamos el estado del servicio:

systemctl status node_exporter.service

Debe devolver algo como esto:

node_exporter.service - Prometheus Node Exporter
   Loaded: loaded (/etc/systemd/system/node_exporter.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-08-14 21:38:07 CDT; 16s ago
 Main PID: 4092 (node_exporter)
    Tasks: 4 (limit: 2337)
   CGroup: /system.slice/node_exporter.service
           └─4092 /usr/local/bin/node_exporter

Reiniciamos el servidor:

reboot

Verificamos si inició con el sistema:

systemctl status node_exporter.service

#===========================================================

NOTA: Si no inicia con el sistema hacer misma operación que con el servicio «prometheus»

#===========================================================

El «Node Exporter» corre sobre el puerto TCP 9100. Lo podemos comprobar con el siguiente comando:

ss -altnp | grep 9100

Debe devolver algo como esto:

LISTEN     0      128         :::9100                    :::*                   users:(("node_exporter",pid=3018,fd=3))

2.3-Agregando objetivos de Node Exporter a Prometheus

(En el servidor de que alberga a Prometheus)

Editamos el fichero de configuración de prometheus:

nano /etc/prometheus/prometheus.yml

Agregamos al final (en la sección de las configuraciones estáticas) lo siguiente:

# 192.168.9.101   
  - job_name: 'netdata2'  
    static_configs:
    - targets: ['192.168.9.101:9100']

Si se quiere añadir al propio servidor prometheus en los chequeos, comentarear el “target” referente a prometheus y agregar debajo la siguiente línea siguiente:

    - targets: ['localhost:9100']

Reiniciamos el servicio de prometheus:

systemctl restart prometheus.service

#===========================================================

NOTA: Si el servicio no inicia bien, recomiendo reiniciar el servidor, para que se ejecute el script de autoinicio

#===========================================================

3-Comprobando resultados en servidor Prometheus

Nos “logueamos” en la web del prometheus y verificamos el estado de los «targets». El procedimiento se describe en imágenes a continuación:

Si todo está bien, los objetivos deberían poder aparecer en estado «UP»:

Para verificar que el servidor de prometheus recibe las métricas de sus objetivos, debe correr el siguiente comando:

#curl http://<target-IP>:9100/metrics

curl http://192.168.9.101:9100/metrics

Debe devolver algo como esto:

[...]
# TYPE node_filesystem_avail_bytes gauge
node_filesystem_avail_bytes{device="/dev/mapper/ubuntu--vg-root",fstype="ext4",mountpoint="/"} 2.0969934848e+10
node_filesystem_avail_bytes{device="tmpfs",fstype="tmpfs",mountpoint="/run"} 2.07343616e+08
node_filesystem_avail_bytes{device="tmpfs",fstype="tmpfs",mountpoint="/run/lock"} 5.24288e+06
node_filesystem_avail_bytes{device="tmpfs",fstype="tmpfs",mountpoint="/run/user/0"} 2.09006592e+08
node_filesystem_avail_bytes{device="tmpfs",fstype="tmpfs",mountpoint="/run/user/1000"} 2.08973824e+08
node_filesystem_avail_bytes{device="tmpfs",fstype="tmpfs",mountpoint="/run/user/121"} 2.0897792e+08
# HELP node_filesystem_device_error Whether an error occurred while getting statistics for the given device.
# TYPE node_filesystem_device_error gauge
[...]

Si se quiere ver alguna métrica en particular, basta con pararse en la ventana principal de Prometheus y seleccionar la opción «- insert metric at cursos -«, para que se listen todas las métricas posibles. A continuación, un ejemplo para la métrica «node_memory_MemAvailable_bytes» (ver imagen), la tecleamos y ejecutamos con la opción «Execute»:

Para ver una gráfica de la métrica, click en la pestaña «Graph» para esa métrica:

Hasta ahora hemos configurado satisfactoriamente un servidor de Prometheus para albergar las métricas y Prometheus Node Exporter para exportar las métricas.

4-Grafana

4.1-¿Qué es Grafana?

Grafana es un software libre basado en licencia de Apache 2.0,2​ que permite la visualización y el formato de datos métricos. Permite crear cuadros de mando y gráficos a partir de múltiples fuentes, incluidas bases de datos de series de tiempo. Entre sus características principales se encuentran:

  • Grafana es multiplataforma sin ninguna dependencia y también se puede implementar con Docker. Está escrito en lenguaje Go y tiene un HTTP API completo.
  • Grafana evita que los usuarios sobrescriban accidentalmente un panel de control. Existe una protección similar cuando se crea un nuevo panel de control cuyo nombre ya existe.
  • La herramienta ofrece la posibilidad de configurar alertas.

4.2-Implementación y configuración de Grafana

Instalando grafana usando paquete “.deb”:

mkdir /opt/instaladores
cd /opt/instaladores/
wget https://dl.grafana.com/oss/release/grafana_6.2.1_amd64.deb
dpkg -i grafana_6.2.1_amd64.deb

Debe devolver algo como esto:

Desempaquetando grafana (6.2.1) ...
Configurando grafana (6.2.1) ...
Añadiendo el usuario del sistema `grafana' (UID 111) ...
Añadiendo un nuevo usuario `grafana' (UID 111) con grupo `grafana' ...
No se crea el directorio personal `/usr/share/grafana'.
### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd
 sudo /bin/systemctl daemon-reload
 sudo /bin/systemctl enable grafana-server
### You can start grafana-server by executing
 sudo /bin/systemctl start grafana-server
Procesando disparadores para systemd (232-25+deb9u4) ...

Verificamos la versión instalada:

apt-cache policy grafana

Debe devolver algo como esto:

grafana:
  Instalados: 6.2.1
  Candidato:  6.2.1
  Tabla de versión:
 *** 6.2.1 100
        100 /var/lib/dpkg/status

4.3-Iniciando Grafana

Recargar systemd, iniciar y habilitar grafana para que corra al inicio del sistema:

systemctl daemon-reload
systemctl enable grafana-server
systemctl start grafana-server

Accedemos a la WebGUI de Grafana:

http://server_ip:3000

user: admin

passwd: admin

Definimos una nueva contraseña para la gestión del sitio y proseguimos:

 

Con esto echo ya tenemos instalado Grafana en nuestro sistema.

4.4-Integrando Prometheus con Grafana

Una vez que se haya configurado la colecta de métricas con Prometheus, sería muy provechoso integrar esas métricas coleccionadas con Grafana, para tener una visualización más intuitiva de los datos, gracias a sus bellos “dashboards”.

Agregamos la fuente de los datos, que en este caso será Prometheus, que a su vez obtiene las métricas del Node Exporter en cada host linux (incluyéndose él mismo):

Configuration > Datasources > Add data source

Ahora podríamos crear nuestros propios “dashboards” para la visualización de los datos o bien importar cualquiera que ya haya sido creado por la comunidad. Para más info, llegarse al siguiente enlace:

https://grafana.com/dashboards

Un ejemplo podría ser:

https://grafana.com/dashboards/10283

Esta plantilla ha sido importada y usada en este ejemplo para visualizar todas las métricas colectadas, usando Prometheus Node Exporter:

Imágenes del «dashboard» importado:

A continuación, otro ejemplo de “dahsboard” echo por la comunidad:

Hasta aquí usted cuenta con un sistema de monitoreo integrado con Prometheus y Grafana para visualización de los históricos de las métricas obtenidas por Node Exporter.

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4.8 / 5. Recuento de votos: 5

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sobre Franco Diaz Hurtado 27 artículos
Ing. Telecomunicaciones y Electrónica; 1er Especialista en Redes de ECASA Nivel Central

5 comentarios

  1. Google Chrome 81.0.4044.117 Google Chrome 81.0.4044.117 Android 9 Android 9
    Mozilla/5.0 (Linux; Android 9; Redmi Note 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.117 Mobile Safari/537.36

    Hola amigo, que métrica debería agregar en la configuración del node_exporter para poder monitorear las actualizaciones de mis sistemas Linux?

  2. Firefox 67.0 Firefox 67.0 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0

    root@debian:/opt# systemctl enable node_exporter.service

    The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
    Alias= settings in the [Install] section, and DefaultInstance= for template
    units). This means they are not meant to be enabled using systemctl.

    Possible reasons for having this kind of units are:
    • A unit may be statically enabled by being symlinked from another unit’s
    .wants/ or .requires/ directory.
    • A unit’s purpose may be to act as a helper for some other unit which has
    a requirement dependency on it.
    • A unit may be started when needed via activation (socket, path, timer,
    D-Bus, udev, scripted systemctl call, …).
    • In case of template units, the unit is meant to be enabled with some
    instance name specified.
    root@debian:/opt#

    ————————————————————-
    CREO QUE FALTA ALGO…MIRA LAS PRIMERAS LINEAS….
    LO VOLVI A REALIZAR CON OTRO SERVER Y PASO LO MISMO….MIRA ARRIBA..
    ES CUANDO PONGO ESTA LINEA
    root@debian:/opt# systemctl enable node_exporter.service

    NOTAS:
    TENGO DEBIAN 10
    prometheus-2.12.0.linux-amd64.tar
    node_exporter-0.18.1.linux-amd64.tar

    • Firefox 67.0 Firefox 67.0 Windows 10 x64 Edition Windows 10 x64 Edition
      Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0

      Jeansito, dame un chance que estoy volcado ahora con una serie de artículos sobre Nagsios, prometo echarle un ojo a esto que pones. Lo voy a volver a realizar en la infra que estoy haciendo, pero recuerda que estoy trabajando sobre Debian 9 y esto queme pones puede que sea una incompatibilidad con Debian 10. No tengo Buster, por lo que no puedo corroborarlo en ese S.O. Trata de tener el mismo software de instalación, primero para ir decantando posibles incompatibilidades con nuevas versiones.
      SL2

  3. Google Chrome 70.0.3538.80 Google Chrome 70.0.3538.80 Android 8.0.0 Android 8.0.0
    Mozilla/5.0 (Linux; Android 8.0.0; G8141) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36

    jeansito ese error no me suena. Prueba con service start node_exporter, si no resuelves reinicia el servidor y vuelve a intentar con systemctl. Verifica q asi se llama realmente el. servicio,y nos dices. Luego verrifico lo de los comandos repetidos.SL2

  4. Firefox 67.0 Firefox 67.0 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0

    HOLA…ME DA EL SIGUIENTE ERROR!!!
    ***************************************************
    root@debian:~# systemctl enable node_exporter.service
    The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
    Alias= settings in the [Install] section, and DefaultInstance= for template
    units). This means they are not meant to be enabled using systemctl.

    Possible reasons for having this kind of units are:
    • A unit may be statically enabled by being symlinked from another unit’s
    .wants/ or .requires/ directory.
    • A unit’s purpose may be to act as a helper for some other unit which has
    a requirement dependency on it.
    • A unit may be started when needed via activation (socket, path, timer,
    D-Bus, udev, scripted systemctl call, …).
    • In case of template units, the unit is meant to be enabled with some
    instance name specified.
    ************************************
    NOTA:
    Sugerencia
    1. tienes repetido la primera parte del tutorial
    2. useradd -M -r -s /bin/false Prometheus en ocasiones con mayúsculas y en otras con minúsculas..

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*