Function Compute を使用してログデータを処理する場合、Log Service が提供する関数テンプレートを使用するか、独自のカスタム関数を使用できます。このトピックでは、カスタム関数の構築方法について説明します。
関数イベント
Function Compute を使用してログデータを処理する場合、ステップ 2 で関数のエントリパラメーター (関数イベント) を設定する必要があります。イベントはシリアル化された JSON 文字列です。
-
パラメーター
パラメーター
説明
jobName
Log Service ETL ジョブの名前。Function Compute の各 Log Service トリガーは、Log Service の ETL ジョブに対応しています。
taskId
ETL ジョブの場合、
taskIdは特定の関数呼び出しを一意に識別します。cursorTime
現在の関数呼び出しにおける最後のログレコードが Log Service サーバーに到着したときの UNIX タイムスタンプ。
source
このフィールドは Log Service によって生成されます。Log Service は、ETL ジョブで定義されたタスク間隔に基づいて、関数実行を定期的にトリガーします。
sourceフィールドは関数イベントの重要なコンポーネントであり、現在の関数呼び出しの消費範囲を定義します。-
endpoint: プロジェクトが配置されているリージョンのエンドポイント。詳細については、「エンドポイント」をご参照ください。
-
projectName: プロジェクトの名前。
-
logstoreName: Logstore の名前。
-
shardId: Logstore 内の特定のシャード。
-
beginCursor: シャード内のデータ消費の開始位置。
-
endCursor: シャード内のデータ消費の終了位置。
説明データ範囲
[beginCursor, endCursor)はbeginCursorを含み、endCursorを含まないことを意味します。
parameter
トリガーを作成する際に、[関数の設定] セクションで設定する JSON オブジェクトです。カスタム Log Service ETL 関数は、このフィールドをランタイムに解析して、必須パラメーターを取得できます。詳細については、「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 }関数をデバッグする場合、GetCursorByTime 操作を呼び出してカーソルを取得し、上記の例に基づいてテスト用の関数イベントを構築できます。
関数開発
Java、Python、Node.js など、さまざまな言語で関数を開発できます。Log Service は、統合を簡素化するために対応するランタイム用の SDK を提供しています。詳細については、「SDK リファレンス」をご参照ください。
次のセクションでは、Java 8 ランタイムを使用して Log Service ETL 関数の開発方法を実証します。Java 8 で関数をプログラミングする方法の詳細については、Function Compute Java プログラミングガイドをご参照ください。
-
Java 関数テンプレート
Log Service は、Java 8 ランタイムに基づいたカスタムデータテンプレートを提供しています。このテンプレートを要件に合わせて適応させることができます。
このテンプレートは以下の特徴を実装しています。
-
関数イベントから
source、taskId、およびjobNameフィールドを解析します。 -
Log Service Java SDK を使用してソースからデータを取得し、
processDataインターフェイスを呼び出して各データバッチを処理します。
テンプレートでは以下を実装する必要があります。
-
関数イベントから
parameterフィールドを解析します。このロジックはUserDefinedFunctionParameter.javaに実装します。 -
UserDefinedFunction.javaのprocessDataインターフェイスにデータ処理ロジックを実装します。 -
UserDefinedFunctionを関数の説明的な名前に置換します。
-
-
processData インターフェイスの実装
processDataインターフェイス内で、データのバッチを消費、変換、配信できます。たとえば、LogStoreReplication サンプルは、ある Logstore からデータを読み取り、別の Logstore に書き込みます。説明-
processDataがデータを正常に処理した場合、trueを返します。リトライ不可のエラーが発生した場合、falseを返します。後者の場合、関数は実行を継続し、Log Service は ETL タスクを成功と見なしますが、未処理データを無視します。 -
致命的なエラーが発生した場合、またはビジネスロジックが早期終了を必要とする場合、例外をスローして関数を終了します。Log Service は関数の失敗を検出し、ETL ジョブのリトライポリシーに従って関数を再呼び出しします。
-
シャードが高いスループットを持つ場合、Out-of-Memory (OOM) エラーによる予期せぬ終了を防止するために、関数に十分なメモリサイズを設定します。
-
関数が時間のかかる操作を実行する場合、またはシャードが高いスループットを持つ場合、短い関数トリガー間隔と長い関数実行タイムアウトを設定します。
-
関数に必要な権限を付与します。たとえば、関数が OSS にデータを書き込む必要がある場合、OSS 書き込み権限が必要です。
-
ETL ログ
-
ETL スケジューリングログ
スケジューリングログは、ETL ジョブの開始時刻、終了時刻、成功ステータス、および成功時に返される情報を記録します。ETL ジョブが失敗した場合、エラーログが生成され、システム管理者にアラートが送信されます。トリガーを作成する際、ログ用の Logstore を指定し、その Logstore のインデックスを有効にして設定します。詳細については、「インデックスを作成」をご参照ください。
関数は実行統計を返すことができます。たとえば、Java 8 ランタイム関数では、統計を
outputStreamに書き込むことができます。Log Service が提供する関数テンプレートは、シリアル化された JSON オブジェクトを文字列として書き込みます。この文字列は ETL スケジューリングログに記録され、統計分析やクエリを可能にします。 -
ETL プロセスログ
これらのログは、ETL 実行中の各ステップにおける主要なチェックポイントとエラー情報 (ステップの開始時刻と終了時刻、初期化ステータス、モジュールエラーなど) を記録します。プロセスログは、ETL ジョブのランタイムステータスをモニターし、エラーを迅速に診断するのに役立ちます。
context.getLogger()を使用してプロセスログを書き込み、Log Service プロジェクト内の指定された Logstore に保存します。この Logstore に対してインデックスベースのクエリを有効にすることを推奨します。