View a markdown version of this page

故障診斷和監控 函數 - AWS Elemental MediaTailor

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

故障診斷和監控 函數

此頁面可協助您診斷常見的函數錯誤,並監控生產中的函數效能。故障診斷區段依症狀進行組織 — 從您觀察到的內容開始,然後遵循原因和修正。

監控

CloudWatch 指標

MediaTailor 會將函數執行的指標發佈至 Amazon CloudWatch。不需要選擇加入。

勾點層級指標 — 每個生命週期勾點執行一個資料點:

指標說明維度
PreSessionInitHook.Invocations勾點執行計數ConfigurationName
PreSessionInitHook.Errors勾點錯誤計數ConfigurationName
PreSessionInitHook.Latency勾點執行時間 (毫秒)ConfigurationName
PreAdsRequestHook.Invocations勾點執行計數ConfigurationName
PreAdsRequestHook.Errors勾點錯誤計數ConfigurationName
PreAdsRequestHook.Latency勾點執行時間 (毫秒)ConfigurationName

函數層級指標 — 每個函數執行一個資料點:

指標說明維度
Function.Invocations函數執行計數ConfigurationName, FunctionId, FunctionType, HookType
Function.Errors函數錯誤計數ConfigurationName, FunctionId, FunctionType, HookType
Function.Latency函數執行時間 (毫秒)ConfigurationName, FunctionId, FunctionType, HookType

如需設定警示和使用這些指標的詳細資訊,請參閱 AWS Elemental MediaTailor 使用 Amazon CloudWatch 指標進行監控

日誌事件

MediaTailor 會發出日誌事件以進行函數執行。預設會發出錯誤事件。已完成和摘要事件為選擇加入。

事件類型預設/選擇加入日誌群組說明
PRE_SESSION_INIT_HOOK_SUMMARY選擇加入資訊清單日誌勾點執行摘要 (成功/錯誤)
PRE_SESSION_INIT_HOOK_ERROR預設資訊清單日誌勾點失敗搭配 errorType 和 原因
PRE_SESSION_INIT_FUNCTION_COMPLETED選擇加入資訊清單日誌個別函數以輸入/輸出完成
PRE_SESSION_INIT_FUNCTION_ERROR預設資訊清單日誌個別函數失敗
PRE_ADS_REQUEST_HOOK_SUMMARY選擇加入ADS 互動日誌勾點執行摘要 (成功/錯誤)
PRE_ADS_REQUEST_HOOK_ERROR預設ADS 互動日誌勾點失敗搭配 errorType 和 原因
PRE_ADS_REQUEST_FUNCTION_COMPLETED選擇加入ADS 互動日誌個別函數以輸入/輸出完成
PRE_ADS_REQUEST_FUNCTION_ERROR預設ADS 互動日誌個別函數失敗

若要啟用選擇加入日誌事件,請參閱 AWS Elemental MediaTailor 使用 Amazon CloudWatch 指標進行監控

使用 eventId 欄位來關聯相同執行的關聯層級和函數層級事件。

下列 Amazon CloudWatch Logs Insights 查詢會依 篩選函數錯誤事件eventId,以追蹤單一執行:

fields @timestamp, eventType, functionId, errorType, cause | filter eventId = "5dc6f040-0f72-4e8c-a64e-25eeef62708c" | sort @timestamp asc

疑難排解

當函數失敗時,MediaTailor 會在錯誤事件中記錄 errorType 欄位。使用此欄位來識別失敗類別:

錯誤類型說明
SYNTAX_ERROR表達式無法編譯或遇到執行時間類型錯誤
RESOURCE_LIMIT_ERROR表達式超過 CPU 時間、記憶體或堆疊深度限制
RESTRICTION_ERROR表達式使用封鎖的函數,或超過輸入承載大小限制
TIMEOUT_ERROR函數執行超過其時間限制
VALIDATION_ERROR輸出路徑以目前勾點範圍內無法寫入的欄位為目標
INTERNAL_ERROR與函數無關的基礎設施故障

