このトピックでは、データ変換ルールに関連するエラーの原因と解決策を説明します。
データ変換エンジンがソースLogstoreからデータを読み取った後、エンジンはLogstoreのログイベントの変換を開始します。
- 変換プロセス中に、変換ルールがすべてのログイベントに適用されない可能性があるため、論理エラーが発生する可能性があります。
- 変換ルールにApsaraDB RDSやLogstoreなどの外部リソースからのデータ読み込みが含まれる場合、データの読み込みまたは更新プロセス中にエラーが発生する可能性もあります。
このトピックでは、ロジックエラーを解決する方法について説明します。 リソースの読み込みエラーを解決する方法については、「データプルエラーを修正するには」をご参照ください。
エラーの影響
変換プロセス中に、変換ルールと競合するログイベントがエラーを引き起こします。 これらのエラーは、警告レベルとエラーレベルに分けられます。 エラーレベルはlogging.levelnameフィールドによって識別されます。
- ERRORレベルのエラーの場合、関連するログイベントは破棄される。変換処理は続行され、再試行は行われない。変換結果には、これらのログイベントは含まれない。
- WARNINGレベルのエラーについては、現在のドメイン固有言語(DSL)でデータが変換されない。たとえば、ログイベントが指定された正規表現と一致しない場合、次のステップが実行されます。
ソリューション
- エラーログの
logging.levelname
フィールドを確認し、エラーレベルを確認します。 message
フィールドをチェックして、エラーログイベントを見つけます。 詳細については、「エラーログを表示する」をご参照ください。- エラーログの
理由
フィールドをチェックして、エラーの原因を特定します。
エラーの原因に基づいてこれらのエラーログイベントを変換するロジックを追加します。
e_if
やe_switch
関数などのプロセス制御関数を使用して、エラーを特定して解決できます。エラー処理の例
- ログイベントに異常な値が含まれている場合。 変換ルールのサンプル 1:
# 一部のログイベントの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
関数で値が で値が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")))
変換ルールのサンプル 2:# 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": "呼び出し時のエラー: int\nDetail: int() のリテラルが無効で、ベース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"))))
- エラーログ: