Instalación de Node Exporter para Prometheus
Introducción
Prometheus se ha convertido en el estándar de facto para la recopilación de métricas y monitoreo en infraestructura moderna, particularmente en entornos nativos de la nube y Kubernetes. Node Exporter es un componente crucial del ecosistema Prometheus, diseñado para exponer métricas a nivel de hardware y sistema operativo desde servidores Linux en un formato que Prometheus puede recopilar y procesar.
Node Exporter transforma tus servidores Linux en endpoints observables al recopilar cientos de métricas del sistema, incluyendo uso de CPU, consumo de memoria, E/S de disco, estadísticas de red, uso del sistema de archivos y mucho más. A diferencia de las soluciones de monitoreo basadas en agentes, Node Exporter se ejecuta como un daemon ligero que simplemente expone métricas a través de HTTP, siguiendo la arquitectura basada en pull de Prometheus.
Esta guía completa te acompaña en el proceso completo de instalar, configurar y asegurar Node Exporter en sistemas Linux. Aprenderás cómo desplegar Node Exporter, configurar recolectores personalizados, integrar con Prometheus, asegurar el endpoint de métricas e implementar mejores prácticas para monitoreo en producción. Ya sea que estés construyendo una nueva infraestructura de monitoreo o migrando desde herramientas heredadas, Node Exporter proporciona la base para una observabilidad integral del sistema.
Requisitos Previos
Antes de instalar Node Exporter, asegúrate de tener:
- Un servidor Linux (Ubuntu 20.04/22.04, Debian 10/11, CentOS 7/8, Rocky Linux 8/9 o similar)
- Acceso root o sudo para instalación y configuración
- Comprensión básica de la arquitectura de Prometheus
- Acceso al firewall para permitir recopilación de métricas (puerto predeterminado 9100)
- Un servidor Prometheus para recopilar métricas (puede configurarse después)
Conocimiento Recomendado:
- Comprensión de la gestión de servicios systemd
- Conocimiento básico de HTTP y APIs REST
- Familiaridad con métricas y datos de series temporales
- Comprensión de conceptos de monitoreo
Requisitos del Sistema:
- RAM mínima: 50 MB
- CPU mínima: Sobrecarga muy baja
- Espacio en disco: ~20 MB para binario y datos
Entendiendo Node Exporter
¿Qué es Node Exporter?
Node Exporter es un exportador de Prometheus para métricas de hardware y sistema operativo expuestas por kernels *NIX. Recopila métricas de los sistemas de archivos /proc y /sys y las expone a través de un endpoint HTTP para que Prometheus las recopile.
Características Clave:
- Más de 100 recolectores diferentes para métricas del sistema
- Huella de recursos mínima
- Sin dependencias externas
- Recolectores configurables
- Recolector de archivos de texto para métricas personalizadas
- Soporte para múltiples arquitecturas
Métricas Expuestas
Node Exporter proporciona métricas para:
- CPU: Uso, tiempo inactivo, espera de E/S
- Memoria: Disponible, usada, en caché, en búfer
- Disco: Estadísticas de E/S, uso de espacio
- Red: Ancho de banda, errores, paquetes
- Sistema de archivos: Puntos de montaje, uso
- Carga: Promedios de carga del sistema
- Estadísticas de Red: Conexiones TCP/UDP
- Tiempo: Hora del sistema y sincronización NTP
- Hardware: Temperatura, estado RAID (con recolectores adicionales)
Instalando Node Exporter
Método 1: Instalación Binaria (Recomendado)
Este método instala el binario oficial precompilado del repositorio GitHub de Prometheus.
Paso 1: Descargar Node Exporter
# Crear usuario para Node Exporter
sudo useradd --no-create-home --shell /bin/false node_exporter
# Descargar última versión (verifica https://prometheus.io/download/ para la última)
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
# Extraer archivo
tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz
# Mover binario a /usr/local/bin
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
# Establecer propiedad
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
# Limpiar
rm -rf node_exporter-1.7.0.linux-amd64*
Paso 2: Verificar Instalación
# Verificar versión
/usr/local/bin/node_exporter --version
# Ejecutar prueba (Ctrl+C para detener)
/usr/local/bin/node_exporter
Método 2: Instalación con Gestor de Paquetes
En Ubuntu/Debian:
# Nota: Puede no ser la última versión
sudo apt update
sudo apt install prometheus-node-exporter -y
# Verificar estado
sudo systemctl status prometheus-node-exporter
En CentOS/Rocky Linux (Repositorio EPEL):
# Habilitar repositorio EPEL
sudo yum install epel-release -y
# Instalar Node Exporter
sudo yum install golang-github-prometheus-node-exporter -y
# Verificar estado
sudo systemctl status node_exporter
Método 3: Instalación con Docker
# Ejecutar Node Exporter como contenedor Docker
docker run -d \
--name node-exporter \
--net="host" \
--pid="host" \
-v "/:/host:ro,rslave" \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host
# Verificar que el contenedor esté en ejecución
docker ps | grep node-exporter
# Ver métricas
curl http://localhost:9100/metrics
Creando Servicio Systemd
Para instalación binaria, crea un servicio systemd para inicio automático y gestión.
Crear archivo de servicio:
sudo nano /etc/systemd/system/node_exporter.service
Configuración del servicio:
[Unit]
Description=Node Exporter
Documentation=https://prometheus.io/docs/guides/node-exporter/
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
Habilitar e iniciar servicio:
# Recargar daemon de systemd
sudo systemctl daemon-reload
# Habilitar Node Exporter para iniciar al arrancar
sudo systemctl enable node_exporter
# Iniciar Node Exporter
sudo systemctl start node_exporter
# Verificar estado
sudo systemctl status node_exporter
# Ver registros
sudo journalctl -u node_exporter -f
Configurando Node Exporter
Configuración Básica
Node Exporter se configura mediante banderas de línea de comandos. Modifica el archivo de servicio systemd para agregar opciones de configuración.
Editar archivo de servicio:
sudo nano /etc/systemd/system/node_exporter.service
Agregar banderas de configuración:
[Service]
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=:9100 \
--collector.filesystem.mount-points-exclude='^/(dev|proc|sys|var/lib/docker/.+|var/lib/kubelet/.+)($|/)' \
--collector.filesystem.fs-types-exclude='^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$'
Banderas de configuración comunes:
# Cambiar dirección y puerto de escucha
--web.listen-address=:9100
# Especificar qué recolectores habilitar
--collector.systemd
--collector.processes
# Deshabilitar recolectores específicos
--no-collector.hwmon
--no-collector.nfs
# Establecer directorio del recolector de archivos de texto
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector
# Establecer duración máxima de solicitud
--web.max-requests=40
# Habilitar TLS
--web.config.file=/etc/node_exporter/web-config.yml
Recargar y reiniciar:
sudo systemctl daemon-reload
sudo systemctl restart node_exporter
sudo systemctl status node_exporter
Habilitar Recolectores Específicos
Ver recolectores disponibles:
/usr/local/bin/node_exporter --help | grep collector
Habilitar recolector systemd (deshabilitado por defecto):
# Editar archivo de servicio
sudo nano /etc/systemd/system/node_exporter.service
# Agregar a ExecStart
--collector.systemd
# Recargar y reiniciar
sudo systemctl daemon-reload
sudo systemctl restart node_exporter
Habilitar recolector de procesos:
# Agregar a ExecStart
--collector.processes
sudo systemctl daemon-reload
sudo systemctl restart node_exporter
Recolector de Archivos de Texto para Métricas Personalizadas
El recolector de archivos de texto te permite exponer métricas personalizadas escribiéndolas en archivos.
Configurar recolector de archivos de texto:
# Crear directorio para recolector de archivos de texto
sudo mkdir -p /var/lib/node_exporter/textfile_collector
sudo chown node_exporter:node_exporter /var/lib/node_exporter/textfile_collector
# Habilitar en configuración del servicio
sudo nano /etc/systemd/system/node_exporter.service
Agregar a ExecStart:
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector
Crear script de métricas personalizadas:
#!/bin/bash
# /usr/local/bin/custom_metrics.sh
OUTPUT_FILE="/var/lib/node_exporter/textfile_collector/custom_metrics.prom"
{
# Métrica personalizada: cantidad de usuarios conectados
USER_COUNT=$(who | wc -l)
echo "# HELP logged_in_users Número de usuarios conectados"
echo "# TYPE logged_in_users gauge"
echo "logged_in_users $USER_COUNT"
# Métrica personalizada: intentos de inicio de sesión fallidos
FAILED_LOGINS=$(grep "Failed password" /var/log/auth.log 2>/dev/null | wc -l)
echo "# HELP failed_login_attempts Total de intentos de inicio de sesión fallidos"
echo "# TYPE failed_login_attempts counter"
echo "failed_login_attempts $FAILED_LOGINS"
# Métrica personalizada: procesos en ejecución
PROCESS_COUNT=$(ps aux | wc -l)
echo "# HELP total_processes Número total de procesos"
echo "# TYPE total_processes gauge"
echo "total_processes $PROCESS_COUNT"
} > "$OUTPUT_FILE.$$"
# Movimiento atómico para evitar lecturas parciales
mv "$OUTPUT_FILE.$$" "$OUTPUT_FILE"
Hacer ejecutable y programar:
sudo chmod +x /usr/local/bin/custom_metrics.sh
# Agregar a crontab
sudo crontab -e
# Ejecutar cada 5 minutos
*/5 * * * * /usr/local/bin/custom_metrics.sh
Reiniciar Node Exporter:
sudo systemctl daemon-reload
sudo systemctl restart node_exporter
Accediendo a Métricas
Ver Endpoint de Métricas
# Ver todas las métricas
curl http://localhost:9100/metrics
# Filtrar métricas específicas
curl http://localhost:9100/metrics | grep node_cpu
# Ver métricas del sistema de archivos
curl http://localhost:9100/metrics | grep node_filesystem
# Ver métricas de memoria
curl http://localhost:9100/metrics | grep node_memory
# Verificar métricas del recolector de archivos de texto
curl http://localhost:9100/metrics | grep custom_
Entendiendo el Formato de Métricas
Las métricas se exponen en formato de texto de Prometheus:
# HELP node_cpu_seconds_total Segundos que las CPUs pasaron en cada modo.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 123456.78
node_cpu_seconds_total{cpu="0",mode="system"} 1234.56
node_cpu_seconds_total{cpu="0",mode="user"} 2345.67
Componentes:
# HELP: Descripción de la métrica# TYPE: Tipo de métrica (counter, gauge, histogram, summary)- Nombre de métrica:
node_cpu_seconds_total - Etiquetas:
{cpu="0",mode="idle"} - Valor:
123456.78
Probando Recopilación de Métricas
# Script de prueba para verificar métricas
cat > /tmp/test_metrics.sh <<'EOF'
#!/bin/bash
echo "Probando Métricas de Node Exporter..."
echo ""
# Probar conexión
if curl -s http://localhost:9100/metrics > /dev/null; then
echo "✓ Node Exporter es accesible"
else
echo "✗ Node Exporter no es accesible"
exit 1
fi
# Contar métricas totales
METRIC_COUNT=$(curl -s http://localhost:9100/metrics | grep -c "^node_")
echo "✓ Total de métricas: $METRIC_COUNT"
# Verificar métricas de CPU
if curl -s http://localhost:9100/metrics | grep -q "node_cpu_seconds_total"; then
echo "✓ Métricas de CPU disponibles"
fi
# Verificar métricas de memoria
if curl -s http://localhost:9100/metrics | grep -q "node_memory_MemTotal_bytes"; then
echo "✓ Métricas de memoria disponibles"
fi
# Verificar métricas de disco
if curl -s http://localhost:9100/metrics | grep -q "node_disk_io_time_seconds_total"; then
echo "✓ Métricas de disco disponibles"
fi
# Verificar métricas del sistema de archivos
if curl -s http://localhost:9100/metrics | grep -q "node_filesystem_avail_bytes"; then
echo "✓ Métricas del sistema de archivos disponibles"
fi
# Verificar métricas de red
if curl -s http://localhost:9100/metrics | grep -q "node_network_receive_bytes_total"; then
echo "✓ Métricas de red disponibles"
fi
echo ""
echo "¡Node Exporter está funcionando correctamente!"
EOF
chmod +x /tmp/test_metrics.sh
/tmp/test_metrics.sh
Configurando Prometheus para Recopilar de Node Exporter
Agregar Configuración de Recopilación
Editar configuración de Prometheus:
sudo nano /etc/prometheus/prometheus.yml
Agregar trabajo de recopilación:
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
labels:
instance: 'server1'
environment: 'production'
Múltiples servidores:
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets:
- 'server1.example.com:9100'
- 'server2.example.com:9100'
- 'server3.example.com:9100'
labels:
environment: 'production'
Con descubrimiento de servicios (basado en archivos):
scrape_configs:
- job_name: 'node_exporter'
file_sd_configs:
- files:
- '/etc/prometheus/targets/node_exporter_*.yml'
refresh_interval: 5m
Crear archivo de objetivos:
sudo mkdir -p /etc/prometheus/targets
sudo nano /etc/prometheus/targets/node_exporter_prod.yml
- targets:
- 'server1.example.com:9100'
- 'server2.example.com:9100'
labels:
environment: 'production'
region: 'us-east'
- targets:
- 'server3.example.com:9100'
labels:
environment: 'production'
region: 'us-west'
Recargar Prometheus:
# Verificar configuración
promtool check config /etc/prometheus/prometheus.yml
# Recargar Prometheus
sudo systemctl reload prometheus
# O enviar SIGHUP
sudo killall -HUP prometheus
Asegurando Node Exporter
Configuración del Firewall
Usando UFW (Ubuntu/Debian):
# Permitir desde servidor Prometheus específico
sudo ufw allow from 192.168.1.100 to any port 9100
# Permitir desde subred
sudo ufw allow from 192.168.1.0/24 to any port 9100
# Verificar reglas
sudo ufw status
Usando firewalld (CentOS/Rocky Linux):
# Agregar regla enriquecida para IP específica
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="9100" protocol="tcp" accept'
# Agregar regla enriquecida para subred
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="9100" protocol="tcp" accept'
# Recargar firewall
sudo firewall-cmd --reload
# Listar reglas
sudo firewall-cmd --list-all
Usando iptables:
# Permitir desde IP específica
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 9100 -j ACCEPT
# Permitir desde subred
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 9100 -j ACCEPT
# Descartar todas las otras conexiones al puerto 9100
sudo iptables -A INPUT -p tcp --dport 9100 -j DROP
# Guardar reglas
sudo netfilter-persistent save
Configuración TLS/HTTPS
Crear certificados TLS:
# Crear directorio para certificados
sudo mkdir -p /etc/node_exporter
# Generar certificado auto-firmado (o usar Let's Encrypt)
sudo openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 \
-keyout /etc/node_exporter/node_exporter.key \
-out /etc/node_exporter/node_exporter.crt \
-subj "/CN=node-exporter"
# Establecer permisos
sudo chown -R node_exporter:node_exporter /etc/node_exporter
sudo chmod 400 /etc/node_exporter/node_exporter.key
Crear archivo de configuración web:
sudo nano /etc/node_exporter/web-config.yml
tls_server_config:
cert_file: /etc/node_exporter/node_exporter.crt
key_file: /etc/node_exporter/node_exporter.key
Actualizar servicio systemd:
sudo nano /etc/systemd/system/node_exporter.service
[Service]
ExecStart=/usr/local/bin/node_exporter \
--web.config.file=/etc/node_exporter/web-config.yml
sudo systemctl daemon-reload
sudo systemctl restart node_exporter
Probar endpoint HTTPS:
curl -k https://localhost:9100/metrics
Autenticación Básica
Crear archivo de contraseña:
# Instalar htpasswd
sudo apt install apache2-utils -y # Ubuntu/Debian
sudo yum install httpd-tools -y # CentOS/Rocky
# Generar hash de contraseña
htpasswd -nBC 12 "" | tr -d ':\n'
# Ingresa contraseña cuando se solicite
# Copia la salida del hash
Actualizar configuración web:
sudo nano /etc/node_exporter/web-config.yml
tls_server_config:
cert_file: /etc/node_exporter/node_exporter.crt
key_file: /etc/node_exporter/node_exporter.key
basic_auth_users:
prometheus: $2y$12$HASH_FROM_HTPASSWD_COMMAND
sudo systemctl restart node_exporter
Probar autenticación:
# Sin autenticación (debería fallar)
curl -k https://localhost:9100/metrics
# Con autenticación (debería tener éxito)
curl -k -u prometheus:password https://localhost:9100/metrics
Actualizar configuración de Prometheus:
scrape_configs:
- job_name: 'node_exporter'
scheme: https
tls_config:
insecure_skip_verify: true
basic_auth:
username: 'prometheus'
password: 'password'
static_configs:
- targets: ['localhost:9100']
Monitoreo y Alertas
Reglas de Alerta de Prometheus
Crear archivo de reglas de alerta:
sudo nano /etc/prometheus/rules/node_exporter_alerts.yml
groups:
- name: node_exporter_alerts
interval: 30s
rules:
# Alertas de CPU
- alert: HighCPUUsage
expr: (100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Alto uso de CPU en {{ $labels.instance }}"
description: "El uso de CPU está por encima del 80% (valor actual: {{ $value }}%)"
# Alertas de memoria
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Alto uso de memoria en {{ $labels.instance }}"
description: "El uso de memoria está por encima del 85% (valor actual: {{ $value }}%)"
# Alertas de espacio en disco
- alert: LowDiskSpace
expr: (node_filesystem_avail_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes{fstype!="tmpfs"}) * 100 < 15
for: 5m
labels:
severity: warning
annotations:
summary: "Poco espacio en disco en {{ $labels.instance }}:{{ $labels.mountpoint }}"
description: "El espacio en disco está por debajo del 15% (valor actual: {{ $value }}%)"
# Alerta de nodo caído
- alert: NodeDown
expr: up{job="node_exporter"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Node Exporter caído en {{ $labels.instance }}"
description: "Node Exporter ha estado caído durante más de 1 minuto"
# Promedio de carga alto
- alert: HighLoadAverage
expr: node_load15 / count without (cpu, mode) (node_cpu_seconds_total{mode="system"}) > 2
for: 5m
labels:
severity: warning
annotations:
summary: "Promedio de carga alto en {{ $labels.instance }}"
description: "El promedio de carga está por encima de 2.0 por CPU (valor actual: {{ $value }})"
Incluir reglas en Prometheus:
sudo nano /etc/prometheus/prometheus.yml
rule_files:
- "/etc/prometheus/rules/node_exporter_alerts.yml"
# Validar configuración
promtool check config /etc/prometheus/prometheus.yml
# Recargar Prometheus
sudo systemctl reload prometheus
Solución de Problemas
Problemas Comunes
Problema 1: Node Exporter no inicia
# Verificar estado del servicio
sudo systemctl status node_exporter
# Ver registros
sudo journalctl -u node_exporter -n 50
# Verificar si el binario existe
ls -l /usr/local/bin/node_exporter
# Verificar permisos
ls -l /usr/local/bin/node_exporter
# Debería ser propiedad del usuario node_exporter
# Probar inicio manual
sudo -u node_exporter /usr/local/bin/node_exporter
Problema 2: Endpoint de métricas no accesible
# Verificar si el servicio está escuchando
sudo ss -tlnp | grep 9100
# Probar conexión local
curl http://localhost:9100/metrics
# Verificar reglas del firewall
sudo iptables -L -n | grep 9100
sudo ufw status
# Verificar dirección de escucha
ps aux | grep node_exporter
Problema 3: Métricas faltantes
# Verificar recolectores habilitados
curl http://localhost:9100/metrics | grep "# HELP" | wc -l
# Verificar que el recolector específico esté habilitado
ps aux | grep node_exporter | grep collector
# Verificar errores en registros
sudo journalctl -u node_exporter | grep -i error
Problema 4: Prometheus no está recopilando
# Verificar objetivos de Prometheus
# Visitar: http://prometheus-server:9090/targets
# Verificar configuración de recopilación
cat /etc/prometheus/prometheus.yml | grep -A 5 node_exporter
# Verificar registros de Prometheus
sudo journalctl -u prometheus | grep node_exporter
# Probar conectividad desde servidor Prometheus
curl http://node-exporter-host:9100/metrics
Conclusión
Node Exporter es un componente esencial para monitorear servidores Linux con Prometheus, proporcionando métricas integrales del sistema con sobrecarga mínima. Siguiendo esta guía, has aprendido cómo instalar, configurar, asegurar e integrar Node Exporter en tu infraestructura de monitoreo.
Puntos clave:
- Monitoreo ligero - Node Exporter agrega sobrecarga mínima mientras proporciona métricas extensas
- Configuración flexible - Habilita solo los recolectores que necesitas para tu caso de uso
- Métricas personalizadas - Usa el recolector de archivos de texto para exponer métricas específicas de aplicaciones
- Seguridad - Implementa TLS, autenticación y reglas de firewall para proteger el endpoint de métricas
- Integración - Se integra perfectamente con Prometheus para alertas y visualización
Mejores prácticas para despliegue en producción:
- Usa systemd para gestión confiable del servicio
- Implementa reglas de firewall para restringir el acceso
- Habilita TLS y autenticación básica para seguridad
- Configura reglas de alerta apropiadas en Prometheus
- Usa el recolector de archivos de texto para métricas personalizadas de aplicaciones
- Monitorea el propio Node Exporter para asegurar la recopilación de métricas
- Documenta tu configuración de recolectores y métricas personalizadas
- Actualiza regularmente a la última versión estable
Node Exporter, combinado con Prometheus y Grafana, forma un potente stack de monitoreo que escala desde servidores únicos hasta grandes sistemas distribuidos. Las métricas recopiladas por Node Exporter proporcionan la base para comprender el rendimiento del sistema, planificación de capacidad y detección proactiva de problemas en entornos de infraestructura modernos.


