Cómo instalar y supervisar servicios con la herramienta de supervisión Netdata en Debian 12

Netdata es un sistema de supervisión de código abierto para sistemas operativos basados en Linux. Proporciona rendimiento y supervisión en tiempo real mediante paneles de control bonitos y detallados. Ofrece cientos de herramientas para supervisar servidores, CPU, uso de memoria, procesos del sistema, uso de disco, redes IPv4 e IPv6, cortafuegos del sistema y aplicaciones como Nginx, MySQL, MongoDB, Redis, ElasticSearch, PostgreSQL, PHP-FPM, etc. Se integra con otras herramientas de monitorización como Prometheus, Graphite, Kafka, Grafana, etc.

Este tutorial te mostrará cómo instalar y supervisar varios servicios utilizando Netdata en un servidor Debian 12. También lo utilizarás para hacer un seguimiento de las métricas de una pila LEMP y un motor Docker.

Requisitos previos

  • Un servidor con Debian 12.
  • Un usuario no root con privilegios sudo.
  • Un Nombre de Dominio Completamente Cualificado (FQDN) como netdata.example.com que apunte a tu servidor.
  • Una cuenta SMTP con un servicio de correo electrónico como Amazon SES o Mailgun.
  • Asegúrate de que todo está actualizado.
    $ sudo apt update
    $ sudo apt upgrade
    
  • Pocos paquetes que necesite tu sistema.
    $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y
    

    Puede que algunos de estos paquetes ya estén instalados en tu sistema.

Paso 1 – Configurar el cortafuegos

El primer paso es configurar el cortafuegos. Debian viene con ufw (Uncomplicated Firewall) por defecto.

Comprueba si el cortafuegos se está ejecutando.

$ sudo ufw status

Obtendrás la siguiente salida.

Status: inactive

Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.

$ sudo ufw allow OpenSSH

Permite también los puertos HTTP y HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Habilita el cortafuegos

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Comprueba de nuevo el estado del cortafuegos.

$ sudo ufw status

Deberías ver un resultado similar.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Paso 2 – Instala NetData

Netdata viene con un script instalador que puede funcionar en cualquier distribución de Linux. Ejecuta el siguiente comando para descargar el script de instalación.

$ wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh

Ejecuta el script de instalación con el siguiente comando.

$ sudo sh /tmp/netdata-kickstart.sh --stable-channel --disable-telemetry

La bandera --stable-channel instala la versión estable de Netdata. La bandera --disable-telemetry impide que Netdata envíe estadísticas anónimas a su servidor. Hay otras banderas que puedes utilizar para personalizar tu instalador.

Introduce Y para confirmar que has añadido el repositorio de Netdata y lo has instalado en tu servidor. Deberías recibir el siguiente mensaje si la instalación se ha realizado correctamente.

Successfully installed the Netdata Agent.

Official documentation can be found online at https://learn.netdata.cloud/docs/.

Looking to monitor all of your infrastructure with Netdata? Check out Netdata Cloud at https://app.netdata.cloud.

Join our community and connect with us on:
  - GitHub: https://github.com/netdata/netdata/discussions
  - Discord: https://discord.gg/5ygS846fR6
  - Our community forums: https://community.netdata.cloud/
[/root]# rm -rf /tmp/netdata-kickstart-wH4pebXveT
 OK

El instalador de Netdata habilita e inicia automáticamente el servicio. Comprueba el estado del servicio.

$ sudo systemctl status netdata
? netdata.service - Real time performance monitoring
     Loaded: loaded (/lib/systemd/system/netdata.service; enabled; preset: enabled)
     Active: active (running) since Thu 2023-08-24 10:26:56 UTC; 42s ago
   Main PID: 2811 (netdata)
      Tasks: 82 (limit: 1107)
     Memory: 108.2M
        CPU: 4.271s
     CGroup: /system.slice/netdata.service
             ??2811 /usr/sbin/netdata -D -P /var/run/netdata/netdata.pid
             ??2822 /usr/sbin/netdata --special-spawn-server
             ??3127 bash /usr/libexec/netdata/plugins.d/tc-qos-helper.sh 1
             ??3137 /usr/libexec/netdata/plugins.d/go.d.plugin 1
             ??3142 /usr/libexec/netdata/plugins.d/ebpf.plugin 1
             ??3145 /usr/libexec/netdata/plugins.d/nfacct.plugin 1
             ??3149 /usr/libexec/netdata/plugins.d/systemd-journal.plugin 1
             ??3155 /usr/libexec/netdata/plugins.d/debugfs.plugin 1
             ??3159 /usr/libexec/netdata/plugins.d/apps.plugin 1

