Monitorización y logging avanzado en PrestaShop con herramientas open source
Cuando tu tienda PrestaShop empieza a escalar, los logs por defecto y el monitor básico de rendimiento se quedan cortos. Un error silencioso en un módulo de pago, una consulta SQL que se vuelve loca o un pico de tráfico inesperado pueden tirar la tienda sin que te des cuenta hasta que los clientes se quejan. Aquí es donde entra la monitorización PrestaShop y el logging PrestaShop avanzado.
Este artículo es una guía práctica para implementar un stack de monitorización y logging con herramientas open source. Dejaremos atrás los plugins de pago y montaremos una arquitectura profesional usando ELK Stack PrestaShop para logs y Prometheus PrestaShop para métricas en tiempo real.
¿Por qué necesitas monitorización y logging avanzado en PrestaShop?
PrestaShop, por sí mismo, ofrece un módulo de estadísticas básico y logs de errores en /var/logs/. Pero esto es insuficiente para un entorno de producción serio. Los problemas comunes que resuelve un stack avanzado son:
- Errores 500 silenciosos: Un hook mal implementado en un módulo custom puede generar un error fatal que no se refleja en el frontend, pero que rompe el carrito.
- Cuellos de botella en base de datos: Consultas lentas que degradan la experiencia de usuario sin que el panel de admin lo muestre.
- Ataques de fuerza bruta: Intentos de login masivos que saturan el servidor web.
- Problemas de caché: Invalidaciones incorrectas que provocan contenido servido desde caché cuando no debería.
Con un stack open source, centralizas toda la información y puedes reaccionar antes de que el cliente note algo.
Arquitectura del stack: dos pilares fundamentales
Vamos a dividir la solución en dos capas que se complementan:
- Logging centralizado con ELK Stack (Elasticsearch, Logstash, Kibana): Ideal para almacenar, buscar y visualizar logs de aplicación, servidor web y base de datos.
- Métricas en tiempo real con Prometheus + Grafana: Perfecto para monitorizar consumo de CPU, RAM, número de peticiones, latencia y métricas de negocio.
Ambos stacks son open source, escalables y tienen una comunidad enorme. Lo mejor: se integran sin tocar el core de PrestaShop.
Implementación de logging avanzado con ELK Stack PrestaShop
ELK Stack es el estándar de facto para logging centralizado. Aquí te explico cómo adaptarlo a PrestaShop.
1. Preparación del servidor y envío de logs
Primero, necesitas un agente ligero que envíe logs desde tu servidor PrestaShop al stack ELK. La mejor opción es Filebeat.
Instalación de Filebeat (Debian/Ubuntu):
sudo apt update
sudo apt install filebeat
Configura Filebeat para leer los logs de PrestaShop y del servidor web. Edita /etc/filebeat/filebeat.yml:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
- /var/www/prestashop/var/logs/*.log
fields:
app: prestashop
environment: production
output.logstash:
hosts: ["logstash-server:5044"]
[TIP] No envíes logs directamente a Elasticsearch desde Filebeat. Usa Logstash como intermediario para parsear y enriquecer los datos.
2. Parseo de logs de PrestaShop con Logstash
Los logs de PrestaShop tienen un formato específico. Necesitas un filtro Grok en Logstash para extraer la información relevante: nivel de error, mensaje, fecha, archivo y línea.
Ejemplo de configuración en Logstash (/etc/logstash/conf.d/prestashop.conf):
input {
beats {
port => 5044
}
}
filter {
if [app] == "prestashop" {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{LOGLEVEL:level} \[%{DATA:channel}\] %{GREEDYDATA:message}" }
}
date {
match => ["timestamp", "ISO8601"]
}
mutate {
remove_field => ["timestamp"]
}
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "prestashop-logs-%{+YYYY.MM.dd}"
}
}
[WARNING] Si tu versión de PrestaShop es anterior a la 1.7, el formato de logs puede variar. Revisa el archivo var/logs/prod.log y ajusta el patrón Grok en consecuencia.
3. Visualización en Kibana
Una vez que los datos están en Elasticsearch, crea un índice en Kibana (prestashop-logs-*). Luego, construye dashboards para:
- Errores por módulo: Identifica qué módulo genera más errores.
- Tendencia de errores 500: Ve si hay picos en ciertas horas.
- Logs de pago: Filtra por el canal
paymentpara ver transacciones fallidas.
Monitorización de métricas con Prometheus PrestaShop
Prometheus es ideal para recolectar métricas numéricas en intervalos regulares. Para PrestaShop, necesitas exponer métricas desde la aplicación o desde el servidor.
1. Exponer métricas del servidor
Usa Node Exporter para métricas del sistema (CPU, RAM, disco, red) y MySQL Exporter para métricas de la base de datos.
Instalación de Prometheus y exportadores (docker-compose):
version: '3'
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
node_exporter:
image: prom/node-exporter
ports:
- "9100:9100"
mysql_exporter:
image: prom/mysqld-exporter
environment:
- DATA_SOURCE_NAME=user:password@(host:3306)/prestashop
ports:
- "9104:9104"
Configura prometheus.yml para que recolecte de estos exportadores:
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['node_exporter:9100']
- job_name: 'mysql'
static_configs:
- targets: ['mysql_exporter:9104']
2. Crear un exportador de métricas de negocio (opcional)
Para métricas como "número de pedidos por minuto" o "productos en carrito abandonado", necesitas un exportador custom. Puedes hacer un script PHP que consulte la base de datos de PrestaShop y exponga las métricas en formato Prometheus.
Ejemplo mínimo (metrics.php):
<?php
require_once 'config/config.inc.php';
require_once 'config/defines.inc.php';
$db = Db::getInstance();
$orders = $db->getValue('SELECT COUNT(*) FROM ps_orders WHERE date_add > DATE_SUB(NOW(), INTERVAL 1 HOUR)');
$carts = $db->getValue('SELECT COUNT(*) FROM ps_cart WHERE date_add > DATE_SUB(NOW(), INTERVAL 1 HOUR) AND id_cart NOT IN (SELECT id_cart FROM ps_orders)');
header('Content-Type: text/plain');
echo "# HELP prestashop_orders_last_hour Number of orders in the last hour\n";
echo "# TYPE prestashop_orders_last_hour gauge\n";
echo "prestashop_orders_last_hour $orders\n";
echo "# HELP prestashop_abandoned_carts_last_hour Number of abandoned carts in the last hour\n";
echo "# TYPE prestashop_abandoned_carts_last_hour gauge\n";
echo "prestashop_abandoned_carts_last_hour $carts\n";
Luego, añade este endpoint a Prometheus como un target más.
3. Alertas con Alertmanager
Prometheus no solo recolecta, también alerta. Configura reglas para:
- CPU > 80% durante 5 minutos.
- Tasa de errores 5xx > 1% en los últimos 10 minutos.
- Número de pedidos en la última hora = 0 (posible caída del módulo de pago).
Ejemplo de regla (alerts.yml):
groups:
- name: prestashop_alerts
rules:
- alert: HighErrorRate
expr: rate(nginx_http_requests_total{status=~"5.."}[5m]) > 0.01
for: 10m
labels:
severity: critical
annotations:
summary: "High error rate on PrestaShop"
[INFO] Combina Prometheus con Grafana para dashboards visuales. Grafana se conecta a Prometheus como fuente de datos y permite crear paneles mucho más flexibles que Kibana para métricas.
Integración de logs y métricas: correlación avanzada
El verdadero poder está en cruzar datos. Por ejemplo, cuando Prometheus detecta un pico de latencia, puedes ir a Kibana y buscar logs de esa misma ventana de tiempo para ver qué estaba pasando.
Para facilitar esto, añade un campo trace_id en ambos sistemas. Puedes generarlo en PrestaShop usando un middleware en el hook actionFrontControllerSetMedia o en el kernel de Symfony si usas PrestaShop 8.
Ejemplo de correlación:
- Prometheus alerta:
HighResponseTimeen la ruta/module/payment/process. - En Grafana, haces clic en el panel y te lleva a Kibana con un filtro predefinido:
@timestamp > now-10m AND route: "/module/payment/process". - Kibana muestra el error
SQLSTATE[HY000] [2002] Connection refuseden el log de la base de datos.
Buenas prácticas y mantenimiento
Implementar el stack es solo el principio. Para que sea sostenible:
Rotación de logs y retención de datos
- Elasticsearch: Configura ILM (Index Lifecycle Management) para borrar índices antiguos automáticamente. Por ejemplo, mantener logs de 30 días y métricas de 90 días.
- Prometheus: Usa
--storage.tsdb.retention.time=30dpara limitar el espacio.
Seguridad
- No expongas Kibana o Grafana directamente a internet. Usa un proxy inverso con autenticación (Nginx + htpasswd) o una VPN.
- Protege el endpoint de métricas de Prometheus con autenticación básica si es accesible desde fuera.
Rendimiento
- Filebeat consume muy pocos recursos, pero Logstash puede ser pesado. Si tienes muchos logs, considera usar Kafka como buffer intermedio.
- Para tiendas con mucho tráfico, escala Elasticsearch a varios nodos.
[WARNING] No instales Elasticsearch, Logstash y Kibana en el mismo servidor que PrestaShop. Consumirán RAM y CPU que necesita tu tienda. Mejor usa un servidor separado o un VPS dedicado para el stack.
Conclusión
La monitorización PrestaShop y el logging PrestaShop con herramientas open source como ELK Stack y Prometheus te dan visibilidad total sobre tu tienda. No solo detectas problemas antes de que afecten a los clientes, sino que también optimizas el rendimiento basándote en datos reales.
Empieza por lo básico: instala Filebeat y envía los logs de PrestaShop a un ELK Stack mínimo. Luego, añade Prometheus para métricas del servidor. Cuando domines eso, crea tus propios exportadores de negocio y alertas personalizadas.
El coste es cero en licencias, pero el retorno en estabilidad y tranquilidad es incalculable. Tu tienda PrestaShop te lo agradecerá con ventas sin interrupciones.
