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 curlCreando usuario y grupo de sistema para prometheus:
useradd -M -r -s /bin/false PrometheusPara verificar esto, ingresamos la siguiente línea:
id prometheusDebe 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/prometheusAsignando los propietarios a los directorios creados:
chown prometheus:prometheus /etc/prometheus
chown prometheus:prometheus /var/lib/PrometheusDescargando 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.gzExtraemos el paquete:
tar -xzvf prometheus-2.11.1.linux-amd64.tar.gzCopie 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/promtoolCopie 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_librariesDescargando 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.gzExtraemos el paquete:
tar -xzvf prometheus-2.11.1.linux-amd64.tar.gzCopie 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/promtoolCopie 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_libraries1.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.ymlAjustamos 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.yml1.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.ymlEl 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.serviceAgregamos 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.targetRecargamos la configuración del demonio systemd:
systemctl daemon-reloadHabilitamos e iniciamos el servicio Prometheus para que corra con el inicio del sistema:
systemctl enable prometheus.service
systemctl start prometheus.serviceVerificamos el estado del servicio:
systemctl status prometheusSi 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:
rebootDespué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.shAgregar 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_librariesLe damos permisos de ejecución:
chmod +x /config/scripts/prometheus.startup.shEditamos el cron:
crontab -eAgregamos lo siguiente al final:
##############
# PROMETHEUS #
##############
@reboot /config/scripts/prometheus.startup.shReiniciamos 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_exporterEsto creará el usuario especificado con un grupo bajo el mismo nombre. Verificamos:
id node_exporterDebe 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.gzDesempaquetando "node_exporter-0.18.1.linux-amd64.tar.gz":
tar xzf node_exporter-0.18.1.linux-amd64.tar.gzCopiamos 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_exporter2.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.serviceAgregar 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.targetRecargamos la configuración del demonio systemd:
systemctl daemon-reloadIniciamos y habilitamos el servicio "node_exporter" para que corra con el inicio del sistema:
systemctl start node_exporter.service
systemctl enable node_exporter.serviceVerificamos el estado del servicio:
systemctl status node_exporter.serviceDebe 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_exporterReiniciamos el servidor:
rebootVerificamos 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 9100Debe 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.ymlAgregamos 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/metricsDebe 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.debDebe 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 grafanaDebe 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/status4.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-serverAccedemos 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.







No comments yet