本ページでは、データ変換ルールのエラーの原因とトラブルシューティング方法について説明します。

ソースログストアからデータを読み取った後、データ変換エンジンは、ソースログストアのログイベントの変換を開始します。 データ変換ルールのエラー
  • このプロセス中に、変換ルールがすべてまたは一部のログイベントに適用されず、論理エラーが発生する場合があります。
  • 変換ルールに ApsaraDB for Relational Database Service (RDS) インスタンスやログストアなどの外部リソースからのデータの読み込みが含まれる場合、データの読み込みまたは更新でエラーが発生する場合もあります。

本ページでは、論理エラーのトラブルシューティング方法について説明します。 リソースの読み込みエラーのトラブルシューティング方法の詳細については、次のドキュメントをご参照ください。 データプルエラーを修正するには

エラーの影響

  • ログイベントの変換中、変換ルールと競合するログイベントはエラーとなり、破棄されます。 このため、変換結果にはこれらのログイベントは含まれません。
  • 変換タスクは、変換ルールと競合するログイベントを再変換せずに破棄し、他のログイベントの変換を続行します。
  • 複数のイベントが 1 つのイベントから分割される場合、エラーのためにイベントの 1 つが破棄されると、このイベントと同じソースイベントから分割された他のすべてのイベントも破棄されます。
    結果が返される前に、イベントはツリー構造に基づいて互いに関連付けられており、互いに独立していません。

トラブルシューティング方法

  • エラーログの message フィールドを確認して、エラーのあるログイベントを見つけます。 詳細については、「エラーログの表示」をご参照ください。
  • エラーログの reason フィールドを確認して、これらのログイベントのエラーの原因を特定します。
原因に基づいて、エラーのあるログイベントを変換するロジックを追加します。 e_if および e_switch などのプロセス制御関数を使用して、エラーをキャプチャして処理することができます。 変換ルールエラーに関するログ

一般的なエラーとトラブルシューティング方法

  • ログイベントに異常な値が含まれている場合。
    変換ルールのサンプル 1:
    # The value of field b in some log events is 0, causing the error of division by 0.
    e_set("c", op_div_floor(v("a"), v("b")))
    • Error log:
      {
        "reason": "error when calling : floordiv\nDetail: integer division or modulo by zero", 
      }
    • トラブルシューティング方法:

      エラーのあるログイベントのフィールド b の値が 0 でないかどうかを確認します。 0 だった場合、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 field a in some log events is an invalid timestamp, causing an error.
    e_set("b", dt_fromtimestamp(v("a")))
    • Error log:
      {
        "reason": "error when calling : int\nDetail: invalid literal for int() with base 10: 'abnormal value'", 
      }
    • トラブルシューティング方法:

      エラーのあるログイベントのフィールド a が有効なタイムスタンプ (数値文字列) であるかどうかを確認します。

    • ソリューション:
      ログイベントのフィールド a の値が有効なタイムスタンプかどうかをチェックするロジックを追加します。 有効でない場合は、ログイベントを対象の Logstore 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")))
    • Error log:
      {
        "reason": "error when calling : mul\nDetail: can't mulltiply sequence by non-int of type' str'", 
      }
    • エラーの原因 :

      LOG ドメイン特化言語 (DSL) の処理ロジックでは、ログイベントのすべてのフィールドの値が文字列として格納されます。 上記の変換ルールサンプルでは、v("a") および v("b") の値は文字列です。 それらが直接 op_mul 関数に渡されるとエラーが返されます。

    • トラブルシューティング方法:

      LOG 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"))))