項目會依症狀組織,並在適用時參考這些錯誤類型。

運算式意外傳回 null

徵狀:預期填入的輸出值是玩家參數null或遺失。

可能原因:

原因如何識別修正
此生命週期關聯中不存在輸入欄位。 您已在 PRE_SESSION_INITIALIZATION函數adsRequest.url中參考 。工作階段開始時無法使用 ADS 請求資料。 將函數移至PRE_ADS_REQUEST生命週期掛鉤,或使用不同的輸入欄位。請參閱 lifecycle hook
工作階段資料中缺少輸入欄位。 您已參考 player_params.campaign_id,但播放器在工作階段初始化時未傳遞該參數。 $exists() 使用 在存取之前檢查:{%$exists(player_params.campaign_id) ? player_params.campaign_id : 'default'%}
您會將物件或陣列寫入玩家參數或 ADS 請求。 這些命名空間只接受字串、數字和布林值。物件和陣列會篩選掉。 在 中存放複雜資料,temp.*並在後續步驟中擷取字串、數字或布林值。

RESOURCE_LIMIT_ERROR:堆疊溢位

徵狀: 函數失敗,並顯示 errorType: "RESOURCE_LIMIT_ERROR"cause: "Stack overflow error"

原因:表達式超過 100 個層級的最大堆疊深度。這通常發生在深度巢狀條件式 (if/then/else) 表達式或複雜的變數指派。

這表示運算式的巢狀層級過多,MediaTailor 無法處理。

修正:簡化表達式。將複雜邏輯分成多個輸出項目,或在循序執行器中多個步驟。

RESOURCE_LIMIT_ERROR:CPU 逾時

徵狀: 函數失敗,並顯示 errorType: "RESOURCE_LIMIT_ERROR"cause: "Expression evaluation timeout: Check for infinite loop"

原因:表達式超過 100 毫秒 CPU 時間限制。這可能會在大型資料結構上執行昂貴運算的表達式中發生。

修正:降低表達式的複雜性。如果您正在處理大型陣列,請考慮將該邏輯移至外部服務,並使用 HTTP_REQUEST函數呼叫該邏輯。

RESTRICTION_ERROR:不允許函數

徵狀: 函數失敗,並顯示 errorType: "RESTRICTION_ERROR"cause: "Function '<name>' is not allowed"

原因:表達式會呼叫不在 38 個函數允許清單中的 JSONata 函數。常見範例包括 $filter$reduce$split$eval$join

修正:檢查 cause 欄位是否有封鎖的函數名稱。將其取代為允許的替代方案。如需 38 個允許函數的完整清單,JSONata 表達式參考請參閱 。

常用的允許函數包括 $string$number$contains$substring$encodeUrlComponent

RESTRICTION_ERROR:表達式太長

徵狀: 函數無法使用 建立或更新cause: "Expression length <actual> exceeds limit <limit>"

原因:單一表達式超過 1,000 個字元。

修正:將表達式分成較小的部分。使用多個輸出項目,或在循序執行器中的多個步驟中分割邏輯。使用變數繫結 (:=) 以避免重複長子運算式。

HTTP 錯誤:狀態碼為 null

徵狀:HTTP_REQUEST函數的輸出中, response.statusCodenull

原因:無法連線外部 API、連線逾時或發生網路錯誤。發生這種情況時,MediaTailor 會將 response.statusCode設定為 nullresponse.body 設定為 null,並將 response.text設定為 "Internal Error"

修正:一律在存取回應資料response.statusCode之前檢查:

{%response.statusCode = 200 ? response.body.value : 'default'%}

此表達式會檢查 HTTP 呼叫是否傳回 200 狀態碼。如果是這樣,它會使用回應值。否則,它會回到預設值。

