Function Computeを使用してログデータを消費する場合、log Serviceが提供する関数テンプレートまたはカスタム関数を使用してデータを消費できます。 このトピックでは、カスタム関数を作成する方法について説明します。
Event
関数のイベントは、JSONオブジェクトからシリアル化された文字列です。 イベントには、関数の実行に使用されるパラメータが含まれます。 詳細については、「Function Computeを使用したログデータの消費」をご参照ください。
パラメーター
パラメーター
説明
jobName
Log Serviceの抽出、変換、読み込み (ETL) ジョブの名前。 Log ServiceのETLジョブは、Function Computeのトリガーとして使用されます。
taskId
ETLジョブの関数呼び出しの識別子。
cursorTime
関数呼び出しでlog Serviceが最後に受信したログエントリのUNIXタイムスタンプ。
ソース
関数呼び出しで使用できるデータの範囲。 このパラメーターの値は、関数呼び出しごとにLog Serviceによって定期的に生成されます。
endpoint: プロジェクトが存在するリージョンのエンドポイント。 詳細については、「エンドポイント」をご参照ください。
projectName: プロジェクトの名前。
logstoreName: Logstoreの名前。
shardId: Logstore内のシャードのID。
begin Cursor: 指定されたシャード内のデータの消費を開始する位置。
endCursor: 指定されたシャード内のデータの消費をFunction Computeが停止する位置。
説明消費間隔は、[begin Cursor,endCursor) の形式で、左閉じ、右開きです。
パラメーター
トリガーを作成するために指定する [関数の設定] パラメーターの値。 値はJSONオブジェクトです。 カスタムETL関数が呼び出されると、このフィールドが解析されます。 詳細については、「Simple Log Serviceトリガー」をご参照ください。
例:
{ "source": { "endpoint": "http://cn-shanghai-intranet.log.aliyuncs.com", "projectName": "fc-****************", "logstoreName": "demo", "shardId": 0, "beginCursor": "MTUwNTM5MDI3NTY1ODcwNzU2Ng==", "endCursor": "MTUwNTM5MDI3NTY1ODcwNzU2OA==" }, "parameter": { ... }, "jobName": "fedad35f51a2a97b466da57fd71f315f539d2234", "taskId": "9bc06c96-e364-4f41-85eb-b6e579214ae4", "cursorTime": 1511429883 }
カスタム関数をデバッグする場合は、GetCursor操作を呼び出してカーソルを取得できます。 次に、前述の形式でイベントを作成して、関数をデバッグできます。
関数の開発
Log Serviceは、Java、Python、Node.jsなどのさまざまなプログラミング言語でランタイム環境SDKを提供します。 SDKを使用して、カスタム関数を開発できます。 詳細については、「SDK リファレンス」をご参照ください。
次の例では、Java Runtime Environment 8 (JRE 8) を使用して、Log ServiceのETL関数を開発する方法を説明します。 JRE 8で関数を開発する方法の詳細については、 Function ComputeのJavaプログラミングガイド
Java関数テンプレート
Log Serviceは、JRE 8に基づくカスタム関数テンプレートを提供します。 テンプレートを使用して関数を開発できます。 詳細については、「カスタム関数テンプレート」をご参照ください。
関数テンプレートには、次の機能があります。
イベントのsource、taskId、およびjobNameフィールドを解析します。
Log Service SDK for Javaを使用してイベントのソースパラメーターに基づいてデータを取得し、processDataメソッドを呼び出してデータを処理します。 詳細については、「Log Service SDK For Java」をご参照ください。
テンプレートを使用して、次の操作を実行することもできます。
UserDefinedFunctionParameter.java
ファイルを使用して、イベントのパラメーターフィールドを解析します。UserDefinedFunction.java
ファイルのprocessDataメソッドを使用して、ビジネスロジックを定義します。UserDefinedFunction
を、ETL関数の識別に役立つ名前に置き換えます。
processDataメソッド
processDataメソッドを使用して、データを消費、変換、および送信できます。 たとえば、LogstoreReplication.javaファイルでは、このメソッドを使用して、Logstoreからデータを読み取り、そのデータを別のLogstoreに書き込みます。
説明processDataメソッドを使用してデータを処理した場合は、trueが返されます。 processDataメソッドを使用してデータの処理に失敗した場合、falseが返されます。 falseが返された場合、ETL関数は引き続き実行され、Log ServiceはETLタスクが成功したと判断します。 例外データは無視されます。
throw exceptionメソッドを使用して重大なエラーまたはロジック例外が返された場合、ETL関数は実行を停止します。 この場合、Log ServiceはETL関数で例外が発生したと見なし、対応するETLジョブで設定されたルールに基づいて関数を呼び出します。
シャードへのデータの書き込みまたは読み取りを高速に行う場合は、関数を実行するのに十分なメモリリソースを割り当てます。 このようにして、関数の実行中にメモリ不足 (OOM) エラーが発生することはありません。
関数の実行に時間がかかる場合や、シャードへのデータの書き込みや読み取りが高速な場合は、関数の呼び出し間隔を短くし、タイムアウト時間を長くします。
Function Computeに必要な権限を付与します。 たとえば、Function ComputeがObject Storage Service (OSS) にデータを書き込む必要がある場合、Function ComputeにOSSの書き込み権限を付与する必要があります。
ETL ログ
ETL スケジューリングログ
ETL スケジューリングログには、ETL タスクの開始時刻と終了時刻、タスクが成功したかどうか、およびタスクが成功したときに返される情報が記録されます。 エラーが発生すると、ETLエラーログエントリが生成され、システム管理者に通知するために電子メールまたはテキストメッセージが送信されます。 トリガーを作成するときは、トリガーログを保存するLogstoreを指定し、インデックス作成機能を有効にして、Logstoreのインデックスを設定します。 詳細については、「インデックスの作成」をご参照ください。
関数を使用して、ETL関数の実行結果を取得できます。 たとえば、
outputStream
関数を使用して、JRE 8に基づくETL関数の実行結果を取得できます。 Log Serviceの関数テンプレートに基づいて開発されたETL関数の実行結果は、JSONオブジェクトからシリアル化された文字列です。 この文字列はETLスケジューリングログに記録されます。 文字列を検索して分析できます。ETL処理ログ
ETL処理ログには、各実行ステップの重要な情報とエラーが記録されます。 ログには、各ステップの開始時刻、終了時刻、初期化ステータス、およびエラーが記録されます。 ETL関数の実行を監視し、できるだけ早い機会に処理ログに基づいてエラーを特定できます。
context.getLogger()
メソッドを使用して、ETL処理ログを記録し、指定したプロジェクトのLogstoreにログを保存できます。 Logstoreのインデックス作成機能を有効にすることを推奨します。