Observabilité sur une large plateforme n8n multi-locataires

Salut à tous,
J’agrandis une plateforme n8n multi-tenant et je commence à réaliser que les logs basiques ne suffisent plus.
Architecture actuelle : Load Balancer

Multiples workers n8n

PostgreSQL + Redis + APIs externes
Au fur et à mesure que le nombre de tenants et de workflows augmente, j’ai du mal à répondre à des questions comme :
• Quel tenant génère la plus grande charge ?
• Pourquoi un workflow spécifique a-t-il échoué ?
• Où sont les goulots d’étranglement du système ?
• Quelles APIs externes causent de la latence ?
• Comment détecter les problèmes avant que les clients ne les remarquent ?
J’envisage d’ajouter :
• Logging centralisé
• Collecte de métriques
• Traçage distribué
• Tableaux de bord par tenant
• Alertes et détection d’anomalies
Métriques d’exemple : tenant_id
workflow_id
execution_time
error_rate
queue_depth
API_latency
Quelle pile d’observabilité utilisez-vous ?
Quelles métriques se sont avérées les plus utiles ?

Décrivez le problème/l’erreur/la question

Quel est le message d’erreur (le cas échéant) ?

Veuillez partager votre workflow

(Sélectionnez les nœuds sur votre canevas et utilisez les raccourcis clavier CMD+C/CTRL+C et CMD+V/CTRL+V pour copier et coller le workflow.)

Partagez la sortie renvoyée par le dernier nœud

Informations sur votre configuration n8n

  • Version n8n :
  • Base de données (par défaut : SQLite) :
  • Paramètre n8n EXECUTIONS_PROCESS (par défaut : own, main) :
  • Exécution de n8n via (Docker, npm, n8n cloud, application de bureau) :
  • Système d’exploitation :

Salut @Greg_John À mesure que ta plateforme grandit, il devient plus difficile de comprendre ce qui se passe en regardant simplement les logs. C’est pourquoi une bonne observabilité est si importante.

Un setup de production typique comprend :
La journalisation centralisée
La collecte de métriques
Les alertes
Le tracing (si nécessaire)

Les choses les plus utiles à monitorer sont :
• tenant_id
• workflow_id
• Temps d’exécution
• Taux d’erreur
• Profondeur de la file d’attente
• Temps de réponse des API externes

Ajouter tenant_id et workflow_id à tes logs et métriques rend beaucoup plus facile la recherche et la résolution des problèmes pour un client ou un workflow spécifique.

C’est aussi une bonne idée de configurer des alertes pour :
Les taux d’erreur élevés
Les retards de file d’attente
Les défaillances de workers
Les API externes lentes
Les pics de trafic inattendus

Une erreur à éviter est de compter uniquement sur les logs applicatifs ou de monitorer seulement votre infrastructure. Tu as besoin de visibilité sur tes workflows et les systèmes qui les exécutent.

En résumé, centraliser tes logs et métriques, les tagger correctement et configurer des tableaux de bord et des alertes t’aidera à identifier les problèmes tôt et à maintenir ta plateforme en bon état de marche à mesure qu’elle grandit.

Salut @Greg_John
n8n dispose de son propre endpoint Prometheus, donc la couche de collecte est un changement de configuration, pas quelque chose que tu dois construire. Définis ceci sur les mains et les 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 profondeur de la queue provient de n8n_scaling_mode_queue_jobs_waiting et n8n_scaling_mode_queue_jobs_active. n8n les lit à partir de Bull et les expose sur les mains uniquement, donc pointe le job de scrape sur les mains pour l’état de la queue et sur les workers pour l’exécution et les timings des nœuds. L’ID de workflow est la plus fine granularité d’étiquette que n8n émet, il n’y a pas de dimension de tenant, donc fais la jointure workflow-to-tenant dans le relabeling Prometheus ou une règle d’enregistrement et construis les vues de tenant au-dessus de cette série. Garde /metrics sur le réseau interne, cela expose les détails opérationnels de l’instance.

Merci, c’est vraiment utile. J’aime bien le point sur le fait de tout étiqueter avec tenant_id et workflow_id — cela rendrait le dépannage beaucoup plus facile dans une configuration multi-tenant. Je suis aussi d’accord pour dire que la surveillance des workflows est tout aussi importante que la surveillance de l’infrastructure. Merci de partager cela.

