Monitoreo de métricas en tiempo real y con historial [3ra Parte]

En esta tercera entrega analizaremos como guardar nuestras metricas y tener un historico de las mismas. Para ello usaremos Prometheus y grafana.

ÍNDICE

¿Qué es lo que se quiere?

Netdata.

¿Qué es Netdata?

Implementación y configuración de Netdata.

Prerrequisitos de instalación de Netdata sin internet.

Instalación de Netdata.

Configuración de Netdata-master.

Configurando Netdata-slave.

Proxy inverso para autenticación de Netdata.

HTTPS con certificado SSL auto-firmado para Nginx.

Configurando Nginx para usar SSL.

Creando un Fragmento de Configuración Apuntando a la Llave y Certificado SSL.

Creando una Porción de Configuración con Fuertes Opciones de Encriptación.

Ajustando la Configuración de Nginx para usar SSL.

Script anticrash para Netdata.

Prometheus.

¿Qué es Prometheus?.

Implementación y configuración de Prometheus.

Configurando Prometheus.

Iniciando Prometheus.

Comprobando resultados en servidor Prometheus.

Grafana.

¿Qué es Grafana?.

Implementación y configuración de Grafana.

Iniciando Grafana.

Integrando Prometheus con Grafana.

UFW

¿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”.

Este documento propone la integración de Netdata y Prometheus. Se aprovecharán las métricas en tiempo real de Netdata y se almacenarán en Prometheus, que servirá para el tener un “record” o historial de estas métricas.

Implementación y configuración de Prometheus.

En servidor “prometheus”:

Paquetes necesarios:

apt-get install wget curl -y

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 \
/var/lib/prometheus

Asignando los propietarios a los directorios creados:

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

Desde un host con acceso a internet, descargamos el programa de prometheus, desde el siguiente enlace:

  • https://github.com/prometheus/prometheus/releases/download/v2.23.0/prometheus-2.23.0.linux-amd64.tar.gz

Una vez copiado al directorio “/opt”, extraemos el paquete:

cd /opt
tar -xzvf prometheus-2.23.0.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.23.0.linux-amd64/prometheus /usr/local/bin/
cp prometheus-2.23.0.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.23.0.linux-amd64/consoles/ /etc/prometheus/
cp -r prometheus-2.23.0.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

Configurando Prometheus.

Ahora que tenemos todos los ficheros de configuración requeridos en su lugar, procedemos a configurar Prometheus. Su fichero de configuración por defecto 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.23.0.linux-amd64/prometheus.yml /etc/prometheus/

Editamos el fichero de configuración de ejemplo:

nano /etc/prometheus/prometheus.yml

Borramos todo y ajustamos el fichero de configuración, de manera que los “scrapes” tengan definidos los “targets” del netdata de cada uno de ellos. Prometheus encuestará las métricas de cada una de sus bases de datos propias, y no sólo la del netdata-master, por lo que debería permitirse su acceso vía iptables.

# 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:

# Servidor Prometheus
  - job_name: 'prometheus-scrape'
    metrics_path: '/api/v1/allmetrics'
    params:
      format: [prometheus]
    static_configs:
    - targets: ['prometheus.empresa.midominio.cu:19999']

# Servidor Netdata
  - job_name: 'netdata-scrape'
    metrics_path: '/api/v1/allmetrics'
    params:
      format: [prometheus]
    static_configs:
    - targets: ['netdata.empresa.midominio.cu:19999']

# Servidor Grafana
  - job_name: 'grafana-scrape'
    metrics_path: '/api/v1/allmetrics'
    params:
      format: [prometheus]
    static_configs:
    - targets: ['grafana.empresa.midominio.cu:19999']

# Otros hosts Linux a monitorear
  - job_name: 'servidor1-scrape'
    metrics_path: '/api/v1/allmetrics'
    params:
      format: [prometheus]
    static_configs:
    - targets: ['servidor1.empresa.midominio.cu:19999']

  - job_name: 'servidor2-scrape'
    metrics_path: '/api/v1/allmetrics'
    params:
      format: [prometheus]
    static_configs:
    - targets: ['servidor2.empresa.midominio.cu:19999']
# [...]

Establecemos el propietario del fichero de configuración:

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

Iniciando Prometheus.

La configuración básica de Prometheus está finalizada. Para iniciar el programa con la configuración básica, corremos la siguiente línea:

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, para verificar si el servidor web inició correctamente:

http://prometheus.empresa.midominio.cu:9090

Detenemos el servicio momentáneamente con la combinación de teclas “Ctrl+C”. Luego 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

Debe devolver, algo como lo siguiente:

Created symlink /etc/systemd/system/multi-user.target.wants/prometheus.service → /etc/systemd/system/prometheus.service.

Iniciamos el servicio:

systemctl start prometheus.service

Verificamos el estado del servicio:

systemctl status prometheus

Reiniciamos el servidor:

reboot

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

systemctl status prometheus.service

Comprobando resultados en servidor Prometheus.

Nos autenticamos 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». Los estados que salgan en “DOWN”, se debe a que no se han configurado aun, en este caso sucede en este caso, con “grafana-scrape” (el servidor de grafana), el cual al momento de esta captura, aún no se encontraba configurado:

Para verificar que el servidor de Prometheus recibe las métricas de sus objetivos, que apuntan a Netdata, debe correr el siguiente comando:

#curl http://<netdata-master-IP>:19999/metrics
curl http://netdata.empresa.midominio.cu:19999/api/v1/allmetrics

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 aquí hemos configurado satisfactoriamente un servidor de Prometheus para albergar las métricas de Netadata.