Aug 24 10:26:58 netdata ebpf.plugin[3142]: set name of thread 3188 to EBPF SOFTIRQ
.......

Si el servicio no está iniciado o habilitado, puedes hacerlo utilizando el siguiente comando.

$ sudo systemctl enable netdata --now

Ejecuta el siguiente comando para comprobar los puertos abiertos y el proceso que los utiliza.

$ sudo ss -plnt | grep netdata

Deberías obtener una salida similar. Netdata utiliza el puerto 19999 para su panel de control, como se ve en la salida siguiente. Netdata utiliza el puerto 8125 para recibir estadísticas de otras aplicaciones.

State  Recv-Q Send-Q      Local Address:Port  Peer Address:Port    Process
LISTEN 0      4096         0.0.0.0:19999      0.0.0.0:*            users:(("netdata",pid=2811,fd=8))
LISTEN 0      4096       127.0.0.1:8125       0.0.0.0:*            users:(("netdata",pid=2811,fd=47))
LISTEN 0      4096           [::1]:8125          [::]:*            users:(("netdata",pid=2811,fd=46))
LISTEN 0      4096            [::]:19999         [::]:*            users:(("netdata",pid=2811,fd=9))

Paso 3 – Instalar Nginx

Debian 12 incluye una versión antigua de Nginx. Para instalar la última versión, tienes que descargar el repositorio oficial de Nginx.

Importa la clave de firma de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Añade el repositorio de la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios del sistema.

$ sudo apt update

Instala las utilidades de Nginx y Apache. El paquete de utilidades de Apache es necesario para la utilidad htpasswd.

$ sudo apt install nginx apache2-utils

Verifica la instalación. En los sistemas Debian, el siguiente comando sólo funcionará con sudo.

$ sudo nginx -v
nginx version: nginx/1.24.0

Inicia el servidor Nginx.

$ sudo systemctl start nginx

Comprueba el estado del servicio.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Thu 2023-08-24 11:36:34 UTC; 4s ago
       Docs: https://nginx.org/en/docs/
    Process: 3657 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 3658 (nginx)
      Tasks: 2 (limit: 1107)
     Memory: 1.8M
        CPU: 12ms
     CGroup: /system.slice/nginx.service
             ??3658 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??3659 "nginx: worker process"

Paso 4 – Instalar SSL

Necesitamos instalar Certbot para generar el certificado SSL. Puedes instalar Certbot utilizando el repositorio de Debian u obtener la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Debian 12 no viene con Snapd instalado. Instala el paquete Snapd.

$ sudo apt install snapd

Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd está actualizada.

$ sudo snap install core && sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Comprueba si Certbot funciona correctamente.

$ certbot --version
certbot 2.6.0

Genera el certificado SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d netdata.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/netdata.example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Comprueba el servicio programador de renovación de Certbot.

$ sudo systemctl list-timers

Encontrarás snap.certbot.renew.service como uno de los servicios programados para ejecutarse.

NEXT                        LEFT          LAST                        PASSED      UNIT                         ACTIVATES
.....
Thu 2023-08-24 13:40:00 UTC 1h 59min left -                           -           snap.certbot.renew.timer     snap.certbot.renew.service
Thu 2023-08-24 18:47:23 UTC 7h left       Thu 2023-08-24 09:30:41 UTC 2h 9min ago apt-daily.timer              apt-daily.service
Fri 2023-08-25 00:00:00 UTC 12h left      -                           -           dpkg-db-backup.timer         dpkg-db-backup.service

Realiza una ejecución en seco del proceso para comprobar si la renovación SSL funciona correctamente.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Paso 5 – Configurar Nginx

Crea y abre el archivo /etc/nginx/conf.d/netdata.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/netdata.conf

Pega en él el siguiente código.

# Define netdata upstream
upstream netdata {
    server 127.0.0.1:19999;
    keepalive 64;
}