Merci pour cette perspicacité ! C’est un point de vue utile qui me donne quelques idées pour améliorer ma configuration. Je vais explorer cette approche et voir comment elle s’adapte à mon architecture.

La plupart de ce fil de discussion contient des conseils génériques en matière d’observabilité. Les parties spécifiques à n8n sont là où se trouvent réellement les réponses à tes cinq questions, donc :

La profondeur de la file d’attente et la charge par locataire sont déjà exposées — tu n’as pas à les construire. n8n fournit un endpoint Prometheus désactivé par défaut : N8N_METRICS=true te donne /metrics sur le serveur principal. Les drapeaux qui importent dans ton cas sont N8N_METRICS_INCLUDE_QUEUE_METRICS (c’est ta queue_depth), N8N_METRICS_INCLUDE_WORKFLOW_ID_LABEL et N8N_METRICS_INCLUDE_NODE_TYPE_LABEL (séries par workflow et par type de nœud, ce qui fait que « quel locataire génère le plus de charge » et « quelle API externe est lente » deviennent une seule requête PromQL au lieu d’un projet de journalisation). Récupère-la dans ce que tu exécutes déjà. Surveille la cardinalité si tu as beaucoup de workflows — le libellé workflow-id est ce qui le rend utile et aussi ce qui le rend coûteux.

Ta métrique error_rate te mentira, et c’est celle-ci qui pose problème à l’échelle multi-locataire. Une exécution n8n se termine avec le statut success dans de nombreux cas où rien ne s’est réellement passé : un nœud qui retourne zéro élément transmet simplement zéro élément en aval et tout ce qui suit se désactive silencieusement ; une condition IF sans branche correspondante ; la sortie done d’une Split In Batches que personne n’a connectée. L’exécution est verte, le taux d’erreur reste plat, et les données du locataire n’ont tout simplement pas bougé. Ne surveille donc pas seulement les erreurs — affirme les résultats. Émets un comptage d’éléments à la fin de chaque workflow de locataire et déclenche une alerte sur processed == 0 quand zéro n’est pas un résultat légitime. Le succès silencieux est le mode de défaillance qui atteint tes clients avant d’atteindre ton tableau de bord.

« Détecter les problèmes avant que les clients ne les remarquent » nécessite un interrupteur de sécurité, pas une alerte. L’Error Trigger / Error Workflow est le bon crochet d’alerte par locataire — définis-le par workflow, et mets assez d’informations dans la charge pour que ce soit exploitable ($execution.id, le nom du workflow, le nœud défaillant et les données du dernier nœud ; une alerte qui dit juste « le workflow a échoué » te coûte une session de débogage à chaque fois). Mais note ce qu’il ne peut structurellement pas faire : l’Error Trigger ne se déclenche jamais pour une exécution qui n’a jamais commencé. Un déclencheur d’horaire bloqué, un worker coincé, un workflow que quelqu’un a désactivé — tous produisent du silence, et le silence ressemble exactement à « tout va bien ». La correction est inversée : fais en sorte que chaque workflow de locataire signale sa fin à un watchdog, et déclenche une alerte quand le signal est absent. Cette seule vérification détecte toute la classe de défaillances que tes journaux ne peuvent pas voir par construction.

Ton goulot d’étranglement est probablement execution_entity. À volume multi-locataire, la table de données d’exécution est ce qui ralentit Postgres, et elle augmente discrètement. EXECUTIONS_DATA_PRUNE=true avec un vrai EXECUTIONS_DATA_MAX_AGE et EXECUTIONS_DATA_PRUNE_MAX_COUNT, et pour les locataires à haut volume, envisage EXECUTIONS_DATA_SAVE_ON_SUCCESS=none — conserver les charges complètes de succès pour chaque exécution est un coût important pour des données que tu n’ouvriras jamais. Nettoie avant d’optimiser les requêtes ; beaucoup de « n8n est lent » s’avère être cela.

Une chose utile à décider tôt puisque tu es multi-locataire : cette table d’exécution contient les charges réelles de tes locataires. Si l’un d’entre eux est dans l’UE, la base de données d’exécution est un lieu de traitement, et la conservation y est une question de conformité, pas seulement une question d’espace disque. Beaucoup moins cher de fixer la politique maintenant que de l’expliquer plus tard.