本指南提供各種實作Webhook 的範例,以及 Webhook 疑難排解建議。
設定工作階段參數
下列範例說明如何設定工作階段參數。
Go
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
請參閱 Webhooks 快速入門。Java
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Node.js
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Python
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
傳回完成要求的回應
下列範例說明如何傳回完成回應。
Go
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
請參閱 Webhooks 快速入門。Java
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Node.js
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Python
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
視需要設定表單參數
下列範例說明如何將參數標示為必要。
Java
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Node.js
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
驗證表單參數
下列範例說明如何驗證表單參數。
Java
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Node.js
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Python
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
記錄工作階段 ID
以下範例說明如何記錄 Webhook 要求中的 session ID
。
Python
如要向 Dialogflow 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
疑難排解
Webhook 呼叫的生命週期
Webhook 呼叫一律由 Conversational Agents (Dialogflow CX) 發起,並透過 HTTPS 連線至網頁伺服器。一般網路服務的 Webhook 呼叫來自 Google 所屬的網際網路 IP 位址,可連線至公開網際網路中可用的網路伺服器 (Webhook 伺服器)。另一方面,Service Directory Webhook 一律從內部Google Cloud 位址啟動,且只能連線至 Google Cloud私人網路中的 Webhook 伺服器。
有助於偵錯 Webhook 的記錄檔
如要偵錯 Webhook 問題,通常需要收集 Cloud Logging Dialogflow 記錄和 Webhook 伺服器記錄。如果 Webhook 伺服器是使用 Cloud Run 函式實作,記錄檔會位於 Cloud Logging。否則,記錄通常會位於執行 Webhook 伺服器的位置。
標準 Webhook 記錄包含 detectIntentResponseId
欄位和 UUID,有助於追蹤 Webhook 伺服器中的特定呼叫。啟用 Cloud Logging 時,這項記錄會出現在 Dialogflow Cloud Logging 記錄中。
常見的 Webhook 問題
您可能會在 Webhook 呼叫的 Dialogflow 記錄檔中發現下列錯誤:
Webhook 伺服器主機名稱解析錯誤
Dialogflow 查詢通用 Webhook 的主機名稱,但 DNS 中不存在該主機名稱。請確認主機名稱已在公開 DNS 中註冊。如果是新的主機名稱,記錄可能需要一段時間才會生效。Cloud Logging 訊息:
State: URL_ERROR, Reason: ERROR_DNS
。
Webhook 伺服器傳回用戶端錯誤
除了 ERROR_DNS
以外,這個狀態表示 Webhook 伺服器傳回 4xx 回應。這可能是未經授權的狀態 (401 - ERROR_AUTHENTICATION
),
或是網址未在 Webhook 伺服器中找到 (404 - ERROR_NOT_FOUND
)。
Cloud Logging 訊息:State: URL_ERROR
。
Webhook 伺服器傳回回應前,Dialogflow 服務專員已逾時
網路伺服器尚未完成作業,Dialogflow 就已達到 Webhook 超時上限。這裡有兩種可能的方法:縮短 Webhook 伺服器處理時間,或延長 Dialogflow 等待 Webhook 的時間。雖然在許多情況下,縮短處理時間並非易事,但通常能帶來最佳結果。請注意,Webhook 有最長逾時限制,且調高這項設定前,終端來電者或使用者必須等待較長時間,才能從服務專員那裡取得回覆。Cloud Logging
message: State: URL_TIMEOUT, Reason: TIMEOUT_WEB
。
Webhook 伺服器傳回回應前,gRPC 超時
Webhook 呼叫完成前,已達到 Dialogflow API 呼叫中 gRPC 設定的時間限制。這項限制通常是在整合層級設定,與 Dialogflow 參數和 Webhook 超時限制無關。如要進一步瞭解 gRPC 期限,請參閱 https://grpc.io/docs/guides/deadlines/。Cloud Logging
message: State: URL_REJECTED, Reason: REJECTED_DEADLINE_EXCEEDED
。
Dialogflow 無法連線至 Webhook 伺服器
由於發生網路錯誤,或已建立連線但 Webhook 伺服器傳回 HTTP 狀態 5xx,表示處理要求時發生問題,因此無法連上 Webhook 伺服器。請確認 Dialogflow 可以在網路層級連上 Webhook 伺服器位址。如果要求顯示在 Webhook 伺服器記錄中,請找出呼叫傳回 5xx 錯誤的原因。Cloud Logging 訊息:
State: URL_UNREACHABLE
。
追蹤 Webhook 呼叫
您可以使用工作階段 ID、detectIntentResponse
ID、Cloud Run 函式的追蹤 ID 和呼叫的時間戳記,在 Dialogflow 和 Webhook 伺服器之間建立標準 Webhook 呼叫的關聯。您可以使用呼叫的時間戳記,以及設計時在 Webhook 定義中指定的會期參數值,彈性追蹤 Webhook。如要進一步瞭解標準和彈性 Webhook 要求,請參閱「Webhook」一文。
工作階段 ID 會顯示在 WebhookRequest 的 sessionInfo.session
欄位中。每個對話的專屬工作階段 ID,可協助您比較代理程式記錄和 Webhook 記錄,找出使用相同工作階段 ID 的要求。前一個「記錄工作階段 ID」部分說明如何從 Webhook 記錄工作階段 ID。
此外,如果您在 Cloud Run functions 或類似的無伺服器選項上代管 Webhook,可以使用記錄檔項目中的 trace
欄位做為記錄檔篩選器。 Google Cloud 單次執行函式會產生多個記錄項目,且這些項目具有相同的追蹤值。
下一個範例會同時使用工作階段 ID 和追蹤值,將特定 Dialogflow 代理程式錯誤記錄與對應的 Cloud Run 函式 Webhook 記錄項目建立關聯。這個範例會使用Cloud Logging 篩選器,適用於已啟用 Cloud Logging 的代理程式。
1. 篩選特定代理程式的錯誤記錄,只顯示 Dialogflow 記錄
使用下列 Cloud Logging 篩選器,篩選特定代理程式的 Dialogflow 錯誤記錄:
labels.location_id="global"
labels.agent_id="AGENT_ID"
severity=ERROR
Webhook 記錄錯誤項目如下所示:
{
"insertId": "-j4gkkre31e2o",
"jsonPayload": {
"code": 14,
"message": "Error calling webhook 'https://us-central1-PROJECT_ID.cloudfunctions.net/function-webhook': State: URL_UNREACHABLE, Reason: UNREACHABLE_5xx, HTTP status code: 500"
},
"labels": {
"agent_id": "e9e01392-1351-42dc-9b15-b583fb2d2881",
"environment_id": "",
"location_id": "global",
"session_id": "07c899-a86-78b-a77-569625b37"
},
"logName": "projects/PROJECT_ID/logs/dialogflow-runtime.googleapis.com%2Frequests",
"receiveTimestamp": "2024-10-28T21:49:04.288439054Z",
"resource": {
"labels": {
"project_id": "PROJECT_ID"
},
"type": "global",
},
"severity": "ERROR",
"timestamp": "2024-10-28T21:49:04.132548Z"
}
請注意包含工作階段 ID 的 labels.session_id
欄位。
您會在下一個步驟中使用工作階段 ID。
2. 依工作階段 ID 篩選 Cloud Run functions 記錄
使用下列 Cloud Logging 篩選器,依工作階段 ID 篩選 Cloud Run 函式記錄:
resource.type = "cloud_run_revision"
resource.labels.service_name = "CLOUD_RUN_FUNCTION_NAME"
resource.labels.location = "CLOUD_RUN_FUNCTION_REGION"
textPayload="Debug Node: session ID = SESSION_ID"
產生的記錄檔會對應到所提供工作階段期間的 Webhook 記錄檔。例如:
{
"insertId": "671c42940007ebebdbb1d56e",
"labels": {
"execution_id": "pgy8jvvblovs",
"goog-managed-by": "cloudfunctions",
"instance_id": "004940b3b8e3d975a4b11a4ed7d1ded4ce3ed37467ffc5e2a8f13a1908db928f8200b01cc554a5eda66ffc9d23d76dd75cec1619a07cb5751fa2e8a93bc6cfc3df86dfa0650a"
},
"logName": "projects/PROJECT_ID/logs/run.googleapis.com%2Fstdout",
"receiveTimestamp": "2024-10-26T01:15:00.523313187Z",
"resource": {
"labels": {
"configuration_name": "function-webhook",
"location": "us-central1",
"project_id": "PROJECT_ID",
"revision_name": "function-webhook-00001-jiv",
"service_name": "function-webhook",
},
"type": "cloud_run_revision"
},
"spanId": "6938366936362981595",
"trace": "d1b54fbc8945dd59bdcaed37d7d5e185",
"textPayload": "Debug Node: session ID = 07c899-a86-78b-a77-569625b37",
"timestamp": "2024-10-26T01:15:00.519147Z"
}
請記下 trace
欄位,下一個步驟會用到。
3. 篩選特定追蹤記錄的 Cloud Functions 記錄
使用下列 Cloud Logging 篩選器,篩選特定追蹤記錄的 Cloud Functions 記錄:
resource.type = "cloud_run_revision"
resource.labels.service_name = "CLOUD_RUN_FUNCTION_NAME"
resource.labels.location = "CLOUD_RUN_FUNCTION_REGION"
trace="projects/PROJECT_ID/traces/TRACE_ID"
其中 TRACE_ID
是追蹤記錄的最後一個區段。舉例來說,projects/PROJECT_ID/traces/e41eefc1fac48665b442bfa400cc2f5e
的 TRACE_ID
為 e41eefc1fac48665b442bfa400cc2f5e
。
結果是執行與步驟 1 中的工作階段 ID 相關聯的 Webhook 要求,以及步驟 2 中的追蹤記錄時產生的 Webhook 伺服器記錄。記錄檔內容如下所示。
{
"insertId": "671c42940008465e29f5faf0",
"httpRequest": {
"requestMethod": "POST",
"requestUrl": "https://us-central1-TEST_PROJECT.cloudfunctions.net/function-webhook",
"requestSize": "2410",
"status": 200,
"responseSize": "263",
"userAgent": "Google-Dialogflow",
"remoteIp": "8.34.210.1",
"serverIp": "216.239.36.1",
"latency": "0.166482342s",
"protocol": "HTTP/1.1"
},
"resource": {
"type": "cloud_run_revision",
"labels": {
"project_id": "PROJECT_ID",
"service_name": "function-webhook",
"location": "us-central1",
"revision_name": "function-webhook-00001-jiv",
"configuration_name": "function-webhook"
}
},
"timestamp": "2024-10-26T01:15:00.352197Z",
"severity": "INFO",
"labels": {
"instanceId": "004940b3b813af8a656c92aac1bd07ffad5165f1353e1e346b6161c14bcde225f68f4a88ceedc08aa9020f387b1b59471f73de45f2882a710ced37dea921f05ad962347690be",
"goog-managed-by": "cloudfunctions"
},
"logName": "projects/test-project-12837/logs/run.googleapis.com%2Frequests",
"trace": "projects/test-project-12837/traces/d1b54fbc8945dd59bdcaed37d7d5e185",
"receiveTimestamp": "2024-10-26T01:15:00.548931586Z",
"spanId": "604a07f7b33b18db",
"traceSampled": true
}