Concepto clave
La monitorización en producción es como tener un panel de control en un avión. No solo necesitas saber si el motor funciona, sino también cuánto combustible queda, la temperatura y si hay turbulencias. En sistemas de ML, Prometheus es ese panel de control: recolecta métricas de tus contenedores y servicios, almacenándolas como series de tiempo.
Imagina tu sistema de recomendación como una cadena de producción. Cada contenedor es una estación de trabajo. Sin logs y métricas, es como operar con los ojos vendados: no sabes si una recomendación tarda demasiado, si hay errores en el procesamiento o si el uso de memoria se dispara. Los logs registran eventos específicos ("el usuario X hizo clic en Y"), mientras que las métricas miden tendencias ("latencia promedio: 150ms").
Cómo funciona en la práctica
Vamos a implementar monitorización en un sistema de recomendación desplegado en Kubernetes. Primero, desplegamos Prometheus como un Pod en nuestro cluster. Luego, configuramos nuestros contenedores de ML para exponer métricas en un endpoint HTTP (por ejemplo, /metrics). Prometheus "raspa" estos endpoints periódicamente, recolectando datos.
Paso a paso: 1) Instalar Prometheus usando Helm o un manifiesto YAML. 2) Anotar nuestros Pods de ML con etiquetas que Prometheus detecte automáticamente. 3) Configurar nuestras aplicaciones Python para usar la biblioteca prometheus-client y exponer métricas personalizadas, como "recommendations_processed_total". 4) Verificar en la interfaz web de Prometheus que las métricas aparecen.
Codigo en accion
Antes: Un servicio de recomendación sin monitorización.
from flask import Flask, jsonify
import numpy as np
app = Flask(__name__)
@app.route('/recommend', methods=['POST'])
def recommend():
# Lógica de recomendación
recommendations = ["item1", "item2", "item3"]
return jsonify(recommendations)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)Después: El mismo servicio con métricas expuestas.
from flask import Flask, jsonify, request
import numpy as np
from prometheus_client import Counter, Histogram, generate_latest, CONTENT_TYPE_LATEST
app = Flask(__name__)
# Definir métricas
RECOMMENDATIONS_TOTAL = Counter('recommendations_processed_total', 'Total de recomendaciones generadas')
REQUEST_LATENCY = Histogram('request_latency_seconds', 'Latencia de las peticiones de recomendación')
@app.route('/metrics')
def metrics():
return generate_latest(), 200, {'Content-Type': CONTENT_TYPE_LATEST}
@app.route('/recommend', methods=['POST'])
@REQUEST_LATENCY.time()
def recommend():
RECOMMENDATIONS_TOTAL.inc()
# Lógica de recomendación
recommendations = ["item1", "item2", "item3"]
return jsonify(recommendations)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)Errores comunes
- No exponer el endpoint /metrics: Prometheus no puede raspar métricas si la aplicación no tiene esta ruta. Solución: Asegúrate de incluirla y que devuelva datos en el formato correcto.
- Etiquetas incorrectas en los Pods: Si las anotaciones en los Pods no coinciden con la configuración de Prometheus, no se descubrirán automáticamente. Solución: Usa anotaciones estándar como
prometheus.io/scrape: "true". - Métricas con alta cardinalidad: Crear métricas con muchas etiquetas únicas (como IDs de usuario) puede saturar Prometheus. Solución: Usa etiquetas con valores limitados, como "user_type" en lugar de "user_id".
- Olvidar los logs estructurados: Los logs en texto plano son difíciles de analizar. Solución: Usa formato JSON en los logs y envíalos a un sistema como Elasticsearch.
Checklist de dominio
- ¿Puedes desplegar Prometheus en un cluster Kubernetes usando un manifiesto YAML?
- ¿Sabes configurar una aplicación Python para exponer métricas con prometheus-client?
- ¿Entiendes la diferencia entre métricas (Prometheus) y logs (Fluentd/Elasticsearch)?
- ¿Puedes crear un dashboard básico en Grafana usando métricas de Prometheus?
- ¿Sabes anotar Pods para descubrimiento automático de métricas?
- ¿Puedes identificar métricas clave para un sistema de recomendación (ej., latencia, tasa de acierto)?
- ¿Conoces cómo alertar en Prometheus cuando una métrica supera un umbral?
Monitorizar un servicio de recomendación en Kubernetes con Prometheus
En este ejercicio, implementarás monitorización en un servicio de recomendación existente desplegado en Kubernetes.
- Prepara tu entorno: Asegúrate de tener un cluster Kubernetes funcionando (puede ser Minikube o un cloud). Clona el repositorio del proyecto que contiene el servicio de recomendación básico.
- Despliega Prometheus: Usa el siguiente manifiesto YAML para desplegar Prometheus en tu cluster. Crea un archivo
prometheus-deployment.yamly aplica conkubectl apply -f prometheus-deployment.yaml.apiVersion: apps/v1 kind: Deployment metadata: name: prometheus spec: replicas: 1 selector: matchLabels: app: prometheus template: metadata: labels: app: prometheus spec: containers: - name: prometheus image: prom/prometheus:latest ports: - containerPort: 9090 - Modifica el servicio de recomendación: Edita el código Python del servicio para incluir el endpoint
/metricsy métricas personalizadas, como se muestra en la sección "Código en acción". Reconstruye la imagen Docker y actualiza el despliegue en Kubernetes. - Configura el descubrimiento de servicios: Anota el Pod del servicio de recomendación con
prometheus.io/scrape: "true"yprometheus.io/port: "5000"en el manifiesto de despliegue. Vuelve a aplicar los cambios. - Verifica la monitorización: Accede a la interfaz web de Prometheus (usa
kubectl port-forwardsi es necesario) y busca la métricarecommendations_processed_total. Genera tráfico a tu servicio y confirma que la métrica aumenta.
- Usa kubectl get pods para verificar que Prometheus y tu servicio están corriendo.
- Si no ves métricas en Prometheus, revisa las anotaciones del Pod y que el endpoint /metrics devuelva datos.
- Para reconstruir la imagen Docker, usa docker build -t tu-imagen:tag . y actualiza la referencia en el YAML de Kubernetes.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.