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.
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?
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
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
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
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..