¿Por qué Prometheus y Grafana para la monitorización de servidores?
Prometheus y Grafana forman un potente stack de código abierto para la monitorización de servidores y aplicaciones. Prometheus destaca en la recopilación y almacenamiento de datos de series temporales, ofreciendo un lenguaje de consulta flexible (PromQL) para análisis y alertas. Grafana, por otro lado, proporciona paneles de control ricos y personalizables para visualizar estos datos, haciendo que las métricas complejas sean fácilmente digeribles. Juntos, ofrecen una solución integral para el seguimiento de la salud del servidor, la utilización de recursos y las métricas específicas de la aplicación, esenciales para mantener servicios estables y de alto rendimiento como servidores de juegos, alojamiento web, bases de datos o pipelines de CI/CD.
Requisitos previos
Antes de empezar, asegúrate de tener lo siguiente:
- Dos servidores: Un servidor dedicado o un VPS robusto para el stack de Prometheus/Grafana (el 'servidor de monitorización'), y al menos un servidor a monitorizar (el 'servidor monitorizado').
- Sistema operativo: Ubuntu 22.04 LTS o una distribución similar basada en Debian en ambos servidores.
- Acceso SSH: Acceso root o un usuario con privilegios
sudoen ambos servidores. - Cortafuegos: UFW habilitado y configurado para permitir el tráfico SSH (puerto 22), Prometheus (puerto 9090), Grafana (puerto 3000) y Node Exporter (puerto 9100).
Requisitos mínimos del servidor para el stack de monitorización (servidor de monitorización)
Para el servidor que aloja Prometheus y Grafana, considera estas especificaciones básicas:
- vCPU: 2 núcleos
- RAM: 4GB
- Disco: 50GB NVMe (para rendimiento y almacenamiento de datos)
- Ancho de banda: 1TB/mes
Estas especificaciones son adecuadas para monitorizar hasta 10-15 endpoints con volúmenes de métricas típicos. Despliegues más grandes requerirán más recursos.
Instalación y configuración paso a paso
Paso 1: Actualizar el sistema e instalar dependencias (servidor de monitorización)
Comienza actualizando la lista de paquetes de tu servidor de monitorización e instalando las utilidades necesarias.
sudo apt update
sudo apt upgrade -y
sudo apt install -y wget curl gnupg2 software-properties-common apt-transport-https
Paso 2: Instalar el servidor Prometheus (servidor de monitorización)
Prometheus no suele venir en los repositorios estándar, por lo que descargaremos su binario directamente.
Descargar y extraer Prometheus
PROMETHEUS_VERSION="2.48.0" # Comprueba la última versión estable en prometheus.io
wget https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz
tar xvfz prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz
sudo mv prometheus-${PROMETHEUS_VERSION}.linux-amd64 /usr/local/prometheus
Crear usuario y directorios de Prometheus
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus
Configurar Prometheus
Crea un archivo de configuración básico de Prometheus en /etc/prometheus/prometheus.yml:
sudo nano /etc/prometheus/prometheus.yml
Añade el siguiente contenido:
global:
scrape_interval: 15s # Con qué frecuencia se recopilan los objetivos.
evaluation_interval: 15s # Con qué frecuencia se evalúan las reglas.
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090'] # Prometheus se recopila a sí mismo
Establecer permisos y crear servicio Systemd
sudo chown -R prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /usr/local/prometheus/prometheus
sudo chown prometheus:prometheus /usr/local/prometheus/promtool
sudo cp /usr/local/prometheus/consoles /usr/local/prometheus/console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
sudo nano /etc/systemd/system/prometheus.service
Añade la configuración del servicio:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/prometheus/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 \
--web.external-url=http://<YOUR_MONITORING_SERVER_IP>:9090
[Install]
WantedBy=multi-user.target
Reemplaza <YOUR_MONITORING_SERVER_IP> con la dirección IP pública o el nombre de dominio de tu servidor.
Iniciar Prometheus y habilitar el cortafuegos
sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo ufw allow 9090/tcp
Verifica que Prometheus está funcionando navegando a http://<YOUR_MONITORING_SERVER_IP>:9090 en tu navegador web. Deberías ver la interfaz de usuario de Prometheus.
Paso 3: Instalar Node Exporter (servidor monitorizado)
Node Exporter se ejecuta en cada servidor que deseas monitorizar, exponiendo métricas del sistema para que Prometheus las recopile.
Descargar y extraer Node Exporter
En tu servidor *monitorizado*:
NODE_EXPORTER_VERSION="1.7.0" # Comprueba la última versión estable
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz
tar xvfz node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz
sudo mv node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64 /usr/local/node_exporter
Crear usuario y servicio de Node Exporter
sudo useradd --no-create-home --shell /bin/false node_exporter
sudo chown -R node_exporter:node_exporter /usr/local/node_exporter
sudo nano /etc/systemd/system/node_exporter.service
Añade la configuración del servicio:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
Iniciar Node Exporter y habilitar el cortafuegos
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
sudo ufw allow 9100/tcp
Verifica que Node Exporter está funcionando visitando http://<YOUR_MONITORED_SERVER_IP>:9100/metrics en tu navegador. Deberías ver una página llena de métricas.
Añadir Node Exporter a la configuración de Prometheus (servidor de monitorización)
De vuelta en tu servidor *de monitorización*, edita /etc/prometheus/prometheus.yml para añadir el nuevo objetivo:
sudo nano /etc/prometheus/prometheus.yml
Añade una nueva entrada scrape_configs:
...
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['<YOUR_MONITORED_SERVER_IP>:9100'] # Reemplazar con la IP real
labels:
instance: 'my_first_server'
Recarga Prometheus para aplicar los cambios:
sudo systemctl reload prometheus
Comprueba la interfaz de usuario de Prometheus (http://<YOUR_MONITORING_SERVER_IP>:9090/targets) para asegurarte de que Node Exporter aparece y está saludable.
Paso 4: Instalar Grafana (servidor de monitorización)
Grafana proporciona la capa de visualización para tus datos de Prometheus.
Añadir clave GPG y repositorio de Grafana
sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
Instalar Grafana
sudo apt install -y grafana
Iniciar Grafana y habilitar el cortafuegos
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo ufw allow 3000/tcp
Accede a Grafana en http://<YOUR_MONITORING_SERVER_IP>:3000. El inicio de sesión predeterminado es admin / admin. Se te pedirá que cambies la contraseña.
Añadir Prometheus como fuente de datos en Grafana
- Inicia sesión en Grafana.
- Haz clic en el icono de engranaje (Configuración) en la barra lateral izquierda, luego en Fuentes de datos.
- Haz clic en Añadir fuente de datos y selecciona Prometheus.
- Establece el Nombre (por ejemplo,
Prometheus). - Para la URL, introduce
http://localhost:9090(ya que Grafana está en el mismo servidor). - Haz clic en Guardar y probar. Deberías ver un mensaje de "La fuente de datos está funcionando".
Paso 5: Importar paneles y crear alertas (servidor de monitorización)
Importar un panel de Node Exporter
Grafana Labs proporciona muchos paneles contribuidos por la comunidad. Uno popular para Node Exporter es el ID 1860.
- En la barra lateral izquierda, haz clic en el icono de más (Crear), luego en Importar.
- Introduce
1860en el campo "Importar vía grafana.com" y haz clic en Cargar. - Selecciona tu fuente de datos de Prometheus y haz clic en Importar.
Ahora deberías ver un panel completo que visualiza las métricas de tu servidor monitorizado.
Alertas básicas con Prometheus y Grafana
Prometheus gestiona las reglas de alerta, mientras que Grafana puede visualizar y enviar notificaciones para estas alertas.
- Reglas de alerta de Prometheus: Crea un archivo como
/etc/prometheus/alert.rules.ymlcon reglas (por ejemplo, alto uso de CPU, poco espacio en disco). - Configuración de Prometheus: Actualiza
prometheus.ymlpara incluirrule_files: ['/etc/prometheus/alert.rules.yml']. - Alertmanager: Para un enrutamiento avanzado de notificaciones (correo electrónico, Slack, PagerDuty), instala y configura Prometheus Alertmanager.
- Alertas de Grafana: También puedes configurar alertas directamente dentro de los paneles de Grafana, que pueden activar notificaciones basadas en los resultados de las consultas.
Escalando tu configuración de monitorización
Los recursos necesarios para tu stack de monitorización de Prometheus y Grafana dependen en gran medida del número de endpoints monitorizados, la frecuencia de recopilación de datos y el período de retención de tus métricas. Es crucial seleccionar el hardware de servidor adecuado para garantizar que tu sistema de monitorización siga siendo fiable y de alto rendimiento a medida que tu infraestructura crece.
| Número de Endpoints Monitorizados (Node Exporters) | vCPU/Núcleos | RAM | Disco (Tipo + GB) | Ancho de banda mensual |
|---|---|---|---|---|
| Hasta 10 | 2 vCPU | 4 GB | 50 GB NVMe | 1 TB |
| 10 - 50 | 4 vCPU | 8 GB | 100 GB NVMe | 2 TB |
| 50 - 150 | 6-8 Núcleos | 16-32 GB | 200 GB NVMe | 5 TB |
| 150+ (Alta densidad) | 8+ Núcleos | 32+ GB | 500+ GB NVMe (RAID 1) | 10+ TB |
Resolución de problemas comunes
- Interfaz de usuario de Prometheus no accesible (9090): Comprueba el cortafuegos (
sudo ufw status) y el estado del servicio Prometheus (sudo systemctl status prometheus). Asegúrate de que--web.external-urlesté configurado correctamente en el archivo de servicio. - Node Exporter no accesible (9100): Verifica el cortafuegos en el servidor monitorizado y el estado del servicio Node Exporter.
- Objetivos caídos en Prometheus: Comprueba la conectividad de red entre los servidores de monitorización y monitorizados. Asegúrate de que Node Exporter se está ejecutando en el objetivo y de que su IP/puerto son correctos en
prometheus.yml. - Error de fuente de datos de Grafana: Confirma que Prometheus se está ejecutando en el puerto 9090. Comprueba los registros del servidor Grafana (
sudo journalctl -u grafana-server -f) en busca de errores. - Métricas faltantes en Grafana: Asegúrate de que la fuente de datos de Prometheus correcta esté seleccionada en tu panel. Verifica que Prometheus realmente está recopilando el objetivo (consulta la interfaz de usuario de Prometheus -> Estado -> Objetivos).
- Espacio en disco bajo: Prometheus almacena datos de métricas. Configura políticas de retención en
prometheus.yml(por ejemplo,--storage.tsdb.retention.time=30d) o considera soluciones de almacenamiento remoto para la retención a largo plazo.