M14: add n8n execution health telemetry
This commit is contained in:
@@ -17,8 +17,9 @@ credential values are never embedded; nodes reference named n8n credentials inst
|
||||
| Live workflow ID | `mobilityops-return-processing` |
|
||||
| Active status (as of 2026-08-04) | Active / Published |
|
||||
| Error Workflow | `Fleet Ops — Workflow Error Handler` (wired) |
|
||||
| Timeouts / bounded retries | `Record follow-up` HTTP node: 15s timeout, retry on fail (3 tries, 1000ms wait) |
|
||||
| Checksum (sha256) | `e5b6ba02a7824867620ceaf214224521d52de76337604b947f26f1b0b5432358` (updated 2026-08-05 — the committed file had invalid JSON, a missing `},` between two node objects; fixed, no live workflow change) |
|
||||
| Timeouts / bounded retries | `Record follow-up` and heartbeat HTTP nodes: 15s timeout, retry on fail (3 tries, 1000ms wait) |
|
||||
| Execution telemetry | Successful runs POST execution ID and status to `/api/v1/integrations/n8n/heartbeat`; failed runs are registered by the Error Workflow. |
|
||||
| Checksum (sha256) | `17b8dd5b8e7ab5d0c0856a40f4199a401ad38f63895f611a096a80c9740f1e99` (heartbeat-enabled definition, 2026-08-10) |
|
||||
|
||||
## 2. Fleet Ops — Scheduled Data Quality Scan
|
||||
|
||||
@@ -32,13 +33,14 @@ credential values are never embedded; nodes reference named n8n credentials inst
|
||||
| Live workflow ID | `mobilityops-scheduled-quality-scan` |
|
||||
| Active status (as of 2026-08-04) | Active / Published |
|
||||
| Error Workflow | `Fleet Ops — Workflow Error Handler` (wired) |
|
||||
| Timeouts / bounded retries | `Run quality scan` HTTP node: 15s timeout, retry on fail (3 tries, 1000ms wait) |
|
||||
| Checksum (sha256) | `c0d46e0519118e6336e35c4ea2a67edb2f14bd007909ccf9256c93733751244a` |
|
||||
| Timeouts / bounded retries | Scan and heartbeat HTTP nodes: 15s timeout, retry on fail (3 tries, 1000ms wait) |
|
||||
| Execution telemetry | Every successful scheduled/manual run posts an idempotent heartbeat with its n8n execution ID. |
|
||||
| Checksum (sha256) | `f0bda8b0fa99d1a2403e970e00bd1f896cd4d10eaa626147fcca577a7ad7cb46` |
|
||||
|
||||
## 3. Fleet Ops — RAGcore Procedure Sync
|
||||
|
||||
Fully built and saved live (6 real nodes: Schedule Trigger → List procedures → Prepare
|
||||
uploads → Upload to RAGcore → Summarize sync result → Report sync result to Fleet Ops).
|
||||
Fully built with 7 real nodes: Schedule Trigger → List procedures → Prepare uploads →
|
||||
Upload to RAGcore → Summarize sync result → Report sync result → Report heartbeat.
|
||||
|
||||
**Published/active as of 2026-08-05**, once RAGcore itself went live (see
|
||||
`PROJECT_STATE.md`'s "RAGcore actually went live" entry): the workflow's `RAGcore Sync
|
||||
@@ -69,7 +71,8 @@ the same way via the same CLI import path, re-verified.
|
||||
| Live workflow ID | `6wbkc4d1AouGpmWT` |
|
||||
| Active status (as of 2026-08-05) | **Active / Published** |
|
||||
| Error Workflow | `Fleet Ops — Workflow Error Handler` (wired) |
|
||||
| Checksum (sha256) | `643c0515a50fed3d35e28f0b8cb17841f6f8d91699944980b5c56e619d5bf2a6` |
|
||||
| Execution telemetry | Successful syncs report both the bounded sync result and the canonical workflow heartbeat. |
|
||||
| Checksum (sha256) | `8644d9faec4d17a43ba797e300b91fff976881c9b259e457fadd5a7cfaf39c6f` |
|
||||
|
||||
## 4. Fleet Ops — Workflow Error Handler
|
||||
|
||||
@@ -89,7 +92,8 @@ Ops, which registers an audit event idempotently keyed on `execution_id`.
|
||||
| Live workflow ID | `Xppn2rAEqUuyiCJF` |
|
||||
| Active status (as of 2026-08-04) | Active / Published |
|
||||
| Error Workflow (on itself) | `- No Workflow -` (deliberately unset — prevents a recursive error loop) |
|
||||
| Checksum (sha256) | `d9e2795b917a89a9b4a733e435661585f8011bc97f134d3643dee93ea05b0be6` |
|
||||
| Execution telemetry | A successfully handled failure posts its own execution heartbeat after registering the target failure. |
|
||||
| Checksum (sha256) | `1e50cf8b679b9e9f9b5cf4a1594bda459597ade40f44e8a68f540890f9c4b61d` |
|
||||
|
||||
Validated this round: mock-data run (Error Trigger pinned to a realistic payload)
|
||||
produced a real `200 {"status":"registered", ...}` from the live Fleet Ops server;
|
||||
|
||||
@@ -64,6 +64,33 @@
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"position": [780, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"method": "POST",
|
||||
"url": "http://192.168.10.150:1236/api/v1/integrations/n8n/heartbeat",
|
||||
"authentication": "genericCredentialType",
|
||||
"genericAuthType": "httpHeaderAuth",
|
||||
"sendBody": true,
|
||||
"contentType": "json",
|
||||
"specifyBody": "keypair",
|
||||
"bodyParameters": { "parameters": [
|
||||
{ "name": "workflow_id", "value": "={{ $workflow.id }}" },
|
||||
{ "name": "workflow_name", "value": "={{ $workflow.name }}" },
|
||||
{ "name": "execution_id", "value": "={{ $execution.id }}" },
|
||||
{ "name": "status", "value": "succeeded" }
|
||||
]},
|
||||
"options": { "timeout": 15000 }
|
||||
},
|
||||
"id": "heartbeat-node",
|
||||
"name": "Report workflow heartbeat",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"position": [1020, 300],
|
||||
"credentials": { "httpHeaderAuth": { "name": "Fleet Ops Service Token" } },
|
||||
"retryOnFail": true,
|
||||
"maxTries": 3,
|
||||
"waitBetweenTries": 1000
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
@@ -75,6 +102,9 @@
|
||||
},
|
||||
"Run quality scan": {
|
||||
"main": [[{ "node": "Summarize result", "type": "main", "index": 0 }]]
|
||||
},
|
||||
"Summarize result": {
|
||||
"main": [[{ "node": "Report workflow heartbeat", "type": "main", "index": 0 }]]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
|
||||
@@ -54,6 +54,33 @@
|
||||
"credentials": {
|
||||
"httpHeaderAuth": { "name": "Fleet Ops Service Token" }
|
||||
}
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"method": "POST",
|
||||
"url": "http://192.168.10.150:1236/api/v1/integrations/n8n/heartbeat",
|
||||
"authentication": "genericCredentialType",
|
||||
"genericAuthType": "httpHeaderAuth",
|
||||
"sendBody": true,
|
||||
"contentType": "json",
|
||||
"specifyBody": "keypair",
|
||||
"bodyParameters": { "parameters": [
|
||||
{ "name": "workflow_id", "value": "={{ $workflow.id }}" },
|
||||
{ "name": "workflow_name", "value": "={{ $workflow.name }}" },
|
||||
{ "name": "execution_id", "value": "={{ $execution.id }}" },
|
||||
{ "name": "status", "value": "succeeded" }
|
||||
]},
|
||||
"options": { "timeout": 15000 }
|
||||
},
|
||||
"id": "heartbeat-node",
|
||||
"name": "Report workflow heartbeat",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"position": [1020, 300],
|
||||
"credentials": { "httpHeaderAuth": { "name": "Fleet Ops Service Token" } },
|
||||
"retryOnFail": true,
|
||||
"maxTries": 3,
|
||||
"waitBetweenTries": 1000
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
@@ -62,6 +89,9 @@
|
||||
},
|
||||
"Build safe error report": {
|
||||
"main": [[{ "node": "Report failure to Fleet Ops", "type": "main", "index": 0 }]]
|
||||
},
|
||||
"Report failure to Fleet Ops": {
|
||||
"main": [[{ "node": "Report workflow heartbeat", "type": "main", "index": 0 }]]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
|
||||
@@ -54,6 +54,33 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"method": "POST",
|
||||
"url": "http://192.168.10.150:1236/api/v1/integrations/n8n/heartbeat",
|
||||
"authentication": "genericCredentialType",
|
||||
"genericAuthType": "httpHeaderAuth",
|
||||
"sendBody": true,
|
||||
"contentType": "json",
|
||||
"specifyBody": "keypair",
|
||||
"bodyParameters": { "parameters": [
|
||||
{ "name": "workflow_id", "value": "={{ $workflow.id }}" },
|
||||
{ "name": "workflow_name", "value": "={{ $workflow.name }}" },
|
||||
{ "name": "execution_id", "value": "={{ $execution.id }}" },
|
||||
{ "name": "status", "value": "succeeded" }
|
||||
]},
|
||||
"options": { "timeout": 15000 }
|
||||
},
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.4,
|
||||
"position": [1056, -144],
|
||||
"id": "workflow-heartbeat-node",
|
||||
"name": "Report workflow heartbeat",
|
||||
"credentials": { "httpHeaderAuth": { "name": "Fleet Ops Service Token" } },
|
||||
"retryOnFail": true,
|
||||
"maxTries": 3,
|
||||
"waitBetweenTries": 1000
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"jsCode": "const documents = $input.first().json.documents;\nconst results = [];\nfor (const doc of documents) {\n const binary = await this.helpers.prepareBinaryData(Buffer.from(doc.content, 'utf-8'), doc.document_id + '.md', 'text/markdown');\n results.push({json: {id: doc.id, language: doc.language, document_id: doc.document_id, title: doc.title, version: doc.version, content_hash: doc.content_hash}, binary: {file: binary}});\n}\nreturn results;"
|
||||
@@ -229,6 +256,9 @@
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Report sync result to Fleet Ops": {
|
||||
"main": [[{ "node": "Report workflow heartbeat", "type": "main", "index": 0 }]]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
|
||||
@@ -69,6 +69,33 @@
|
||||
"maxTries": 3,
|
||||
"waitBetweenTries": 1000
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"method": "POST",
|
||||
"url": "http://192.168.10.150:1236/api/v1/integrations/n8n/heartbeat",
|
||||
"authentication": "genericCredentialType",
|
||||
"genericAuthType": "httpHeaderAuth",
|
||||
"sendBody": true,
|
||||
"contentType": "json",
|
||||
"specifyBody": "keypair",
|
||||
"bodyParameters": { "parameters": [
|
||||
{ "name": "workflow_id", "value": "={{ $workflow.id }}" },
|
||||
{ "name": "workflow_name", "value": "={{ $workflow.name }}" },
|
||||
{ "name": "execution_id", "value": "={{ $execution.id }}" },
|
||||
{ "name": "status", "value": "succeeded" }
|
||||
]},
|
||||
"options": { "timeout": 15000 }
|
||||
},
|
||||
"id": "heartbeat-node",
|
||||
"name": "Report workflow heartbeat",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"position": [980, 300],
|
||||
"credentials": { "httpHeaderAuth": { "name": "Fleet Ops Service Token" } },
|
||||
"retryOnFail": true,
|
||||
"maxTries": 3,
|
||||
"waitBetweenTries": 1000
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
@@ -79,7 +106,7 @@
|
||||
"name": "Return result",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.4,
|
||||
"position": [1020, 300]
|
||||
"position": [1220, 300]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
@@ -90,6 +117,9 @@
|
||||
"main": [[{ "node": "Record follow-up", "type": "main", "index": 0 }]]
|
||||
},
|
||||
"Record follow-up": {
|
||||
"main": [[{ "node": "Report workflow heartbeat", "type": "main", "index": 0 }]]
|
||||
},
|
||||
"Report workflow heartbeat": {
|
||||
"main": [[{ "node": "Return result", "type": "main", "index": 0 }]]
|
||||
}
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user