前のトピック: ビジネス ロジックの内部

次のトピック: 登録

イベント フロー

前述のように、ビジネス ロジックに対する入力は、エンジン イベントと Raw データ イベントです。

ビジネス ロジックによって受信された Raw データ イベントは、登録関数によって決定されます。この関数内でコードは、イベント タイプおよびリソース識別子によって定義されている、Raw データ イベントの特別なセットを要求します。

ビジネス ロジックにおける登録では、イベントが受信されたときに Raw データ イベントを処理するために実行する、ユーザ定義サブルーチンも関連付けます。 (デフォルトでは OnXXXEvent という名前ですが、これはもっとわかりやすい名前に変更する必要があります)。

エンジン イベントは、関連する契約およびメトリックの定義に従って、エンジンによってトリガされます。 エンジン イベントがトリガされ、受信されると、エンジンは適切なイベント ハンドラを実行します。 それぞれのエンジン イベントには、暗黙的なイベント ハンドラが 1 つあります。 これらのイベント ハンドラは VBScript の先頭に定義されている関数とプロシージャです。 登録および「結果」関数を処理するイベント ハンドラは、コード内で実装するために両方とも必須です。 他のすべてのイベント ハンドラは任意です。 ただしビジネス ロジックは、イベント ハンドラが実装されないエンジン イベントは処理しません。 そのため、将来的に拡張できるように、(使用されなくても)それらのものを同じ場所に残しておくのは良い方法です。

注: ビジネス ロジック スクリプトを記述する場合には、すべてのエンジン イベントを実装して、考えられるすべての可能性を網羅できるようにすることが重要です。 たとえば、実装の最初の段階でタイムスロットの定義が必要でなかったとしても、将来的に必要になった場合には、すべての計算式を修正する必要があります。 このため、ビジネス ロジック エキスパートは、最初は必要でなくても後でこの動作が必要になった場合に、必要なシステム変更が少量で済むように、"in timeslot" と "out of timeslot" の期間の動作を詳細に定義しておくことをお勧めします。

以下に、さまざまなエンジン イベントとそのイベント ハンドラを示します。

イベント フロー

単一のビジネス ロジック計算式を処理するための、計算メカニズム(PslWriter サービス)の後の手順は以下のとおりです。

エンジンはそれぞれの計算サイクルで、計算期間に基づいて、エンジン イベントおよび Raw データ イベントは何かを評価します。 この評価は最初、時間で並べ替えられ、次に、計算のために計算式へ送信されます。 Raw データ イベントの時間はそのイベントのタイムスタンプで、エンジン イベントの時間はそれがトリガされた時間です。 これらの 2 つのタイプのイベントは時系列に組み合わされ、計算用に送信されます。

イベントのタイミングは関連付けられているローカル メトリックによって決まりますが、イベント ハンドラの Time パラメータ(OnPeriodStart (Time) など)、および Raw データ イベントのタイムスタンプは UTC の値に従っています。 エンジンは、参照で一定のポイントを使用できるように、UTC におけるそれぞれの値に従って比較を行います。

あるメトリックで、UTC とのタイム ゾーンの差が 2 時間(つまり GMT+2)の場合、インシデントの開始イベントのタイムスタンプが午前 10 時で、エンジンの中でイベント ハンドラが使用するタイムスタンプは適宜シフトされ、実際には 8:00am UTC に開始される、ということがあります。 アダプタがこれと同じタイム ゾーンを使用するよう設定されているとすると、Raw データ イベントも、データベース内で UTC に合わせて 2 時間前に戻されます。 イベントがビジネス ロジックに渡されるとき、午前 10 時に始まる期間についてイベントの計算を行う計算エージェントは、実際にはそのイベントに対して UTC 時間を使用します(これは午前 8 時です)。 ただし、タイムスタンプを印刷するためにコード内で out.log メッセージを使用している場合は、(メトリックに従って)指定された期間が 10am であっても、UTC にシフトしたタイムスタンプ、つまり 8:00 AM が表示されます。

以下の計算の要件では、使用する前にイベントのタイムスタンプを変換することが重要です。

メトリックが、開始と終了が同じ日付であるようなインシデントの数を計算する場合、それぞれのインシデントの開始時間と終了時間を比較する必要があります。 インシデントの開始時間と終了時間が同じ日(および定義されているタイムスロット内の範囲内)になる場合、このインシデントはカウントされます。

インシデントを、元のローカル時間から UTC にシフトしている途中で、日付が変わってしまう(つまりもう一度 GMT+2 を使用する)ことがあります。 午前 1 時に開始されたインシデントは、UTC では前日の午後 11 時にシフトされます。このようなインシデントは、(シフト前はカウントの対象であっても)カウントされません。 これは、最初に時間をローカル メトリックの時間に戻して変換し、その後で単純に比較しなければならない場合です。 このような場合には、GetLocaleTime(utcTime) メソッドを使用します。 このメソッドは、UTC タイム ゾーンで指定された時間を、ローカル メトリックのタイム ゾーンに変換します。

イベント ハンドラのコードは以下のとおりです。
Sub OnIncidentEvent(eventDetails)
   If dateDiff("d",Tools.GetLocaleTime(eventDetails.time),_
     Tools.GetLocaleTime(eventDetails("ClosedAt)))=0 then
          CountIncidents=CountIncidents+1
   End If
End Sub