このトピックでは、データ変換ルールに関連するエラーの原因と解決策について説明します。
データ変換エンジンがソースLogstoreからデータを読み取ると、エンジンはLogstoreのログイベントの変換を開始します。
変換プロセス中に、変換ルールがすべてのログイベントに適用されない可能性があるため、論理エラーが発生する可能性があります。
変換ルールにApsaraDB RDSやLogstoreなどの外部リソースからのデータ読み込みが含まれる場合、データの読み込みまたは更新プロセス中にエラーが発生する可能性もあります。
このトピックでは、ロジックエラーを解決する方法について説明します。 リソースの読み込みエラーを解決する方法については、データプルエラーを修正するにはどうすればよいですか?をご参照ください。
エラーの影響
変換プロセス中に、変換ルールと競合するログイベントがエラーを引き起こします。 これらのエラーは、警告レベルとエラーレベルに分けられます。 エラーレベルはlogging.levelnameフィールドによって識別されます。
エラーレベルのエラーの場合、関連するログイベントは破棄されます。 変換プロセスは継続し、再試行は行われない。 変換結果にはこれらのログイベントは含まれません。
警告レベルのエラーの場合、データは現在のドメイン固有言語 (DSL) に変換されません。 たとえば、ログイベントが指定された正規表現と一致しない場合、次のステップが実行されます。
解決策
エラーログの
logging.levelnameフィールドをチェックして、エラーレベルを確認します。messageフィールドをチェックして、エラーログイベントを見つけます。 詳細については、「エラーログの表示」をご参照ください。エラーログの
理由フィールドをチェックして、エラーの原因を特定します。
エラーの原因に基づいてこれらのエラーログイベントを変換するロジックを追加します。 e_ifやe_switch関数などのプロセス制御関数を使用して、エラーを特定して解決できます。
エラー処理の例
ログイベントに異常な値が含まれる
除算byゼロ
# The value of the b field in some log events is 0. This value is used as a divisor of a numeric operation and causes an error.
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関数を使用して、値が0のbフィールドをキャプチャできます。e_if_else(op_eq(v("b"), "0"), e_set("c", v("a")), e_set("c", op_div_floor(v("a"), v("b")))
無効なタイムスタンプ
# The value of the a field in some log events is an invalid timestamp, which causes an error.
e_set("b", dt_fromtimestamp(v("a")))エラーログ:
{ "reason": "error when calling : int\nDetail: invalid literal for int() with base 10: 'invalid value'", }トラブルシューティング方法 :
フィールドの値が有効なタイムスタンプ (数値文字列)
であるかどうかを確認します。解決策:
フィールドの値が有効なタイムスタンプであるかどうかを確認するロジック
を追加します。 そうでない場合は、ログイベントを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ルールをチェックして、数値演算の前にデータ型が変換されているかどうかを判断します。
解決策:
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"))))