本文檔為您介紹資料加工規則錯誤的原因以及排查處理方法。
讀取源Logstore資料成功後,加工引擎開始對源Logstore的日誌事件進行加工。
該環節產生錯誤主要是由於在資料加工過程中,全部或者部分日誌事件不適配加工規則,從而引發的邏輯錯誤。
如果加工規則中涉及RDS、Logstore等外聯資源的載入,則也有可能會產生資源的載入或重新整理錯誤。
本文檔主要介紹邏輯錯誤排查方法,資源載入錯誤的排查方法請參見資源載入錯誤。
錯誤影響
在日誌事件加工階段,與加工規則衝突的日誌事件會引發報錯,錯誤分成WARNING和ERROR層級(通過加工日誌的logging.levelname體現)。
對於ERROR層級的錯誤, 該日誌事件會丟棄。加工後的輸出結果中將不包含這些日誌事件,並繼續加工其他的日誌事件,不會重試。
對於WARNING層級的錯誤(例如某些事件與正則規則不匹配),會跳過當前DSL的這一步,進行下一步。
錯誤排查方法
查看錯誤記錄檔的
logging.levelname
欄位,確定日誌的錯誤層級。查看錯誤記錄檔的
message
欄位,定位是哪些日誌事件報錯。具體請參見錯誤記錄檔查看方式。查看錯誤記錄檔的
reason
欄位,確定這些日誌事件的報錯原因。
根據報錯原因,為這些異常日誌事件增添邏輯,可使用e_if
、e_switch
等流程式控制制函數,捕獲並處理這些錯誤。
常見錯誤排查
日誌事件中存在異常值
除數為0
#部分日誌事件欄位b的值為0,引發除數為0的錯誤
e_set("c", op_div_floor(v("a"), v("b")))
錯誤記錄檔:
{ "reason": "error when calling : floordiv\nDetail: integer division or modulo by zero", }
排查方法:
檢查報錯的日誌事件,確認它們的欄位
b
的值是否為0。如果是,此處則是由除數為0引發的錯誤。解決方案:
只有日誌事件的欄位
b
為0時才會報錯。因此可以增添e_if
邏輯來捕獲b
的欄位值為0的異常情況。e_if_else(op_eq(v("b"), "0"), e_set("c", v("a")), e_set("c", op_div_floor(v("a"), v("b")))
不合法的時間戳記格式
#部分日誌事件的欄位a的值不是合法的時間戳記格式,引發報錯
e_set("b", dt_fromtimestamp(v("a")))
錯誤記錄檔:
{ "reason": "error when calling : int\nDetail: invalid literal for int() with base 10: '異常值'", }
排查方法:
檢查報錯的日誌事件,查看欄位
a
的值是否為合法的時間戳記格式(數值型字串)。解決方案:
增加判斷邏輯,如果欄位
a
的值不是合法的時間戳記格式,則將這條日誌事件輸出到target2
中。e_if_else(str_isdigit(v("a"))),e_set("b", dt_fromtimestamp(v("a"))), e_output("target2"))
數值運算前未進行資料類型轉換
加工規則範例:
e_set("a", 10)
e_set("b", 10)
e_set("c", op_mul(v("a"), v("b")))
錯誤記錄檔:
{ "reason": "error when calling : mul\nDetail: can't mulltiply sequence by non-int of type' str'", }
原因分析:
LOG DSL處理過程中,日誌事件中的各個欄位值都是以字串形式儲存。上述規則範例中,
v("a")
和v("b")
都是字串類型,直接傳遞給op_mul
會引發報錯。排查方法:
檢查LOG DSL規則,是否在做數值計算前未進行資料類型轉換。
解決方案:
使用
ct_int
函數進行資料類型轉換,將字串型轉化為整型後,再傳遞給op_mul
函數。e_set("a", 10) e_set("b", 10) e_set("c", op_mul(c_int(v("a")), c_int(v("b"))))