このトピックでは、データ変換ルールのエラーの原因と解決策について説明します。
ソース Logstore からデータが読み取られた後、データ変換エンジンがログイベントを変換します。
-
この段階で発生するエラーは、通常、ログイベントがデータ変換ルールと一致しない場合に生じるロジックエラーです。
-
変換ルールに ApsaraDB RDS や他の Logstore などの外部リソースが含まれる場合、リソースの読み込みエラーや更新エラーが発生することもあります。
このトピックでは、ロジックエラーのトラブルシューティングを中心に説明します。リソースの読み込みエラーのトラブルシューティングについては、「リソースの読み込みエラー」をご参照ください。
エラーの影響
エラーログの logging.levelname フィールドは、エラーレベル (WARNING または ERROR) を示します。
-
ERROR レベルのエラーの場合、影響を受けるログイベントは破棄されます。変換の出力にこのイベントは含まれず、処理はリトライなしで次のログイベントに進みます。
-
正規表現の不一致などの WARNING レベルのエラーの場合、該当イベントの現在の DSL ステップはスキップされ、処理は次のステップに進みます。
トラブルシューティング
-
エラーログの
logging.levelnameフィールドを確認し、エラーレベルを判断します。 -
エラーログの
messageフィールドを確認し、どのログイベントがエラーを引き起こしたかを特定します。詳細については、「エラーログの表示」をご参照ください。 -
エラーログの
reasonフィールドを確認し、そのログイベントのエラーの原因を判断します。
原因に基づいて、変換スクリプトにロジックを追加してこれらの例外を処理してください。e_if や e_switch などのプロセス制御関数を使用して、これらのエラーをキャッチして管理できます。以下はエラーログの例です。message フィールドには失敗したログイベントの詳細が含まれ、reason フィールドにはエラーの原因 integer division or modulo by zero が表示されます。
07-26 16:21:48
__source__:
__tag__:__job_name__: etl-preview-1564110081-604324
__tag__:__schedule_type__: DryRun
__topic__: __etl-log-status__
etl_context: {
"project": "ali-licheng-test-uk2",
"logstore": "source_logstore",
"shard_id": "2"}
event_id: transorm_data:process:fail
extra_info_params: {"src_event": {"__time__": "1563266137", "__topic__": "", "__source__": xxx, "__tag__:__client_ip__": xxx,
"__tag__:__receive_time__": "1563774221", "body_bytes_sent": "740", "client_ip": "1.2.3.4", "host": "m.abcd.com", "status": "403"}}
logging: {"process": "34", "levelname": "ERROR", "funcName": "_transform_events_to_logstore", "module": "logclient_operator", "threadName": "MainThread",
"thread": "139890150307648", "processName": "ForkProcess-1"}
message: [ali-licheng-test-uk2/source_logstore/2]transform_data: fail to process event: {"__time__": "1563266137", "__topic__": "", "__source__": xxx,
"__tag__:__client_ip__": xxx, "__tag__:__receive_time__": "1563774221", "body_bytes_sent": "740", "client_ip": "1.2.3.4", "host": "m.abcd.com", "status": "403"},
detail=integer division or modulo by zero
reason: integer division or modulo by zero
一般的なエラーシナリオ
ログイベントの異常値
ゼロ除算
# 一部のログイベントでフィールド 'b' の値が 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 であるかどうかを確認してください。その場合、原因はゼロ除算です。 -
解決策:
このエラーは、ログイベントのフィールド
bの値が 0 の場合にのみ発生します。これを修正するには、フィールドbの値が 0 の場合を処理するe_ifロジックを追加します。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: 'invalid_value'", } -
トラブルシューティング:
失敗したログイベントを確認し、フィールド
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'", } -
原因:
DSL 処理中、ログイベント内のすべてのフィールドの値は文字列として保存されます。前述のルールの例では、
v("a")とv("b")は両方とも文字列です。これらを直接op_mulに渡すとエラーが発生します。 -
トラブルシューティング:
数値計算の前に、DSL ルールでデータ型変換が欠落していないかチェックしてください。
-
解決策:
c_int関数を使用して文字列を整数に変換し、その結果をop_mul関数に渡してください。e_set("a", 10) e_set("b", 10) e_set("c", op_mul(c_int(v("a")), c_int(v("b"))))