如果加工規則中涉及OSS資源的載入,則有可能會產生資源的載入或重新整理錯誤。本文檔主要介紹從OSS擷取資料出錯的原因以及排查處理方法。
在成功讀取源Logstore資料後,加工引擎開始對源Logstore的日誌事件進行加工。如果加工規則中涉及OSS、RDS、Logstore等外聯資源的載入,則也有可能會產生資源的載入或重新整理錯誤。
錯誤影響
在日誌事件加工階段,與加工規則衝突的日誌事件會引發報錯,錯誤分成WARNING和ERROR層級(通過加工日誌的logging.levelname體現)。
對於ERROR層級的錯誤, 該日誌事件會丟棄。加工後的輸出結果中將不包含這些日誌事件,並繼續加工其他的日誌事件,不會重試。
對於WARNING層級的錯誤(例如某些事件與正則規則不匹配),會跳過當前DSL的這一步,進行下一步。
錯誤排查方法
查看錯誤記錄檔的
logging.levelname
欄位,確定日誌的錯誤層級。查看錯誤記錄檔的
message
欄位,定位是哪些日誌事件報錯。具體請參見錯誤記錄檔查看方式。查看錯誤記錄檔的
reason
欄位,確定這些日誌事件的報錯原因。
根據報錯原因,為這些異常日誌事件增添邏輯,可使用e_if
、e_switch
等流程式控制制函數,捕獲並處理這些錯誤。
OSS擷取資料常見出錯範例
下文中AK_ID和AK_KEY為AccessKeyId和AccessKeySecret的簡稱。
檔案路徑錯誤或者檔案格式錯誤
OSS中不存在data這個目錄或者檔案格式寫錯,從而引發的404錯誤記錄檔。
加工規則範例
# 假設正確目錄是test e_set("oss_file",res_oss_file(endpoint, ak_id=res_local("AK_ID"),ak_key=res_local("AK_KEY"), bucket, 'data/test.txt', format='text', change_detect_interval=20)) # 此格式在test中不存在 e_set("oss_file",res_oss_file(endpoint, ak_id=res_local("AK_ID"),ak_key=res_local("AK_KEY"), bucket, 'test/test.dat', format='text', change_detect_interval=20))
錯誤記錄檔
message: Exception: {'status': 404, 'x-oss-request-id': '5D49****878', 'details': {'Code': 'NoSuchKey', 'Message': 'The specified key does not exist.', 'RequestId': '5D4***8878', 'HostId': 'lo***g.oss-cn-hangzhou.aliyuncs.com', 'Key': 'oss/test.txt'}}
排查方法
檢查報錯的日誌事件,如果報錯資訊中
status
是404,並且Messages
是關於檔案的,首先要檢查自己的檔案目錄是否寫錯。解決方案
將
res_oss_file
函數加工編排中的file
參數改成正確的檔案目錄即可。# 假如正確的目錄是test e_set("oss_file",res_oss_file(endpoint, ak_id=res_local("AK_ID"),ak_key=res_local("AK_KEY"), bucket, 'test/test.txt', format='text', change_detect_interval=20))
檔案解碼錯誤
對從OSS上拉取的檔案,解碼的時候執行錯誤或者使用了不存在的解碼方式。
加工規則範例
e_set("oss_file",res_oss_file(endpoint, ak_id=res_local("AK_ID"),ak_key=res_local("AK_KEY"), bucket, 'test/test.txt', format='text', change_detect_interval=20, encoding='unicode'))
錯誤記錄檔
{ "reason": "LookupError: unknown encoding: unicode" }
排查方法
檢查報錯的日誌事件,如果報錯資訊是
unknown encoding: unicode
,檢查檔案解碼參數encoding
是否寫錯。解決方案
將
res_oss_file
函數加工編排中的encoding
參數改成正確的解碼格式即可。# 假如正確的解碼格式是utf8 e_set("oss_file",res_oss_file(endpoint, ak_id=res_local("AK_ID"),ak_key=res_local("AK_KEY"), bucket, 'test/test.txt', format='text', change_detect_interval=20,encoding='utf8'))
Endpoint出錯
使用res_oss_file
函數的時候Endpoint
填寫錯誤。
Endpoint不存在
加工規則範例
e_set("oss_file",res_oss_file("https://oss-cn-asd.aliyuncs.com", ak_id=res_local("AK_ID"),ak_key=res_local("AK_KEY"), 'your bucket', 'test/test.txt', format='text', change_detect_interval=20))
錯誤記錄檔
message: get_oss_bytes get errors:{'status': -2, 'x-oss-request-id': '', 'details': "RequestError: HTTPSConnectionPool(host='log-etl-staging.oss-cn-asd.aliyuncs.com', port=443)
排查方法
檢查報錯的日誌事件,如果報錯資訊是
-2
,並且Message
資訊是關於RequestError
的,檢查endpoint是否存在。解決方案
將
res_oss_file
函數加工編排中的endpoint
參數值修改正確即可。
OSS Endpoint與bucket名字不匹配
授權的AccessKey擁有在杭州region的操作許可權,而Endpoint寫成了上海。
加工規則範例
e_set("oss_file",res_oss_file("https://oss-cn-shanghai.aliyuncs.com", ak_id=res_local("AK_ID"),ak_key=res_local("AK_KEY"), 'your bucket', 'test/test.txt', format='text', change_detect_interval=20))
錯誤記錄檔
message: get_oss_bytes get errors:{'status': 403, 'x-oss-request-id': '5D7219353A90A2852B234D14', 'details': {'Code': 'AccessDenied', 'Message': 'The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.', 'RequestId': '5D7**14', 'HostId': 'log-**.oss-cn-shanghai.aliyuncs.com', 'Bucket': 'log-**', 'Endpoint': 'oss-cn-hangzhou.aliyuncs.com'}}
排查方法
檢查報錯的日誌事件,如果報錯資訊是403,並且
Message
資訊是關於bucket和endpoint的,檢查endpoint
是否與AccessKey不屬於同一region。解決方案
將
res_oss_file
函數加工編排中的encoding
參數改成正確的解碼格式即可。
許可權錯誤
AccessKey出錯
使用res_oss_file
函數的時候AccessKey填寫錯誤。
加工規則範例
e_set("oss_file",res_oss_file(endpoint, ak_id=res_local("AK_ID"),ak_key=res_local("AK_KEY"), 'your bucket', 'test/test.txt', format='text', change_detect_interval=20))
錯誤記錄檔
message: Exception: {'status': 403, 'x-oss-request-id': '5D***BEB6', 'details': {'Code': 'InvalidAccessKeyId', 'Message': 'The OSS Access Key Id you provided does not exist in our records.', 'RequestId': '5D4***BEB6', 'HostId': 'lo***g.oss-cn-hangzhou.aliyuncs.com', 'OSSAccessKeyId': 'LT***Ai'}}
排查方法
檢查報錯的日誌事件,如果報錯資訊是403,並且
Message
資訊是關於AccessKey的,檢查AccessKey是否寫錯。解決方案
將
res_oss_file
函數加工編排中的AccessKey資訊修改正確即可。
Bucket許可權錯誤
使用res_oss_file
函數的時候bucket出錯。
加工規則範例
e_set("oss_file",res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',ak_id=os.getenv("SLS_ACCESS_KEY_ID"), ak_key=os.getenv("SLS_ACCESS_KEY_SECRET"), bucket='log', file='test.txt', change_detect_interval=30, encoding='utf8'))
錯誤記錄檔
message: Exception: {'status': 403, 'x-oss-request-id': '5D674CE8BE0EBC45166026C5', 'details': {'Code': 'AccessDenied', 'Message': 'You have no right to access this object because of bucket acl.', 'RequestId': '5D4***BEB6', 'HostId': 'log.oss-cn-hangzhou.aliyuncs.com'}}
排查方法
解決方案
將
res_oss_file
函數加工編排中的bucket資訊修改正確即可。
Bucket不存在
使用res_oss_file
函數的時候bucket出錯。樣本中bucket在OSS上是不存在的。
加工規則範例
e_set("oss_file",res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',ak_id=os.getenv("SLS_ACCESS_KEY_ID"), ak_key=os.getenv("SLS_ACCESS_KEY_SECRET"), bucket='twiss', file='test.txt', change_detect_interval=30, encoding='utf8'))
錯誤記錄檔
message: Exception: {'status': 404, 'x-oss-request-id': '5D75F6E9BB4097C678A381EF', 'details': {'Code': 'NoSuchBucket', 'Message': 'The specified bucket does not exist.', 'RequestId': '5D75F6E9BB4097C678A381EF', 'HostId': 'twiss.oss-cn-hangzhou.aliyuncs.com', 'BucketName': 'twiss'}}
排查方法
檢查報錯的日誌事件,如果報錯資訊是403,並且
Message
資訊是關於bucket的,檢查bucket是否存在。解決方案
將
res_oss_file
函數加工編排中的bucket資訊修改正確即可。
定時更新檔案出錯日誌說明
此類日誌只會在後台日誌記錄中出現,以下介紹三種定時更新中出錯說明。
如下日誌表示第一次可能因為網路問題擷取資源失敗,準備重試。
{ "reason":"Failed to pull data from oss for the first time and it is preparing to re-pull ..." }
如下日誌表示後台每隔一段時間進行更新,新資源函數擷取資料失敗,準備重試。
{ "reason":"get_oss_byte get errors,begin retry ..." }
如下日誌表示重試失敗,準備再次重試,最多重試三次。
{ "reason":"get_oss_byte get errors,refresh_interval ..." }