我想在工作流程失敗時自動在 Sentry 監控系統 中開啟一個議題(自主代管的 n8n、自主代管的 sentry)。
「處理錯誤」文件只談論郵件、Slack 和 Telegram —— 而 Sentry Node 操作不允許建立議題/傳送錯誤。
Sentry 本身自從 PR 4394 後就能將內部錯誤傳送到 sentry,但工作流程錯誤則無法。
我可以做什麼?
我想在工作流程失敗時自動在 Sentry 監控系統 中開啟一個議題(自主代管的 n8n、自主代管的 sentry)。
「處理錯誤」文件只談論郵件、Slack 和 Telegram —— 而 Sentry Node 操作不允許建立議題/傳送錯誤。
Sentry 本身自從 PR 4394 後就能將內部錯誤傳送到 sentry,但工作流程錯誤則無法。
我可以做什麼?
歡迎 @cweiske!
你可以完全跳過 Sentry 節點,改用「Error Trigger」+ 「HTTP Request」節點直接 POST 到 Sentry 的 Envelope API(SDK 使用的同一個端點)。使用「Error Trigger」作為起始節點設置一個單獨的錯誤處理工作流程,然後添加一個指向 https://sentry.example.com/api/<project_id>/envelope/ 的「HTTP Request」節點,並在 X-Sentry-Auth header 中放入你的 DSN 密鑰。
該請求體需要遵循 Sentry 的 envelope 格式 - 至少需要一行 header 和一個 JSON 格式的事件負載,以換行符分隔。你可以在「HTTP Request」之前的「Code」節點中構建這個:
const header = JSON.stringify({event_id: $execution.id.replace(/-/g,''), sent_at: new Date().toISOString(), dsn: 'YOUR_DSN'});
const eventMeta = JSON.stringify({type:'event'});
const event = JSON.stringify({level:'error', message: $json.execution.error.message, logger: $json.workflowData.name});
return [{json: {body: [header, eventMeta, event].join('\n')}}];
將「HTTP Request」的請求體設置為 raw/text 格式,並傳遞 {{ $json.body }}。這樣你就能完全控制進入 Sentry 的數據,完全無需使用 Sentry 節點。
在將此連接到 Sentry 之前,有一個小警告:發送一個事件並讓 Sentry 對其進行分組,而不是嘗試直接建立問題。設定穩定的指紋,以便來自同一個損壞工作流程/節點的重試會折疊成一個問題。
對於 Error Trigger 負載,從工作流程 id/名稱、失敗的節點名稱和錯誤訊息/類別建立指紋。將執行 id 作為標籤添加,而不是指紋的一部分。然後讓同一個工作流程失敗兩次;良好的結果是一個 Sentry 問題有兩個事件,而不是兩個問題。
這完全按照你們兩個所描述的做法 — Error Trigger → 建立 Sentry envelope → POST 到你的 /envelope/ 端點(跳過 Sentry node,就像 @nguyenthieutoan 所說的),使用 @oimrqs_ops 提出的穩定指紋。
指紋是 [workflow name, failed node, error class + message],所以同一個工作流的重複失敗會合併成一個 Sentry issue;執行 id 作為標籤附帶著,不在指紋中。發送同一個工作流的失敗兩次,你會得到一個 issue 有兩個事件。
運行前的兩項編輯:URL(your-sentry-host/api/PROJECT_ID/envelope/)和 X-Sentry-Auth 標題中的 sentry_key(你的 DSN 公開金鑰)。然後在你關心的工作流上將此工作流設定為 Error Workflow(Settings → Error Workflow),它就會捕捉所有的錯誤。