數據加工(舊版)常見問題
數據加工任務啟動后,加工結果根據路由規則發送到對應的Logstore。如果加工任務失敗,目標Logstore沒有日志產生或者加工延遲過大等異常,可以根據本文檔步驟進行排查處理。
錯誤分析
當發生錯誤時,分析錯誤在數據加工任務的哪個環節產生,能幫助用戶更高效地定位錯誤位置。
根據加工原理,數據加工任務的主要四個環節如下圖所示。
以上每個環節都可能產生錯誤,其原因、影響和排查方式各不相同。
啟動加工引擎。
該環節產生錯誤主要是由于在啟動加工引擎過程中,檢測到用戶編寫的LOG DSL規則存在錯誤,導致加工引擎內部的安全檢查不通過。
在該階段產生錯誤時,加工任務會停止。用戶需要修改LOG DSL規則并重新啟動加工任務。如果重試成功,加工任務會繼續正常工作,不會產生日志的丟失或冗余。
該環節的錯誤排查方法請參見加工引擎啟動錯誤。
讀取源Logstore數據。
該環節產生錯誤可能是由于源Logstore信息配置錯誤、網絡錯誤、源Logstore信息發生變化等,導致對源Logstore的訪問異常。
該階段產生錯誤時,加工任務會一直重試,直到重試成功或被手動停止。如果重試成功,加工任務會繼續正常工作,不會產生日志的丟失。
如果是已經讀取部分數據后才報錯,則加工服務會保存斷點并一直重試,重試成功后從斷點處繼續讀取,不會有數據的丟失與重復。如果重試過程中停止,不會有數據丟失與重復。
該環節的錯誤排查方法請參見源Logstore讀取錯誤。
加工日志事件。
該環節產生錯誤主要是由于在數據加工過程中,部分或全部日志事件不適配加工規則引發的錯誤。
該階段產生錯誤時,不適配加工規則的日志事件會引發報錯,錯誤分成WARNING和ERROR級別(通過加工日志的logging.levelname體現)。
對于ERROR級別的錯誤,該日志事件會丟棄,加工后的輸出結果中將不包含這些日志事件。
對于WARNING級別的錯誤(例如某些事件與正則規則不匹配),會跳過當前DSL的這一步,進行下一步。
該環節的錯誤排查方法請參見加工規則錯誤。
輸出到目標Logstore。
該環節產生錯誤可能是由于目標Logstore信息配置錯誤、網絡錯誤、目標Logstore信息發生變化等,導致對目標Logstore的訪問異常。
該階段產生錯誤時,加工任務會一直重試,直到重試成功或被手動停止。如果重試成功,加工任務會繼續正常工作,不會產生日志的丟失。
如果是已經輸出部分數據后才報錯,例如配置了兩個目標,一個目標成功,另外一個目標失敗。會保存斷點并一直重試,重試成功后不會有數據的丟失與冗余。但如果這時停止加工任務再重新啟動時,會從斷點繼續加工,不會有數據的丟失,但可能會有數據的冗余。
該環節的錯誤排查方法請參見目標Logstore輸出錯誤的原因和排查方法。
通用錯誤排查
確認目標Logstore是否有數據寫入。
檢查目標Logstore最近是否有數據寫入,正確的方法是通過查看目標Logstore的消費預覽數據。
說明通過Logstore的查詢的方式可能不準確,因為:
數據加工是基于日志接收時間進行加工,可能正在加工歷史日志,當前查詢的時間范圍與日志的寫入時間并不一定一致。
日志服務在寫入歷史日志時的索引可以查詢,但通常會有幾分鐘的延遲。 數據加工如果正在寫入歷史日志,那么查詢界面立刻查詢可能查詢不到。
查看加工任務狀態。
查看源Logstore是否有數據產生。
通過查看加工任務,確認在當前加工任務的時間范圍內,源Logstore是否存在日志。
如果時間配置沒有設置結束時間,檢查源Logstore是否有新日志產生,如果沒有新日志產生,且特定時間范圍內沒有日志而且沒有歷史日志存在,加工任務無法進行。
如果選擇的是歷史時間,確認歷史特定時間范圍內源Logstore是否有日志。
單擊加工任務的修改加工規則,選擇對應的時間范圍來查看是否有原始日志。
查看加工規則是否異常。
檢查加工規則代碼中是否存在異常。例如:
修改了日志的時間,導致在當前時間范圍內查詢不到。
加工規則在特定條件下丟棄了日志。
例如如下代碼,會丟棄所有字段
name
不存在或者為空的日志,而前置邏輯是構建字段name
,如果前置邏輯存在問題,導致字段name
沒有正確構建的話,所有日志都不會產出。# ....前置邏輯. # .... 構建字段name... e_keep(e_search('name: "?"'))
如果存在從第三方拉取數據做富化的邏輯,需要確認是否因為第三方的數據過大,導致數據加工任務正在處于初始化狀態,遲遲未能開始消費數據。例如:
e_dict_map(res_rds_mysql(..database="userinfo", table="user"), "username", ["city", "school", "age"])
單擊加工任務的修改加工規則,選擇對應的時間范圍,并單擊預覽數據來查看結果。
如果能夠重現,可以通過注釋掉特定語句重試預覽進行調試。
確認Shard數量是否符合預期。
如果發現加工速度過慢,可以考慮是否源Logstore與目標Logstore的規劃不符合性能預期,建議調整源Logstore或目標Logstore的Shard數量。
錯誤日志查看方式
錯誤日志可以通過如下方式查看。
通過日志庫
internal-etl-log
查看。加工任務產生的日志會存儲在日志庫
internal-etl-log
中,該Logstore在執行數據加工任務后由系統自動生成。internal-etl-log
屬于專屬Logstore,不收取任何費用,不支持修改其配置,也不支持寫入其他數據。internal-etl-log
中每個日志事件的__topic__
字段顯示了加工任務的狀態,可通過該字段判斷對應的加工任務是否產生了錯誤。具體的錯誤信息通過每個日志事件的
message
和reason
字段查看,如下圖所示。
通過儀表盤查看。
單擊目標加工任務,在數據加工概覽頁面的執行狀態區域查看儀表盤。
具體的錯誤信息在異常詳情的
reason
列,如下圖所示。控制臺查看。
預覽階段的錯誤日志會直接顯示在控制臺。預覽階段只是模擬加工規則的操作,以及預覽預期的加工結果,并不會真的對源Logstore和目標Logstore進行修改,因此預覽階段遇到的各類錯誤都不會對源日志事件產生影響。
預覽限制
預覽階段的數據加工相較于真實的加工任務,會存在限制。
不能發現源Logstore密鑰權限問題。
預覽階段不會創建消費組進行消費,因此不會對消費組權限進行檢查。
不能發現加工規則中輸出目標的名稱錯誤。
預覽階段不會對寫入目標做真正的寫入操作,因此不會檢查配置項中是否配置了相關的輸出目標。
不能發現輸出目標的配置錯誤。
此處配置錯誤包含輸出目標的Project、Logstore、密鑰權限等信息配置錯誤。
預覽階段不會對寫入目標做真正的寫入操作,因此不會檢查輸出目標的配置信息是否正確。
不能完整覆蓋所有數據。
預覽階段默認只從源Logstore中拉取1000條數據進行加工,不會覆蓋所有數據。
如果拉取的1000條數據經過加工后沒有加工結果產生,則會持續拉取數據五分鐘,直到有加工結果產生為止。