Observabilidad en una gran plataforma n8n multiinquilino

Hola a todos
Estoy escalando una plataforma n8n multiinquilino y comenzando a darme cuenta de que los registros básicos ya no son suficientes.
Arquitectura actual:
Balanceador de carga

Múltiples trabajadores n8n

PostgreSQL + Redis + APIs externas
A medida que crece el número de inquilinos y flujos de trabajo, me resulta difícil responder preguntas como:
• ¿Qué inquilino genera la mayor carga?
• ¿Por qué falló un flujo de trabajo específico?
• ¿Dónde están los cuellos de botella del sistema?
• ¿Qué APIs externas causan latencia?
• ¿Cómo detecto problemas antes de que los clientes se den cuenta?
Estoy considerando agregar:
• Registros centralizados
• Recopilación de métricas
• Rastreo distribuido
• Paneles por inquilino
• Alertas y detección de anomalías
Métricas de ejemplo:
id_inquilino
id_flujo_de_trabajo
tiempo_de_ejecución
tasa_de_error
profundidad_de_cola
latencia_de_API
¿Qué pila de observabilidad estás usando?
¿Qué métricas han sido más valiosas?

Describe el problema/error/pregunta

¿Cuál es el mensaje de error (si lo hay)?

Por favor comparte tu flujo de trabajo

(Selecciona los nodos en tu lienzo y usa los atajos de teclado CMD+C/CTRL+C y CMD+V/CTRL+V para copiar y pegar el flujo de trabajo.)

Comparte el resultado devuelto por el último nodo

Información sobre tu configuración de n8n

  • Versión de n8n:
  • Base de datos (predeterminada: SQLite):
  • Configuración de n8n EXECUTIONS_PROCESS (predeterminada: own, main):
  • Ejecutando n8n a través de (Docker, npm, n8n cloud, aplicación de escritorio):
  • Sistema operativo:

Hey @Greg_John A medida que tu plataforma crece, se vuelve más difícil entender qué está sucediendo simplemente mirando los logs. Por eso es tan importante tener una buena observabilidad.

Una configuración típica de producción incluye:
Registro centralizado
Recopilación de métricas
Alertas
Trazabilidad (si es necesaria)

Las cosas más útiles para monitorear son:
• tenant_id
• workflow_id
• Tiempo de ejecución
• Tasa de errores
• Profundidad de la cola
• Tiempo de respuesta de la API externa

Agregar tenant_id y workflow_id a tus logs y métricas hace mucho más fácil encontrar y solucionar problemas para un cliente o flujo de trabajo específico.

También es una buena idea configurar alertas para:
Tasas de error altas
Atrasos en la cola
Fallos de trabajadores
APIs externas lentas
Picos inesperados en el tráfico

Un error que debes evitar es confiar solo en logs de aplicación o monitorear solo tu infraestructura. Necesitas visibilidad tanto en tus flujos de trabajo como en los sistemas que los ejecutan.

En resumen, centralizar tus logs y métricas, etiquetarlos correctamente y configurar paneles de control y alertas te ayudará a detectar problemas temprano y mantener tu plataforma funcionando sin problemas a medida que crece.

Hola @Greg_John
n8n incluye su propio endpoint de Prometheus, por lo que la capa de recopilación es un cambio de configuración, no algo que debas construir. Establece esto en los nodos principales y en los workers:

N8N_METRICS=true
N8N_METRICS_INCLUDE_WORKFLOW_ID_LABEL=true
N8N_METRICS_INCLUDE_NODE_TYPE_LABEL=true
N8N_METRICS_INCLUDE_API_ENDPOINTS=true
N8N_METRICS_INCLUDE_QUEUE_METRICS=true

La profundidad de la cola proviene de n8n_scaling_mode_queue_jobs_waiting y n8n_scaling_mode_queue_jobs_active. n8n las lee de Bull y las expone solo en los nodos principales, así que apunta el trabajo de scrape a los nodos principales para el estado de la cola y a los workers para las ejecuciones y tiempos de nodos. El ID de flujo de trabajo es la etiqueta más granular que n8n emite, no hay dimensión de inquilino, así que realiza la unión flujo de trabajo-inquilino en el rebaño de Prometheus o en una regla de grabación y construye las vistas de inquilino sobre esa serie. Mantén /metrics en la red interna, expone detalles operacionales sobre la instancia.

