如果加工規則中涉及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 ..." }