M14: add n8n execution health telemetry

This commit is contained in:
NuklearRabbit
2026-08-10 03:41:06 +02:00
parent 218599af7d
commit 58fb515337
17 changed files with 368 additions and 22 deletions
+3
View File
@@ -315,6 +315,9 @@ export interface N8nWorkflowEvidence {
name: string;
built: boolean;
last_seen_at: string | null;
state: "no_evidence" | "healthy" | "stale" | "failed";
last_status: "succeeded" | "failed" | null;
last_execution_id: string | null;
}
export interface N8nErrorHandlerStatus {
@@ -37,6 +37,10 @@
"description": "{{known}} of {{expected}} canonical n8n workflows have live evidence of running.",
"notBuilt": "Not built yet",
"noEvidence": "No evidence yet",
"healthy": "Healthy",
"stale": "Evidence is stale",
"failed": "Latest execution failed",
"executionId": "Execution",
"columns": {
"name": "Workflow",
"status": "Status",
@@ -36,7 +36,11 @@
"title": "Workflows d'automatisation",
"description": "{{known}} workflows n8n canoniques sur {{expected}} disposent de preuves actuelles de fonctionnement.",
"notBuilt": "Pas encore créé",
"noEvidence": "Aucune preuve pour l'instant",
"noEvidence": "Aucune preuve pour linstant",
"healthy": "Sain",
"stale": "Preuve obsolète",
"failed": "Dernière exécution échouée",
"executionId": "Exécution",
"columns": {
"name": "Workflow",
"status": "Statut",
@@ -37,6 +37,10 @@
"description": "{{known}} van {{expected}} canonieke n8n-workflows hebben actuele evidentie van werking.",
"notBuilt": "Nog niet gebouwd",
"noEvidence": "Nog geen evidentie",
"healthy": "Gezond",
"stale": "Evidentie verouderd",
"failed": "Laatste uitvoering mislukt",
"executionId": "Uitvoering",
"columns": {
"name": "Workflow",
"status": "Status",
+8 -4
View File
@@ -279,9 +279,13 @@ export function Automation() {
const displayName = slug ? t(`workflows.names.${slug}`) : w.name;
const badge = !w.built
? { status: "not_configured", label: t("workflows.notBuilt") }
: w.last_seen_at
? { status: "available", label: t("statusLabels.operational") }
: { status: "no_events", label: t("workflows.noEvidence") };
: w.state === "healthy"
? { status: "available", label: t("workflows.healthy") }
: w.state === "stale"
? { status: "degraded", label: t("workflows.stale") }
: w.state === "failed"
? { status: "failed", label: t("workflows.failed") }
: { status: "no_events", label: t("workflows.noEvidence") };
return (
<tr key={w.name}>
<td data-label={t("workflows.columns.name")}>{displayName}</td>
@@ -298,7 +302,7 @@ export function Automation() {
<td data-label={t("workflows.columns.technicalId")}>
<details className="evidence-disclosure">
<summary>{t("common:actions.technicalDetails")}</summary>
<span className="table-subtext">{w.name}</span>
<span className="table-subtext">{w.name}{w.last_execution_id ? ` · ${t("workflows.executionId")}: ${w.last_execution_id}` : ""}</span>
</details>
</td>
</tr>