如果經常發生這種情況,請檢查外部 API 是否正常運作。RequestTimeoutMilliseconds 如果 API 速度緩慢,請考慮增加,如果您想要快速失敗,請考慮減少。

HTTP 錯誤:回應內文為 null

徵狀: response.statusCode為 200,但 response.bodynull

原因:回應內文不是有效的 JSON 或超過 20,000 個字元。MediaTailor 只會將最多 20,000 個字元的 JSON 回應剖析為 response.body

修正:使用 response.text做為備用。response.text 欄位包含截斷為 20,000 個字元的原始回應內文:

{%response.statusCode = 200 ? ($exists(response.body.id) ? response.body.id : $substring(response.text, 0, 100)) : 'error'%}

如果您需要的資料超過 20,000 個字元的限制,請考慮要求外部 API 傳回較小的回應 (例如,透過請求特定欄位)。

HTTP 錯誤:URL 驗證失敗

徵狀:函數在執行時間失敗,並顯示有關 URL 格式錯誤、使用無效方案或超過長度上限的訊息。

可能原因:

原因修正
URL 不使用 httphttps 確保 URL 表達式產生開頭為 http://或 的 URLhttps://
表達式評估之後,URL 超過 2,048 個字元。 縮短 URL。使用 POST 方法將大型參數值移至請求內文。
URL 格式不正確 (非有效的 URI)。 檢查表達式是否有遺失或額外的字元。$encodeUrlComponent() 用於可能包含特殊字元的查詢參數值。

VALIDATION_ERROR

徵狀: 函數因 而失敗errorType: "VALIDATION_ERROR"。此錯誤可能發生在撰寫時間 (建立或更新函數時) 或執行時間 (函數在工作階段期間執行時)。

可能原因:

原因範例修正
輸出金鑰以目前掛鉤無法寫入的命名空間為目標。 在連接至 的函數adsRequest.url中寫入 PRE_SESSION_INITIALIZATION 檢查生命週期關聯中允許哪些輸出命名空間。 PRE_SESSION_INITIALIZATION只允許 player_params.*。將函數移至正確的勾點或變更輸出索引鍵。請參閱 lifecycle hook
輸出金鑰使用無效的字元。 輸出金鑰,例如 player_params.device type(含空格)。僅允許字母、數字、底線和連字號。 重新命名輸出金鑰以僅使用有效字元。例如,請player_params.device_type改用 。
輸出金鑰的開頭不是有效的字首。 輸出金鑰,例如 custom.myValue而非 player_params.myValuetemp.myValue 使用有效的輸出字首:temp.*player_params.*adsRequest.*
JSONata 表達式有語法錯誤。 缺少關閉引號或不完整的條件:{%session.id & %} 檢閱表達式是否有遺漏的引號、不相符的括號或不支援的運算子,例如 ???:
HTTP_REQUEST 函數中缺少必要欄位。 URL 欄位為空白或未指定方法。 確保已設定 URL 和方法欄位。方法必須是 GETPOST
運算式建立的 URL 無效。 評估的 URL 使用不支援的結構描述,例如 ftp://、超過 2,048 個字元,或格式不正確。 確認 URL 表達式產生有效的 http://https:// URL。$encodeUrlComponent() 用於可能包含特殊字元的查詢參數值。
HTTP 標頭包含無效的字元或使用限制名稱。 標頭值包含換行符號,或標頭名稱為 hosttransfer-encoding 從標頭值移除無效字元。避免受限制的標頭名稱。如需標頭限制HTTP_REQUEST,請參閱 。

檢查錯誤日誌事件中的 cause 欄位 - 它會識別哪個欄位或表達式驗證失敗。

INTERNAL_ERROR

徵狀: 函數因 而失敗errorType: "INTERNAL_ERROR"

原因:發生與函數組態無關的基礎設施故障。

修正:重試請求。如果錯誤仍然存在,請聯絡 AWS Support。