# Redirect all non-encrypted to encrypted
server {
    listen 80;
    listen [::]:80;
    server_name netdata.example.com;
    return 301 https://netdata.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    
    server_name netdata.example.com;

    ssl_certificate     /etc/letsencrypt/live/netdata.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/netdata.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/netdata.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_prefer_server_ciphers off;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
    resolver_timeout 2s;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    access_log /var/log/nginx/netdata.example.com.access.log main;
    error_log  /var/log/nginx/netdata.example.com.error.log;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
    	proxy_pass http://netdata;
    	proxy_http_version 1.1;
        proxy_pass_request_headers on;
        proxy_set_header Connection "keep-alive";
        proxy_store off;
        auth_basic "NetData Private Area";
	    auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

Una vez terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Ejecuta el siguiente comando para generar un archivo de contraseñas para habilitar la autenticación HTTP.

$ sudo htpasswd -c /etc/nginx/.htpasswd netadmin
New password: 
Re-type new password: 
Adding password for user netadmin

Verifica la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicia el servicio Nginx para habilitar la nueva configuración.

$ sudo systemctl restart nginx

Paso 6 – Acceder y utilizar el Panel de Netdata

Deberías poder acceder a Netdata a través de la URL https://netdata.example.com. La primera vez que accedas, se te pedirán tus datos de autenticación HTTP.

Autenticación HTTP Netdata

Obtendrás el siguiente panel de control.

Panel de Netdata por primera vez

Puedes pausar, detener e iniciar la monitorización en cualquier momento utilizando el botón Reproducir del panel de control.

Botón Reproducir/Pausa de Netdata

Puedes acceder a varios paneles haciendo clic en las opciones de la barra lateral derecha.

Por defecto, Netdata puede realizar un seguimiento correcto de tu zona horaria. Si no lo hace, haz clic en el temporizador y selecciona la zona horaria correcta en la ventana emergente para cambiarla.

Cambio de huso horario en Netdata

Paso 7 – Configurar NetData

Netdata almacena su configuración principal en el archivo /etc/netdata/netdata.conf. Puedes ver esta configuración visitando la URL https://netdata.example.com/netdata.conf en tu navegador.

Archivo de configuración de Netdata en el navegador

El archivo está dividido en varias secciones, como [global], [db], [web], [registro], etc. La configuración por defecto es suficiente para empezar. Netdata recopila datos utilizando dos tipos de plugins:

  1. los pluginsinternos están escritos en lenguaje C y se ejecutan como hilos dentro del demonio netdata.
  2. Los pluginsexternos están escritos en varios lenguajes, como Python, Go, etc., y el demonio netdata los genera como procesos independientes de larga duración. Se comunican con el demonio Netdata mediante pipes.

Configurar el uso de memoria de NetData

El uso de RAM de NetData se decide en función del tiempo que quieras conservar los datos del gráfico grabado antes de que se pierdan.

  • 3600 segundos o 1 hora de retención de datos de gráficos utiliza 15 MB de RAM.
  • 7200 segundos o 2 horas de retención de datos de gráficos utiliza 30 MB de RAM.
  • 14400 segundos o 4 horas de retención de datos del gráfico utilizan 60 MB de RAM.

Cada vez que duplicas el tiempo de retención de datos del gráfico, también se duplican los requisitos de RAM. Estos requisitos de RAM se basan en el número de gráficos que utiliza el panel de acciones. Añadir más gráficos y aplicaciones cambiará estas estimaciones.

Abre el archivo de configuración de Netdata.

$ sudo nano /etc/netdata/netdata.conf

Introduce la línea history = 14400 en la sección [global].

[global]
    run as user = netdata

    # default storage size - increase for longer data retention
    page cache size = 32
    dbengine multihost disk space = 256
    history = 14400

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Desactivar la telemetría

Por defecto, Netdata recopila información anónima de uso utilizando una plataforma de análisis de productos, Posthog. Cada vez que se inicia o se detiene el demonio Netdata, Netdata utiliza el script de estadísticas anónimas para recopilar la siguiente información del sistema y enviársela a sí mismo.

  • Versión de Netdata
  • Nombre del SO, versión, id, id_like
  • Nombre del núcleo, versión, arquitectura
  • Tecnología de virtualización
  • Tecnología de contenedorización
  • Información adicional sobre fallos del cliente Netdata.

Desactivamos la Telemetría durante la instalación, pero si no lo hiciste, puedes hacerlo ahora. Crea un archivo vacío llamado .opt-out-from-anonymous-statistics en el directorio Netdata.

$ sudo touch /etc/netdata/.opt-out-from-anonymous-statistics

Reinicia Netdata para activar el cambio.

$ sudo systemctl restart netdata

Almacenamiento a largo plazo

Netdata utiliza por defecto la RAM y el disco de tu sistema para almacenar datos históricos. El proceso predeterminado de Netdata recoge unas 2000 métricas por segundo, lo que significa que la configuración predeterminada almacenará en la RAM y el disco las métricas de unos dos días.

Para almacenar más métricas, tienes las dos opciones siguientes:

  1. Configurar Netdata para que utilice más memoria RAM y espacio en disco
  2. Archivar las métricas en una base de datos externa

En este tutorial sólo trataremos la primera opción. Para la segunda opción, debes consultar la documentación oficial de Netdata.

Configurar Netdata para que utilice más RAM y espacio en disco

Abre el archivo /etc/netdata/netdata.conf para editarlo.

$ sudo nano /etc/netdata/netdata.conf

Configura las siguientes líneas en la sección [global].

[global]
...
    page cache size = 32
    dbengine multihost disk space = 256

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

El tamaño de la caché de página determina la cantidad de RAM utilizada, y la variable dbengine multihost disk space determina el uso del disco. Por defecto, Netdata utiliza 32 MB de RAM y 256 MB de espacio en disco. Puedes cambiar cualquiera de los dos valores a tu gusto.

Puedes utilizar la calculadora Métrica de Almacenamiento de Netdata para decidir cuánta RAM y espacio en disco necesitas.

Reducir la frecuencia de recogida

Puedes optimizar el rendimiento de Netdata aumentando el tiempo entre la recogida de métricas. Por defecto, Netdata recopila métricas cada segundo.

Para cambiarlo, abre el archivo de configuración de Netdata para editarlo.

$ sudo nano /etc/netdata/netdata.conf

Introduce la siguiente línea en la sección [global]. Esto aumenta la frecuencia a 5 segundos.

[global]
...
    update every = 5

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Paso 8 – Configurar las notificaciones de Slack

El primer paso es crear una aplicación Slack y conectarla a un canal específico de tu espacio de trabajo para configurar las Notificaciones Slack.

Visita la página de la API de Slack y haz clic en el botón Crear App para empezar a crear una aplicación.

Aplicaciones de la API de Slack

Haz clic en el enlace Desde cero para crear la app.

Slack Crear App Popup

Selecciona un nombre para tu aplicación y elige el espacio de trabajo en el que quieres que aparezca tu App. Si no quieres asociar tu app al espacio de trabajo existente, puedes crear otro y volver a este paso.

Ventana emergente del nombre de la aplicación Slack

Abre la página del Webhook entrante seleccionando la opción en el menú Características de la barra lateral izquierda y, a continuación, activa el webhook.

WebHooks entrantes de Slack Apps

Haz clic en el botón Añadir nuevo webhook al espacio de trabajo, en la parte inferior de la página, y selecciona tu espacio de trabajo y el canal de destino de las notificaciones.

Añadir Slack App a WorkSpace

Haz clic en el botón Permitir para continuar. Vuelve a la página de Webhooks Entrantes y copia la URL del Webhook.

URL del Webhook de Slack

Vuelve al terminal y cambia al directorio /etc/netdata.

$ cd /etc/netdata

Netdata proporciona un script edit-config para editar y crear archivos de configuración de Netdata. Ejecuta el siguiente archivo para crear y abrir el archivo health_alarm_notify.conf utilizando el editor predeterminado de tu sistema.

$ sudo ./edit-config health_alarm_notify.conf

Desplázate hasta la sección siguiente.

# Enable slack notification
SEND_SLACK="YES"

# Select the slack webhook
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/xxxxxxx/xxxxxx/xxxxxxxxxxxxx"

# Default channel for notification
DEFAULT_RECIPIENT_SLACK="notifications"

Asegúrate de que la variable SEND_SLACK está establecida en sí. Pega la URL del webhook copiada en la variable SLACK_WEBHOOK_URL. Introduce el nombre de tu canal para la variable DEFAULT_RECIPIENT_SLACK.

Si tu editor es Vim, pulsa la tecla Escape para salir de la edición, escribe 😡 y pulsa la tecla Intro para guardar el archivo y salir del editor.

Si tu editor es Nano, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Reinicia Netdata para aplicar los cambios.

$ sudo systemctl restart netdata

Paso 9 – Configurar las notificaciones por correo electrónico

Netdata utiliza sendmail por defecto para enviar notificaciones por correo electrónico, pero gestionar un servidor de correo electrónico no es tarea fácil. Netdata no admite SMTP, pero puedes instalar un paquete llamado msmtp client. Te permite enviar correo a un servidor SMTP.

Instala msmtp.

$ sudo apt install msmtp

Crea y abre el archivo de configuración de msmtp.

$ sudo nano /etc/msmtprc

Pega en él el siguiente código.

# Set default values for all following accounts.
defaults

# Use the mail submission port 587 instead of the SMTP port 25.
port 587

# Always use TLS.
tls on

# The SMTP server of your ISP
account ses
host email-smtp.<location>.amazonaws.com
from [email protected]
auth on
user <yoursesusername>
password <yoursespassword>

# Set default account to isp
account default: ses

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Netdata proporciona un script edit-config para editar y crear archivos de configuración de Netdata. Ejecuta el siguiente archivo para crear y abrir el archivo health_alarm_notify.conf utilizando el editor predeterminado de tu sistema.

$ sudo /etc/netdata/edit-config health_alarm_notify.conf

Desplázate hasta la siguiente sección e introduce la ruta al archivo msmtp.

# external commands

# The full path to the sendmail command.
# If empty, the system $PATH will be searched for it.
# If not found, email notifications will be disabled (silently).
sendmail="/usr/bin/msmtp"

Localiza la siguiente sección e introduce los datos del remitente y del destinatario y asegúrate de que el envío de correo electrónico está activado.

# email global notification options

# multiple recipients can be given like this:
#              "[email protected] [email protected] ..."

# the email address sending email notifications
# the default is the system user netdata runs as (usually: netdata)
# The following formats are supported:
# EMAIL_SENDER="user@domain"
# EMAIL_SENDER="User Name <user@domain>"
# EMAIL_SENDER="'User Name' <user@domain>"
# EMAIL_SENDER="\"User Name\" <user@domain>"
EMAIL_SENDER="Server Admin <[email protected]>"

# enable/disable sending emails
SEND_EMAIL="YES"

# if a role recipient is not configured, an email will be send to:
DEFAULT_RECIPIENT_EMAIL="[email protected]"
# to receive only critical alarms, set it to "root|critical"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Reinicia Netdata para aplicar los cambios.

$ sudo systemctl restart netdata

Paso 10 – Prueba de los canales de notificación

Probemos si funcionan las notificaciones por correo electrónico. Inicia sesión como el usuario del sistema netdata creado durante la instalación.

$ sudo su -s /bin/bash netdata

Ejecuta el script de notificación de alarma para enviar una notificación de prueba.

$ /usr/libexec/netdata/plugins.d/alarm-notify.sh test

Recibirás la siguiente salida.

# SENDING TEST WARNING ALARM TO ROLE: sysadmin
2023-08-24 12:56:00: alarm-notify.sh: INFO: sent email notification for: netdata test.chart.test_alarm is WARNING to '[email protected]'
# OK

# SENDING TEST CRITICAL ALARM TO ROLE: sysadmin
2023-08-24 12:56:03: alarm-notify.sh: INFO: sent email notification for: netdata test.chart.test_alarm is CRITICAL to '[email protected]'
# OK

# SENDING TEST CLEAR ALARM TO ROLE: sysadmin
2023-08-24 12:56:06: alarm-notify.sh: INFO: sent email notification for: netdata test.chart.test_alarm is CLEAR to '[email protected]'
# OK

Sal del usuario.

$ exit.

Abre tu aplicación Slack, y deberías haber recibido las siguientes alertas.

Notificaciones de prueba de Netdata Slack

También deberías recibir tres correos electrónicos sobre los avisos de prueba.

Notificaciones de prueba por correo electrónico de Netdata

Paso 11 – Configurar la Monitorización del Sistema

Ahora que hemos configurado y probado las notificaciones, vamos a configurar y probar las notificaciones para el sistema, como el uso de la CPU.

Ejecuta los siguientes comandos para crear y abrir el archivo de configuración de la CPU.

$ sudo /etc/netdata/edit-config health.d/cpu.conf

Cambia los valores de las opciones warn y crit en 10min_cpu_usage como se muestra a continuación.

warn: $this > (($status >= $WARNING)  ? (60) : (70))
crit: $this > (($status == $CRITICAL) ? (75) : (85))

Guarda el archivo y sal del editor.

La configuración anterior enviará una advertencia si el uso de la CPU cae entre el 60 y el 70% y una advertencia crítica cuando el uso de la CPU caiga entre el 75 y el 85%.

Reinicia el servicio Netdata.

$ sudo systemctl restart netdata

Probemos la configuración instalando la aplicación Estrés.

$ sudo apt install stress

Ejecuta el siguiente comando para aumentar el uso de CPU de tu servidor.

$ stress --cpu 2

Deja que el comando se ejecute durante 5-10 minutos, y recibirás mensajes de Alto uso de CPU. Cuando recibas esos mensajes, vuelve al terminal y sal del comando pulsando Ctrl + Z.

Tras detener el servicio, recibirás una notificación de recuperación de CPU en Slack.

Notificaciones de uso de CPU en Slack

Paso 12 – Configurar la monitorización de Nginx

Una de las aplicaciones más monitorizadas con Netdata es el servidor y los paquetes SQL. Vamos a monitorizar el servidor Nginx utilizando Netdata.

Para habilitar la monitorización del servidor Nginx, necesitamos utilizar el módulo ngx_http_stub_status_module. Suele venir preinstalado con Nginx. Puedes comprobar si el módulo está presente. El comando sudo es necesario en el sistema Debian.

$ sudo nginx -V 2>&1 | grep -o with-http_stub_status_module
with-http_stub_status_module

Si no obtienes respuesta, significa que tu instalación de Nginx no admite la función. En ese caso, tendrás que compilar Nginx.

Abre el archivo de configuración por defecto de Nginx /etc/nginx/conf.d/default.conf para editarlo. La ubicación del archivo es diferente porque hemos instalado Nginx desde su repositorio oficial. Si instalas Nginx desde el repositorio del SO, entonces la ubicación del archivo será /etc/nginx/nginx.conf.

$ sudo nano /etc/nginx/conf.d/default.conf

Introduce el siguiente código dentro del bloque del servidor, antes de la última llave de cierre.

# Enable module stub_status
location /stub_status {
	stub_status;
    allow 127.0.0.1;        #only allow requests from localhost
    deny all;               #deny all other hosts
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Verifica la configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicia el servidor Nginx.

$ sudo systemctl restart nginx

Reinicia el servicio Netdata.

$ sudo systemctl restart netdata

Deberías ver los detalles de la conexión Nginx en tu panel de Netdata.

Detalles de la conexión Netdata Nginx

Supervisar los registros de Nginx

Netdata también puede supervisar los registros de acceso de Nginx. Para ello, cambia al directorio Netdata.

$ cd /etc/netdata

Ejecuta el siguiente comando para generar un archivo de configuración para supervisar los Registros de Acceso.

$ sudo ./edit-config go.d/web_log.conf

Desplázate hasta la parte inferior del archivo y encuentra la siguiente sección.

# -------------------------------------------
# nginx log on various distros

# debian, arch
nginx_log:
  name: 'nginx'
  path: '/var/log/nginx/access.log'

# gentoo
nginx_log2:
  name: 'nginx_site'
  path: '/var/log/nginx/localhost.access_log'

Cambia la ruta para supervisar los respectivos archivos de registro. Puedes añadir tantas secciones para supervisar tantos hosts y sus archivos de registro de acceso. Nuestro archivo de configuración tiene el siguiente aspecto.

# -------------------------------------------
# nginx log on various distros

# debian, arch
nginx_log:
  name: 'nginx'
  path: '/var/log/nginx/access.log'

nginx_log2:
  name: 'nginx_site1'
  path: '/var/log/nginx/site1.access_log'

nginx_log3:
  name: 'nginx_site2'
  path: '/var/log/nginx/site2.access_log'

nginx_log4:
  name: 'nginx_site3'
  path: '/var/log/nginx/site3.access_log'

Guarda y sal del editor.

Para acceder a los archivos de registro, Netdata necesita permiso para acceder al directorio. Por defecto, el grupo de sistema adm tiene permiso para acceder a los archivos de registro. Para dar acceso a Netdata, necesitamos añadir el usuario netdata al grupo adm.

$ sudo usermod -aG adm netdata

Reinicia Nginx y el servicio Netdata.

$ sudo systemctl restart nginx netdata

Recarga el panel de Netdata para ver los datos de tus archivos de registro.

Panel de control del registro de acceso Netdata

Paso 13 – Configurar la monitorización de MySQL/MariaDB

Instalaremos MariaDB para nuestro tutorial. Para ello utilizaremos el repositorio de MariaDB.

Importa la clave GPG de MariaDB.

$ sudo curl -o /usr/share/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'

Crea y abre el archivo del repositorio MariaDB.

$ sudo nano /etc/apt/sources.list.d/mariadb.sources

Pega en él el siguiente código.

# MariaDB 10.11 repository list - created 2023-09-05 11:18 UTC
# https://mariadb.org/download/
X-Repolib-Name: MariaDB
Types: deb
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# URIs: https://deb.mariadb.org/10.11/debian
URIs: https://mirrors.aliyun.com/mariadb/repo/10.11/debian
Suites: bookworm
Components: main
Signed-By: /usr/share/keyrings/mariadb-keyring.pgp

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Instala el servidor MariaDB.

$ sudo apt install mariadb-server

MariaDB está activado y en funcionamiento. Comprueba el estado del servicio.

$ sudo systemctl status mariadb
? mariadb.service - MariaDB 10.11.5 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; preset: enabled)
    Drop-In: /etc/systemd/system/mariadb.service.d
             ??migrated-from-my.cnf-settings.conf
     Active: active (running) since Tue 2023-09-05 11:44:17 UTC; 20s ago
       Docs: man:mariadbd(8)
             https://mariadb.com/kb/en/library/systemd/
    Process: 9396 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
    Process: 9397 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
    Process: 9399 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR >
    Process: 9440 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
    Process: 9442 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
   Main PID: 9428 (mariadbd)
     Status: "Taking your SQL requests now..."
      Tasks: 13 (limit: 1107)
     Memory: 111.8M
        CPU: 663ms
     CGroup: /system.slice/mariadb.service
             ??9428 /usr/sbin/mariadbd

Inicia el script de instalación segura de MySQL. El nombre del archivo es diferente en el caso de MariaDB.

$ sudo mariadb-secure-installation
....
Enter current password for root (enter for none): (Press Enter)
....
Switch to unix_socket authentication [Y/n] Y (Type Y and Press Enter)
....
Change the root password? [Y/n] Y (Type Y and Press Enter)
New password: 
Re-enter new password: 
Password updated successfully!
....
Remove anonymous users? [Y/n] Y (Type Y and Press Enter)
....
Disallow root login remotely? [Y/n] Y (Type Y and Press Enter)
....
Remove test database and access to it? [Y/n] Y (Type Y and Press Enter)
....
Reload privilege tables now? [Y/n] Y (Type Y and Press Enter)
....
All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Abre el archivo /etc/mysql/mariadb.conf.d/50-server.cnf para editarlo.

$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Busca la sección [mariadb] en el archivo y pega la siguiente línea como se muestra a continuación para habilitar el plugin Userstats. Esta configuración sólo funciona en MariaDB y no en el servidor MySQL.

[mariadb]
userstat = 1

Accede al shell de MySQL.

$ sudo mysql

Ejecuta los siguientes comandos para crear un usuario Netdata SQL y darle privilegios para realizar un seguimiento de las estadísticas de MySQL.

MariaDB> create user 'netdata'@'localhost';
MariaDB> GRANT USAGE, REPLICATION CLIENT, PROCESS ON *.* TO 'netdata'@'localhost';
MariaDB> FLUSH PRIVILEGES;
MariaDB> exit

Crea el archivo de configuración MySQL para Netdata.

$ sudo /etc/netdata/edit-config go.d/mysql.conf

Se abrirá un archivo con todas las opciones posibles. Si estás satisfecho, guarda y cierra el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Reinicia el servidor MariaDB.

$ sudo systemctl restart mariadb

Reinicia el servicio Netdata.

$ sudo systemctl restart netdata

El panel de MariaDB/MySQL debería empezar a aparecer en el panel de Netdata.

Panel NetData MySQL/MariaDB

Paso 14 – Configurar la monitorización de PHP-FPM

Puedes monitorizar una o más instancias de PHP-FPM utilizando Netdata. Para nuestro tutorial, instalaremos PHP 8.2 y activaremos su monitorización.

Debian 12 incluye PHP 8.2 por defecto. Pero para estar siempre en la última versión de PHP utilizaremos el repositorio PHP de Ondrej.

En primer lugar, importa la clave GPG de PHP del repositorio de Sury.

$ sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg

Añade el repositorio PHP de Ondrej Sury.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

Actualiza la lista de repositorios del sistema.

$ sudo apt update	

Ahora, puedes instalar cualquier versión de PHP.

$ sudo apt install php8.2-fpm php8.2-cli php8.2-mbstring

Verifica la instalación.

$ php --version
PHP 8.2.10 (cli) (built: Sep  4 2023 08:12:29) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.10, Copyright (c), by Zend Technologies

Configurar PHP

Abre el archivo /etc/php/8.2/fpm/pool.d/www.conf.

$ sudo nano /etc/php/8.2/fpm/pool.d/www.conf

Necesitamos establecer el usuario/grupo Unix de los procesos PHP a nginx. Busca las líneas user=www-data y group=www-data en el archivo y cámbialas por nginx.

....
; Unix user/group of the child processes. This can be used only if the master
; process running user is root. It is set after the child process is created.
; The user and group can be specified either by their name or by their numeric
; IDs.
; Note: If the user is root, the executable needs to be started with
;       --allow-to-run-as-root option to work.
; Default Values: The user is set to master process running user by default.
;                 If the group is not set, the user's group is used.
user = nginx
group = nginx
....

Busca también las líneas listen.owner=www-data y listen.group=www-data en el archivo y cámbialas por nginx.

listen.owner = nginx
listen.group = nginx

Desplázate hacia abajo en el archivo para localizar la opción ;pm.status_path = /status. Descomenta la línea eliminando el punto y coma que hay delante de ella, como se muestra a continuación.

....
; Note: There is a real-time FPM status monitoring sample web page available
;       It's available in: /usr/share/php/8.2/fpm/status.html
;
; Note: The value must start with a leading slash (/). The value can be
;       anything, but it may not be a good idea to use the .php extension or it
;       may conflict with a real PHP file.
; Default Value: not set
pm.status_path = /status
....

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Reinicia el proceso PHP-fpm.

$ sudo systemctl restart php8.2-fpm

Añade la configuración PHP a Nginx

Abre el archivo de configuración por defecto de Nginx /etc/nginx/conf.d/default.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/default.conf

Introduce el siguiente código dentro del bloque del servidor, antes de la última llave de cierre.

# define PHP-FPM monitoring
location ~ ^/(status|ping)$ {
    allow 127.0.0.1;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock; # Depends on the PHP Version and OS Distro
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Verifica la configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicia el servidor Nginx.

$ sudo systemctl restart nginx

Reinicia el servicio Netdata.

$ sudo systemctl restart netdata

Vuelve a cargar el panel de Netdata y deberías ver las estadísticas de PHP-FPM.

Panel de estadísticas PHP-FPM de NetData

Paso 15 – Configurar el motor Docker y la monitorización de contenedores

Netdata puede monitorizar tanto el motor Docker como los contenedores Docker. También puede monitorizar las aplicaciones que se ejecutan dentro de estos contenedores, pero no lo trataremos en este tutorial.

Primero instalemos Docker.

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
$ sudo usermod -aG docker ${USER}
$ su - ${USER}

El servicio Docker está activado e iniciado. Puedes comprobar el estado del servicio.

$ sudo systemctl status docker

Para monitorizar el motor Docker, necesitas habilitar la función de métricas de Docker.

Crea y abre el archivo /etc/docker/daemon.json para editarlo.

$ sudo nano /etc/docker/daemon.json

Pega en él el siguiente código.

{
  "metrics-addr" : "127.0.0.1:9323",
  "experimental" : true
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite. Esta URL la utiliza Prometheus para hacer un seguimiento de las estadísticas del motor Docker.

Crea un archivo de configuración para el recopilador Docker.

$ sudo /etc/netdata/edit-config go.d/docker.conf

Crea otro archivo de configuración para el motor Docker para Prometheus.

$ sudo /etc/netdata/edit-config go.d/docker_engine.conf

Reinicia los servicios Netdata y Docker.

$ sudo systemctl restart docker netdata

Carga de nuevo el panel de Netdata y podrás ver las estadísticas de Docker.

Estadísticas del contenedor Docker de NetData

Verás otra entrada llamada Prometheus Metrics en tu tablero porque la opción de métricas se hizo para el tablero de Prometheus.

Estadísticas del contenedor Docker Prometheus de NetData

El siguiente paso es supervisar el contenedor Docker. Netdata utiliza grupos de control, denominados cgroups para supervisar los contenedores Docker. Los grupos de control son una función de Linux que limita y rastrea el uso de recursos de una colección de procesos, en este caso, contenedores. Si tienes contenedores Docker en ejecución cuando instalas Netdata, se rastrean automáticamente. Sin embargo, si ejecutas un contenedor después de instalar Netdata, tendrás que reiniciarlo.

Ejecuta un contenedor de prueba.

$ docker container run -d nginx

Comprueba el estado del contenedor.

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
9d6cde479224   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 5 seconds   80/tcp    zealous_knuth

El nombre del contenedor es zealous_knuth, como se muestra. Como el contenedor se ha iniciado después de instalar Netdata, reinicia el servicio.

$ sudo systemctl restart netdata

Carga el Panel de Control, y deberías poder ver las estadísticas del Contenedor. Puedes ver el ID del contenedor en las estadísticas.

Estadísticas de contenedores Docker de NetData

Conclusión

Con esto concluye nuestro tutorial sobre la instalación y el uso del sistema de monitorización Netdata para monitorizar varias aplicaciones como Nginx, MySQL, PHP-FPM y Docker en un servidor Debian 12. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...