全部產品
Search
文件中心

Simple Log Service:加工引擎啟動錯誤

更新時間:Jul 17, 2024

本文檔為您介紹加工引擎啟動錯誤的原因以及排查處理方法。

資料加工任務的第一個環節便是啟動加工引擎。該環節產生錯誤主要是由於在啟動加工引擎過程時,檢測到您編寫的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")))