Monitorización avanzada de WordPress con Prometheus y Grafana
La monitorización avanzada de WordPress ya no es un lujo, sino una necesidad para cualquier sitio web que aspire a ofrecer un rendimiento constante, alta disponibilidad y una experiencia de usuario impecable. Las herramientas tradicionales, como los plugins de caché o los paneles de control básicos, se quedan cortas cuando necesitamos identificar cuellos de botella, predecir fallos o escalar infraestructuras complejas. Aquí es donde entra en juego la pareja imbatible de Prometheus y Grafana.
Prometheus es un sistema de monitorización y alerta de código abierto, diseñado para recopilar series temporales de métricas de forma eficiente y fiable. Grafana, por su parte, es la plataforma de visualización y análisis que transforma esos datos en paneles interactivos y dashboards personalizados. Juntos, te permiten pasar de preguntarte “¿qué pasó?” a responder “¿por qué pasó?” en cuestión de segundos.
En este artículo, te guiaré paso a paso a través de la implementación de un stack completo de monitorización para WordPress. Cubriremos desde la instalación del exporter de Prometheus hasta la configuración de alertas proactivas en Grafana. Todo ello con un enfoque práctico, profesional y orientado a SysAdmins.
¿Por qué Prometheus y Grafana para WordPress?
La mayoría de las soluciones de monitorización para WordPress se basan en plugins PHP que consumen recursos del propio servidor web. Esto puede crear un conflicto de intereses: para monitorizar el rendimiento, estás añadiendo carga extra al sistema. Prometheus, en cambio, funciona de forma externa. Recopila métricas mediante un exporter que expone los datos en un endpoint HTTP, sin interferir en el funcionamiento del sitio.
Además, la arquitectura de Prometheus permite:
- Almacenamiento eficiente: Las series temporales ocupan mucho menos espacio que las bases de datos relacionales.
- Alta granularidad: Puedes capturar métricas cada 15 segundos sin degradar el rendimiento.
- Alertas inteligentes: Basadas en umbrales, promedios móviles o patrones de comportamiento.
- Escalabilidad horizontal: Puedes monitorizar cientos de sitios WordPress desde un solo servidor Prometheus.
Grafana, por su parte, ofrece una flexibilidad visual inigualable. Puedes crear dashboards con gráficos de líneas, heatmaps, tablas de estado, logs y mucho más. Todo en tiempo real y con la posibilidad de compartir paneles con tu equipo.
Componentes del Stack de Monitorización
Antes de empezar, necesitas tener claros los componentes que vamos a instalar y configurar:
- Servidor Prometheus: El cerebro del sistema, que recopila y almacena las métricas.
- WordPress Exporter: Un script o binario que expone métricas específicas de WordPress (caché, consultas a la base de datos, memoria PHP, etc.).
- Node Exporter: Para métricas del sistema operativo (CPU, RAM, disco, red).
- MySQL Exporter: Para métricas de la base de datos (consultas lentas, conexiones activas, tamaño de tablas).
- Grafana: El panel de control que consume datos de Prometheus y los visualiza.
- Alertmanager: El componente encargado de gestionar las alertas y enviarlas a canales como Slack, Telegram o correo electrónico.
Instalación y Configuración de Prometheus
Vamos a asumir que trabajas sobre un servidor Linux (Ubuntu 22.04 o similar). Lo primero es instalar Prometheus.
Paso 1: Descargar e instalar Prometheus
# Crear usuario y directorio
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
# Descargar la última versión estable
wget https://github.com/prometheus/prometheus/releases/download/v2.52.0/prometheus-2.52.0.linux-amd64.tar.gz
tar xvf prometheus-2.52.0.linux-amd64.tar.gz
sudo cp prometheus-2.52.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.52.0.linux-amd64/promtool /usr/local/bin/
sudo cp -r prometheus-2.52.0.linux-amd64/consoles /etc/prometheus
sudo cp -r prometheus-2.52.0.linux-amd64/console_libraries /etc/prometheus
# Limpiar
rm -rf prometheus-2.52.0.linux-amd64*
Paso 2: Configurar Prometheus
Crea el archivo /etc/prometheus/prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'wordpress'
static_configs:
- targets: ['localhost:9234'] # Puerto del WordPress Exporter
- job_name: 'node'
static_configs:
- targets: ['localhost:9100'] # Puerto del Node Exporter
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104'] # Puerto del MySQL Exporter
Paso 3: Crear servicio systemd
sudo nano /etc/systemd/system/prometheus.service
Contenido:
[Unit]
Description=Prometheus
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
Habilita e inicia el servicio:
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
Instalación del WordPress Exporter
El WordPress Exporter es un script PHP que expone métricas específicas de WordPress. Existen varias implementaciones, pero la más popular es la de Prometheus WordPress Exporter (por ejemplo, el proyecto de prometheus-wordpress-exporter en GitHub).
Opción A: Usar un exporter PHP ligero
Descarga el script en tu servidor web:
cd /var/www/html/wp-content/plugins/
git clone https://github.com/prometheus-wordpress-exporter/prometheus-wordpress-exporter.git
Luego, en el archivo wp-config.php o en un plugin personalizado, añade las métricas que quieras exponer. Un ejemplo básico:
add_action('rest_api_init', function () {
register_rest_route('prometheus/v1', '/metrics', array(
'methods' => 'GET',
'callback' => 'prometheus_wordpress_metrics',
'permission_callback' => '__return_true',
));
});
function prometheus_wordpress_metrics() {
header('Content-Type: text/plain; charset=utf-8');
$metrics = "# HELP wp_http_requests_total Total HTTP requests\n";
$metrics .= "# TYPE wp_http_requests_total counter\n";
$metrics .= "wp_http_requests_total " . get_transient('wp_http_requests_total') . "\n";
// Añade más métricas aquí (caché, consultas DB, etc.)
echo $metrics;
}
Opción B: Usar un exporter en Go (recomendado para producción)
El exporter en Go es más eficiente y no depende de PHP. Puedes descargar el binario precompilado:
wget https://github.com/prometheus-wordpress-exporter/prometheus-wordpress-exporter/releases/latest/download/prometheus-wordpress-exporter-linux-amd64
chmod +x prometheus-wordpress-exporter-linux-amd64
sudo mv prometheus-wordpress-exporter-linux-amd64 /usr/local/bin/wp-exporter
Crea el servicio:
sudo nano /etc/systemd/system/wp-exporter.service
Contenido:
[Unit]
Description=Prometheus WordPress Exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/wp-exporter --web.listen-address=:9234 --wordpress.url=http://localhost/wp-json/prometheus/v1/metrics
Restart=always
[Install]
WantedBy=multi-user.target
Habilita e inicia:
sudo systemctl daemon-reload
sudo systemctl enable wp-exporter
sudo systemctl start wp-exporter
Instalación de Node Exporter y MySQL Exporter
Node Exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvf node_exporter-1.7.0.linux-amd64.tar.gz
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /bin/false node_exporter
sudo nano /etc/systemd/system/node_exporter.service
Contenido del servicio:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.listen-address=:9100
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
MySQL Exporter
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
tar xvf mysqld_exporter-0.15.1.linux-amd64.tar.gz
sudo cp mysqld_exporter-0.15.1.linux-amd64/mysqld_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /bin/false mysqld_exporter
sudo nano /etc/systemd/system/mysqld_exporter.service
Contenido:
[Unit]
Description=MySQL Exporter
After=network.target
[Service]
User=mysqld_exporter
Group=mysqld_exporter
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --web.listen-address=:9104 --config.my-cnf=/etc/mysql/exporter.cnf
[Install]
WantedBy=multi-user.target
Crea el archivo de configuración /etc/mysql/exporter.cnf:
[client]
user=exporter
password=tu_contraseña_segura
host=localhost
No olvides crear el usuario en MySQL:
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'tu_contraseña_segura';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
Configuración de Grafana
Instala Grafana siguiendo la documentación oficial:
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install grafana
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
Accede a http://tu-servidor:3000 con usuario admin y contraseña admin.
Añadir fuente de datos Prometheus
- Ve a Configuration > Data Sources > Add data source.
- Selecciona Prometheus.
- En URL, escribe
http://localhost:9090. - Haz clic en Save & Test.
Importar un dashboard para WordPress
Grafana dispone de dashboards predefinidos. Busca en la comunidad uno específico para WordPress (por ejemplo, el dashboard ID 14007 para WordPress Exporter).
- Ve a Dashboards > Import.
- Introduce el ID
14007y haz clic en Load. - Selecciona la fuente de datos Prometheus.
- Haz clic en Import.
Métricas Clave para Monitorizar WordPress
Una vez que todo está en marcha, es hora de definir las métricas más importantes para la monitorización WordPress.
Métricas del Sistema (Node Exporter)
- CPU Usage:
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) - Memory Usage:
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 - Disk I/O:
rate(node_disk_io_time_seconds_total[5m])
Métricas de la Base de Datos (MySQL Exporter)
- Consultas lentas:
rate(mysql_global_status_slow_queries[5m]) - Conexiones activas:
mysql_global_status_threads_connected - Tamaño total de la base de datos:
sum(mysql_info_schema_table_size)
Métricas de WordPress (WordPress Exporter)
- Peticiones HTTP:
rate(wp_http_requests_total[5m]) - Caché:
wp_cache_hit_ratio(porcentaje de aciertos de caché) - Tiempo de carga:
wp_page_load_time_seconds - Consultas a la base de datos por página:
wp_db_queries_per_page
[INFO] Recuerda que no todas las métricas están disponibles por defecto. Debes exponerlas desde tu WordPress Exporter. Puedes añadir métricas personalizadas como el número de plugins activos, la versión de PHP o el estado de la caché de Redis.
Alertas Proactivas con Alertmanager
La monitorización sin alertas es solo un bonito panel de control. Para que sea realmente útil, necesitas configurar alertas WordPress que te avisen cuando algo va mal.
Configurar Alertmanager
Instala Alertmanager:
wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
tar xvf alertmanager-0.27.0.linux-amd64.tar.gz
sudo cp alertmanager-0.27.0.linux-amd64/alertmanager /usr/local/bin/
sudo cp alertmanager-0.27.0.linux-amd64/amtool /usr/local/bin/
sudo mkdir /etc/alertmanager
sudo nano /etc/alertmanager/alertmanager.yml
Contenido básico:
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'slack'
receivers:
- name: 'slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/TU/WEBHOOK'
channel: '#alerts'
title: '{{ .GroupLabels.alertname }}'
text: '{{ .CommonAnnotations.description }}'
Crea el servicio systemd y actívalo.
Definir reglas de alerta en Prometheus
Añade al archivo prometheus.yml la sección rule_files:
rule_files:
- "alerts.yml"
Crea el archivo /etc/prometheus/alerts.yml:
groups:
- name: wordpress_alerts
rules:
- alert: WordPressDown
expr: up{job="wordpress"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "WordPress no responde"
description: "El exporter de WordPress lleva más de 1 minuto caído."
- alert: HighLoadAverage
expr: node_load1 > 4
for: 5m
labels:
severity: warning
annotations:
summary: "Carga alta del servidor"
description: "El load average es {{ $value }} durante más de 5 minutos."
- alert: SlowQueries
expr: rate(mysql_global_status_slow_queries[5m]) > 0.5
for: 2m
labels:
severity: warning
annotations:
summary: "Consultas lentas en MySQL"