Gracias, esto es muy útil. Me gusta el punto sobre etiquetar todo con tenant_id y workflow_id, eso haría que la solución de problemas fuera mucho más fácil en una configuración multiinquilino. También estoy de acuerdo en que monitorear flujos de trabajo es tan importante como monitorear la infraestructura. Agradezco que hayas compartido esto.

¡Gracias por la perspectiva! Es un punto de vista útil y me da algunas ideas para mejorar mi configuración. Investigaré ese enfoque y veré cómo se adapta a mi arquitectura.

La mayoría de este hilo contiene consejos genéricos de observabilidad. Las partes específicas de n8n son donde viven realmente las respuestas a tus cinco preguntas, así que:

La profundidad de la cola y la carga por inquilino ya están expuestas — no tienes que construirlas. n8n incluye un endpoint de Prometheus que está desactivado por defecto: N8N_METRICS=true te da /metrics en el principal. Las banderas que importan para tu caso son N8N_METRICS_INCLUDE_QUEUE_METRICS (esa es tu queue_depth), N8N_METRICS_INCLUDE_WORKFLOW_ID_LABEL y N8N_METRICS_INCLUDE_NODE_TYPE_LABEL (series por flujo de trabajo y por tipo de nodo, que es cómo “qué inquilino está generando más carga” y “qué API externa es lenta” se convierten en una sola consulta de PromQL en lugar de un proyecto de registros). Extrae los datos a lo que ya ejecutes. Observa la cardinalidad si tienes muchos flujos de trabajo — la etiqueta workflow-id es lo que la hace útil y también lo que la hace costosa.

Tu métrica error_rate te mentirá, y esta es la que muerde a escala multiinquilino. Una ejecución de n8n finaliza con estado success en muchos casos donde en realidad no sucedió nada: un nodo que devuelve cero elementos simplemente pasa cero elementos aguas abajo y todo lo que viene después se omite silenciosamente; un IF sin rama coincidente; la salida done de un Split In Batches que nadie conectó. La ejecución está en verde, la tasa de error se mantiene plana, y los datos del inquilino simplemente no se movieron. Así que no solo monitorees los errores — afirma los resultados. Emite un recuento de elementos al final de cada flujo de trabajo del inquilino y alerta en processed == 0 cuando cero no es un resultado legítimo. El éxito silencioso es el modo de fallo que llega a tus clientes antes de que llegue a tu panel.

“Detectar problemas antes de que los clientes lo noten” necesita un interruptor de vigilancia, no una alerta. El Error Trigger / Error Workflow es el gancho de alertas correcto por inquilino — configúralo por flujo de trabajo, e incluye lo suficiente en la carga útil para que sea procesable ($execution.id, el nombre del flujo de trabajo, el nodo que falla, y los datos del último nodo; una alerta que solo dice “flujo de trabajo fallido” te cuesta una sesión de depuración cada vez). Pero ten en cuenta qué es lo que estructuralmente no puede hacer: el Error Trigger nunca se dispara para una ejecución que nunca comenzó. Un disparador de programa atascado, un worker bloqueado, un flujo de trabajo que alguien desactivó — todos producen silencio, y el silencio se ve exactamente como “todo está bien.” La solución es invertida: haz que cada flujo de trabajo del inquilino envíe un ping a un perro guardián al completarse, y alerta cuando el ping está ausente. Esa única verificación detecta toda la clase de fallo que tus registros no pueden ver por construcción.

Tu cuello de botella es probablemente execution_entity. A volumen multiinquilino, la tabla de datos de ejecución es lo que hace que Postgres sea lenta, y crece silenciosamente. EXECUTIONS_DATA_PRUNE=true con un verdadero EXECUTIONS_DATA_MAX_AGE y EXECUTIONS_DATA_PRUNE_MAX_COUNT, y para inquilinos de alto volumen considera EXECUTIONS_DATA_SAVE_ON_SUCCESS=none — mantener cargas útiles de éxito completas para cada ejecución es un costo grande para datos que nunca abrirás. Limpia antes de optimizar consultas; mucho de “n8n es lento” resulta ser esto.

Una cosa que vale la pena decidir temprano ya que eres multiinquilino: esa tabla de ejecución contiene las cargas útiles reales de tus inquilinos. Si alguno de ellos está en la UE, la base de datos de ejecución es una ubicación de procesamiento, y la retención allí es una pregunta de cumplimiento, no solo una de espacio en disco. Es mucho más barato establecer la política ahora que explicarla después.