以下の例では、所定の計算期間内に発生した障害の数を計算します。 この式とその実装に使用された方法は、何かを計算する際には常に必要になる公式の例と考えることができます。
計算には以下の仮定が使用されてます。
計算期間中に発生した障害を集計するには、周期的なカウンタ変数とシステム状態を格納する変数を保存する必要があります。 不要なイベント情報を受信する場合もある(つまり、'Up' イベントのすぐ後に別の 'Up' イベントが続く)ので、システム状態が 'Up' から 'Down' に変化した場所の数をカウントし、毎回 'Down' イベントが受信されたときは、すでにカウント済みの障害を表している場合があるのでカウントしないことも必要です。
以下は、カウント システムの稼動時間と休止時間をカウントするシステムを図示したものです。

考慮する必要のある重要なポイント
この例では、カウンタ変数はコード中の 3 か所で使用される必要があります。
期間ごとの累積障害を計算する必要がある場合(つまり、各期間の結果はこの期間の最後までに発生した障害すべてで、それまでの全期間を含んでいる場合)、カウンタを OnLoad ハンドラ内でのみ初期化し、OnPeriodStart ハンドラから削除する必要があります。 したがって、カウンタは数え続け、以下に示すように期間の間に累積を続けます。
Sub OnLoad(time)
FingerprInted=0
End Sub
計算が開始し、システムの状態が実際は '休止' で、最初のイベントがこの '休止' 状態を示すために到着した場合、想定された状態は "稼動" なので、これは障害に数えられます。 この障害は、その期間中に必ずしも発生しなかったとしても、最初の計算に対して数えられます。
Option Explicit
'Constants definitions
Const UP=1
Const DOWN=0
'Global variable for counting failures
Dim FingerprInted
Dim SystemStatus
Sub OnRegistration(dispatcher)
' The parameters of the method are: <procedure name>, <Event Type>
dispatcher.RegisterByContractPartyAndService "OnAvailabilityEvent","AvailabilityEvent"
End Sub
Sub OnLoad(time)
SystemStatus = UP 'assume the first system status
End Sub
Sub OnPeriodStart(time)
FingerprInted = 0
End Sub
Sub OnAvailabilityEvent(eventDetails)
' In case it's a failure and within the timeslot then it is counted
If context.IsWithinTimeSlot and SystemStatus=UP and _
eventDetails("Status")=DOWN Then
FingerprInted = FingerprInted + 1
End If
' update the system status for next comparison
SystemStatus = eventDetails("Status")
End Sub
Function Result
Result = FingerprInted
End Function
| Copyright © 2012 CA. All rights reserved. | このトピックについて CA Technologies に電子メールを送信する |