¿Qué es Grafana?.

Grafana es un software libre basado en licencia de Apache 2.0, ​ 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.

Implementación y configuración de Grafana.

En servidor “grafana”:

Instalando Grafana usando el empaquetado “.deb” descargado y ubicado en “/opt”:

apt install -y adduser libfontconfig1
cd /opt
wget https://dl.grafana.com/oss/release/grafana_7.3.5_amd64.deb
dpkg -i grafana_7.3.5_amd64.deb

Iniciando Grafana.

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

systemctl daemon-reload
systemctl enable grafana-server.service

Debe devolver, algo como esto:

Synchronizing state of grafana-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable grafana-server
Created symlink /etc/systemd/system/multi-user.target.wants/grafana-server.service → /lib/systemd/system/grafana-server.service.

Iniciamos Grafana:

systemctl start grafana-server.service

Accedemos a la WebGUI de Grafana:

http://grafana.empresa.midominio.cu:3000

Las credenciales de autenticación por defecto, son las siguientes:

  • user: admin
  • passwd: admin

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

Una vez autenticados nos recibe el menú principal de Grafana:

Con esto echo ya tenemos instalado Grafana en nuestro sistema.

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 de Netdata de cada host linux (incluyéndose él mismo), a través del propio netdata-master:

“Configuration > Datasources > Add data source”

De las fuentes de datos disponibles para Grafana, seleccionamos Prometheus:

Al seleccionar Prometheus como fuente de datos, se abrirá la configuración correspondiente. Las imágenes siguientes describen el procedimiento de configuración:

NOTA: Debe poner como nombre a esta fuente de datos “Prometheus-1”, para que más adelante funcione el “dashboard” personalizado que se va a utilizar.

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 información, llegarse al siguiente enlace:

https://grafana.com/dashboards

Un ejemplo podría ser “my_netdata_v1.25.0_rev1.json”, una revisión echa por el autor de este tutorial, que se basa en el “netdata_rev1.json”, compatible con versiones anteriores a la v1.25.0 de Netdata y con errores para mostrar los paneles, según la variable del “job” especificado por Prometheus, en el “query” de la métrica. Esta revisión puede descargarla del siguiente enlace:

https://github.com/Franco-Sparrow/franco-repos/raw/master/my_netdata_v1.25.0_rev1.zip

Esta plantilla ha sido importada y usada en este ejemplo para visualizar todas las métricas colectadas, usando Prometheus y Netdata. Las siguientes imágenes muestran el recorrido para importar el “dashboard”:

A continuación, se muestra una imagen con un fragmento de los paneles del “dashboard”, ya arreglado para mostrar solo los gráficos del “job” seleccionado:

Es posible que haya algunos gráficos que no se muestren correctamente, al no tener datos que mostrar. Esto de sebe a que posiblemente dichos “charts” cambiaron y ya no se llaman igual, o fueron modificados completamente y la lógica de programación del dashboard no es compatible.

UFW

Uncomplicated Firewall (UFW) es un cortafuegos diseñado para ser de fácil uso desarrollado por Ubuntu. Utiliza la línea de comandos para configurar las iptables usando un pequeño número de comandos simples.

  • Para todos los hosts
apt-get install ufw -y

Configuraremos las siguientes reglas en UFW, según los puertos de los servicios que serán usados en nuestro webhosting.

Políticas predeterminadas:

ufw default deny incoming
ufw default allow outgoing

Permitir todas las conexiones que provengan del propio localhost:

ufw allow from 127.0.0.1 to any

Políticas referentes a gestión remota por SSH, sólo para los administradores:

ufw allow from 192.168.3.0/24 to any port ssh
#ufw allow from 192.168.3.0/24 to any port 22/tcp
  • Políticas para netdata-master relacionadas con Netdata

Permitir acceso al Netdata, solo para administradores de red y servidores:

ufw allow from 192.168.3.0/24 to any port http
#ufw allow from 192.168.3.0/24 to any port 80/tcp
ufw allow from 192.168.3.0/24 to any port https
#ufw allow from 192.168.3.0/24 to any port 443/tcp
ufw allow from 192.168.120.0/24 to any port 19999
ufw allow from 192.168.130.0/24 to any port 19999
  • Políticas para los netdata-slave relacionadas con Netdata

Permitir acceso al Netdata, solo para administradores de red y netdata-master:

ufw allow from 192.168.3.0/24 to any port http
#ufw allow from 192.168.3.0/24 to any port 80/tcp
ufw allow from 192.168.3.0/24 to any port https
#ufw allow from 192.168.3.0/24 to any port 443/tcp
ufw allow from 192.168.120.203/24 to any port 19999

Deben agregarse las reglas referentes a los demás servicios que corran en estos servidores. En este caso, sólo se especificaron las reglas referentes a Netdata.

  • Para todos los hosts

Finalmente habilitamos el cortafuegos:

ufw enable

Nos debe devolver lo siguiente e indicamos la respuesta, si estamos conectados por SSH:

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

Debe devolver lo siguiente:

Firewall is active and enabled on system startup

Para ver el listado de reglas numeradas:

ufw status numbered

Para ver el listado de reglas más detallado:

ufw status verbose

Hasta Aqui este extenso tutorial, espero les ayude en sus tareas diarias

alex out

¿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 Alexander Rivas Alpizar 61 artículos
Administrador de Redes IDEAR Cienfuegos

Sé el primero en comentar

Dejar una contestacion

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


*