本文檔為您介紹加工引擎啟動錯誤的原因以及排查處理方法。
資料加工任務的第一個環節便是啟動加工引擎。該環節產生錯誤主要是由於在啟動加工引擎過程時,檢測到您編寫的SLS DSL規則存在錯誤,導致加工引擎內部的安全性稽核不通過。
錯誤記錄檔
在加工引擎啟動過程中,如果檢測到您編寫的SLS DSL規則存在錯誤,會報如下形式的錯誤。
{
"errorMessage": "ETL config doesn't pass security check, detail: XXXXXX"
}
錯誤記錄檔可以在資料加工診斷報表的異常詳情中或者internal-etl-log Logstore中查看。
在加工引擎啟動階段產生錯誤時,加工任務會一直重試,直到重試成功或被手動停止。
修改加工規則後,加工任務重試成功,繼續正常工作,不會產生日誌的丟失或冗餘。
常見錯誤排查
基本語法錯誤。
您編寫了不符合SLS DSL文法的加工規則,例如:多或者少括弧、逗號(,)寫成冒號(:)等。
錯誤記錄檔
{ "errorMessage": "ETL config doesn't pass security check, detail: invalid syntax" } { "errorMessage": "ETL config doesn't pass security check, detail: unexpected EOF while parsing" } ...
排查方法
根據錯誤記錄檔中的
traceback
資訊定位具體的語法錯誤位置。例如:將e_set("test", v("status"))
錯寫成e_set("test": v("status"))
,如下圖所示。
非法使用運算子。
SLS DSL中所有的操作都需要通過SLS DSL提供的函數來完成。數值運算、大小比較等操作都需要通過op_*函數完成,而不能直接使用運算子。
錯誤記錄檔
{ "errorMessage": "ETL config doesn't pass security check, detail: invalid type detected: <class `_ast.BinOp`> " }
排查方法
檢查SLS DSL規則,確保所有的操作例如運算、大小比較等都是通過SLS DSL提供的函數完成的。
樣本
e_set("b", v("a") - 10) # 錯誤樣本 e_set("b", op_sub(v("a"), 10)) # 正確樣本 e_set("b", v("a") >= v("c")) # 錯誤樣本 e_set("b", op_ge(v("a"), v("c"))) # 正確樣本
函數參數類型傳遞錯誤或調用不存在的函數。
如果傳遞給函數的參數類型和函數接收的參數類型不一致,或者調用了不存在的函數,會產生錯誤。
錯誤記錄檔
{ "errorMessage": "ETL config doesn't pass security check, detail: invalid call in detected: function_name" }
排查方法
首先檢查對應的函數是否存在,函數名是否拼字錯誤等。如果函數存在且名稱正確,則檢查函數的參數類型是否傳遞正確。
根據錯誤記錄檔中的
traceback
資訊定位產生錯誤的函數。例如:定位到dt_totimestamp函數產生錯誤,首先判斷該函數是存在的,接著檢查規則中調用dt_totimestamp函數的地方,是否傳遞了正確類型的參數給該函數。
樣本
dt_totimestamp函數接收的參數類型是日期時間對象,此處
v("time1")
是字串類型,即傳遞了錯誤類型的參數給日期時間函數,引發報錯。您可以使用dt_parse函數將字串轉化為日期時間對象,再傳遞給dt_totimestamp函數。也可以使用dt_parsetimestamp函數代替dt_totimestamp函數,該函數可以接收字串類型。
#錯誤樣本 e_set("time1", "2019-06-03 2:41:26") e_set("time2", dt_totimestamp(v("time1"))) #正確樣本 e_set("time1", "2019-06-03 2:41:26") e_set("time2", dt_totimestamp(dt_parse(v("time1")))) #正確樣本 e_set("time1", "2019-06-03 2:41:26") e_set("time2", dt_parsetimestamp(v("time1")))
在全域操作中調用運算式函數。
SLS DSL文法中提供兩種類型的函數:全域操作函數和運算式函數。只有全域操作函數才能作為加工規則的一個步驟,在全域操作進行調用。如果在全域操作中調用運算式函數,則會產生錯誤。
錯誤記錄檔
{ "errorMessage": "ETL config doesn't pass security check, detail: invalid type detected: <class '_ast.Expr'>" }
排查方法
檢查是否在全域操作調用了運算式函數,作為加工規則的一個步驟。
樣本
#錯誤樣本 op_add(v("a"), v("b")) str_lower(v("name")) #正確樣本 e_set("add", op_add(v("a"), v("b"))) e_set("lower", str_lower(v("name")))
非法使用變數定義賦值。
SLS DSL文法中不支援變數定義賦值,變數值只能通過無狀態方式調用傳遞。
錯誤記錄檔
{ "errorMessage": "ETL config doesn't pass security check, detail: invalid assign detected: variable_name" }
排查方法
檢查SLS DSL規則中是否使用了變數定義賦值。
根據錯誤記錄檔中的
traceback
資訊定位產生錯誤的位置。
樣本
#錯誤樣本 sum_value = op_add(v("a"), v("b")) e_set("sum", sum_value) #正確樣本 e_set("sum", op_add(v("a"), v("b")))