Introducción
Hola Fronters 👋
Llegamos al sexto y último artículo de nuestra serie sobre monitorización de recursos de hardware en Linux. Hemos cubierto CPU, RAM, red, disco y logs. Ahora toca el paso final: correlacionar todos esos datos, generar trazabilidad de eventos y configurar detección temprana de problemas.
Un buen sysadmin no reacciona cuando el servidor ya se cayó. Un buen sysadmin anticipa, mide y actúa antes de que el problema impacte a los usuarios. Eso es exactamente lo que vamos a construir aquí.
1. Correlacionando datos: la foto completa
Cada métrica aislada cuenta solo una parte de la historia. Cuando tu CPU está al 100%, puede ser por un pico legítimo de tráfico, un proceso en loop infinito, o un ataque DDoS. La diferencia la hace la correlación.
Qué cruzar con qué
# Alta CPU + mucha red = probablemente tráfico legítimo
# Alta CPU + poca red + muchos swaps = fuga de memoria/proceso zombi
# Alta red + baja CPU = ataque DDoS o bottleneck de CPU
# Errores en kern.log + latencia en disco = disco muriendo
# Fallos en auth.log + alta CPU = ataque de fuerza bruta (fail2ban trabajando)
Script de correlación simple
Este script bash cruza datos de CPU, RAM, disco y logs en un solo reporte:
#!/bin/bash
# reporte-correlacion.sh - Reporte de correlación de métricas
echo "=== REPORTE DE CORRELACIÓN $(date) ==="
echo ""
echo "--- TOP 5 PROCESOS POR CPU ---"
ps aux --sort=-%cpu | head -6
echo ""
echo "--- MEMORIA RAM ---"
free -h | grep -E "Mem|Swap"
echo ""
echo "--- ESPACIO EN DISCO ---"
df -h | grep -E "^/dev|tmpfs"
echo ""
echo "--- I/O EN DISCO (top 5) ---"
iotop -b -n 1 -o 2>/dev/null || iostat -x 1 1 | tail -10
echo ""
echo "--- ERRORES EN LOGS (última hora) ---"
journalctl --since "1 hour ago" -p err --no-pager | tail -20
echo ""
echo "--- INTENTOS SSH FALLIDOS (última hora) ---"
journalctl -u sshd --since "1 hour ago" --no-pager | grep "Failed password" | wc -l
2. Alertas básicas con scripts + cron
No necesitas herramientas complejas para empezar. Un script bash + cron pueden salvar tu servidor.
Script de alerta de recursos
#!/bin/bash
# alerta-recursos.sh
THRESHOLD_CPU=80
THRESHOLD_MEM=90
THRESHOLD_DISK=85
EMAIL="admin@example.com"
# CPU load (promedio 1 min)
CPU_LOAD=$(awk '{print $1 * 100}' /proc/loadavg | cut -d. -f1)
if [ "$CPU_LOAD" -gt "$THRESHOLD_CPU" ]; then
echo "⚠️ ALERTA: CPU al ${CPU_LOAD}%" | mail -s "ALERTA CPU" $EMAIL
fi
# Memoria RAM
MEM_USED=$(free | grep Mem | awk '{print ($3/$2) * 100.0}' | cut -d. -f1)
if [ "$MEM_USED" -gt "$THRESHOLD_MEM" ]; then
echo "⚠️ ALERTA: RAM al ${MEM_USED}%" | mail -s "ALERTA RAM" $EMAIL
fi
# Disco
DISK_USED=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$DISK_USED" -gt "$THRESHOLD_DISK" ]; then
echo "⚠️ ALERTA: Disco al ${DISK_USED}%" | mail -s "ALERTA DISCO" $EMAIL
fi
# Errores críticos en logs
ERRORS=$(journalctl -p err --since "5 min ago" --no-pager | wc -l)
if [ "$ERRORS" -gt 0 ]; then
journalctl -p err --since "5 min ago" --no-pager | mail -s "ERRORES CRÍTICOS" $EMAIL
fi
Programar con cron
# /etc/cron.d/monitoreo
# Ejecutar cada 5 minutos
*/5 * * * * root /usr/local/bin/alerta-recursos.sh
# Reporte horario de correlación
0 * * * * root /usr/local/bin/reporte-correlacion.sh > /var/log/reporte-horario.log
# Reporte diario con logwatch
0 6 * * * root /usr/sbin/logwatch --detail High --range today --mailto admin@example.com
# Rotar reportes diarios
0 7 * * * root find /var/log/reportes -name "*.log" -mtime +30 -delete
3. Introducción a herramientas de monitorización enterprise
Cuando tienes más de un servidor, los scripts manuales se quedan cortos. Aquí entra la monitorización centralizada.
Nagios / Icinga
El clásico de la monitorización. Usa plugins para checkear CPU, disco, servicios y hasta páginas web. Envía alertas por email/SMS.
- Arquitectura: servidor central + agentes NRPE en los clientes
- Ventaja: maduro, muchísimos plugins
- Desventaja: configuración manual, interfaz antigua
Zabbix
Monitorización moderna con agentes ligeros, auto-descubrimiento de hosts y dashboards visuales.
- Arquitectura: servidor Zabbix + agentes en cada host
- Ventaja: auto-descubrimiento, alertas configurables, gráficos integrados
- Desventaja: curva de aprendizaje media, consume recursos en el servidor
Prometheus + Grafana
El stack moderno por excelencia. Prometheus recolecta métricas vía exporters, Grafana las visualiza.
- Arquitectura: Prometheus server + exporters (node_exporter, blackbox_exporter) + Grafana
- Ventaja: flexible, escalable, dashboards hermosos, alert manager potente
- Desventaja: requiere conocimiento de PromQL
# Instalación rápida de node_exporter + Prometheus + Grafana
# 1. Node Exporter (en cada servidor)
wget https://github.com/prometheus/node_exporter/releases/latest/download/node_exporter-*.tar.gz
tar xzf node_exporter-*.tar.gz && sudo ./node_exporter/node_exporter &
# 2. Prometheus server
wget https://github.com/prometheus/prometheus/releases/latest/download/prometheus-*.tar.gz
tar xzf prometheus-*.tar.gz && cd prometheus-*
./prometheus --config.file=prometheus.yml &
# 3. Grafana (dashboard web)
sudo apt install -y grafana
sudo systemctl start grafana-server
4. Dashboard simple con Bash + HTML
Antes de saltar a herramientas complejas, puedes tener un dashboard funcional en 10 líneas:
#!/bin/bash
# dashboard.sh - Genera un dashboard HTML simple
OUTPUT="/var/www/html/dashboard.html"
cat > $OUTPUT << EOF
<!DOCTYPE html>
<html>
<head><title>Dashboard ITFrontech</title>
<meta http-equiv="refresh" content="60">
<style>
body { font-family: monospace; background: #0a0a0a; color: #00ff00; padding: 20px; }
.card { background: #1a1a2e; border: 1px solid #00ff00; padding: 15px; margin: 10px 0; }
.ok { color: #00ff00; } .warn { color: #ffff00; } .crit { color: #ff0000; }
</style></head>
<body>
<h1>📊 Dashboard - $(date)</h1>
<div class="card">
<pre>$(uptime)</pre>
<pre>$(free -h)</pre>
<pre>$(df -h | grep -E "^/dev")</pre>
<pre>$(ss -tlnp | head -10)</pre>
</div></body></html>
EOF
echo "Dashboard generado: $OUTPUT"
Programa con cron para que se actualice cada minuto:
* * * * * root /usr/local/bin/dashboard.sh
5. Trazabilidad: el registro de eventos como evidencia
La trazabilidad no es solo para debugging. Es para auditoría, cumplimiento normativo y análisis forense.
Buenas prácticas de trazabilidad
- Centraliza logs: Usa rsyslog para enviar logs de todos los servidores a un Logstash o servidor central
- Timestamp en UTC: Evita confusiones con zonas horarias
- Retención definida: 30-90 días según normativa
- Firma de logs: Usa
loggercon tags personalizados para identificar eventos - Logs de aplicaciones: Formato JSON estructurado para facilitar parsing
# Ejemplo: registrar eventos personalizados con logger
logger -t "MONITOREO" -p local0.info "CPU al 95% en servidor web-01"
logger -t "MONITOREO" -p local0.warning "Disco /dev/sda1 al 88% - programar limpieza"
# Búsqueda posterior
journalctl -t "MONITOREO" --since "7 days ago"
grep "MONITOREO" /var/log/syslog
6. Detección temprana de problemas
La clave de un buen monitoreo no es detectar fallos, es detectar tendencias antes de que se conviertan en fallos.
Patrones de alerta temprana
# Tendencias de CPU (promedio móvil simple)
# Si el uso de CPU sube 10% cada día durante 3 días seguidos → escalar
# Crecimiento de logs
# Si /var/log crece 500MB/día → ajustar logrotate
# Errores incrementales
# Si los errores en journalctl suben 20% semanal → investigar
# Fragmentación de disco
# Tiempo de I/O creciente (iostat -x) → planear migración de disco
# Conexiones simultáneas crecientes
# ss -s mostrando增长 semanal → evaluar escalabilidad
Script de detección de tendencias
#!/bin/bash
# tendencias.sh - Detecta tendencias anómalas
LOG_FILE="/var/log/tendencias.log"
CPU_NOW=$(awk '{print $1 * 100}' /proc/loadavg | cut -d. -f1)
# Comparar con el promedio de la última semana
if [ -f "$LOG_FILE" ]; then
AVG_WEEK=$(tail -1008 "$LOG_FILE" | awk '{sum+=$1} END{print sum/NR}')
THRESHOLD=$(echo "$AVG_WEEK * 1.5" | bc | cut -d. -f1)
if [ "$CPU_NOW" -gt "$THRESHOLD" ] 2>/dev/null; then
echo "🚨 TENENCIA ANÓMALA: CPU actual $CPU_NOW% vs promedio semanal ${AVG_WEEK}%"
fi
fi
echo "$(date +%s) $CPU_NOW" >> "$LOG_FILE"
Conclusión final de la serie
Hemos recorrido un camino completo: desde entender qué es la CPU y cómo medirla, pasando por memoria RAM, red, disco, logs, hasta llegar aquí: trazabilidad y detección temprana de problemas.
Lo más importante que debes llevarte:
- Monitorear no es opcional — es parte del trabajo de todo sysadmin
- Empieza simple — scripts bash + cron te llevan lejos
- Correlaciona — una métrica aislada no cuenta la historia completa
- Sé proactivo — detecta tendencias antes de que sean crisis
- Escala cuando crezcas — Prometheus + Grafana cuando tengas más de 5 servidores
La monitorización no es un proyecto, es una cultura. Implementa estos principios, ajústalos a tu realidad y verás cómo tus servidores te lo agradecen. 🚀
¡Nos vemos en el próximo artículo, Fronters! 💪