Rubrique précédente: Etude de cas 13 : Traitement du groupe de composant dynamiqueRubrique suivante: Ecriture d'exemples de logique applicative efficaces


Cas d'étude 14 : Traitement de l'horloge d'accumulation de temps

Le modèle de conception décrit dans cette section est adapté lorsque le résultat requis est une fonction d'une période de temps écoulé entre des événements, par exemple :

Afin de cumuler du temps, il est nécessaire d'assigner une variable dans laquelle le temps peut être cumulé (en secondes), et d'implémenter une fonction qui vérifie les conditions et le temps accumulés depuis la dernière mise à jour. Cette fonction est alors exécutée pour tous les événements reçus dans la formule.

L'illustration suivante décrit l'horloge traitant l'accumulation de temps.

La variable LastUpdateTime stocke la date de la dernière mise à jour, peu importe si le compteur de temps était mis à jour. La fonction contient la condition déterminant si le temps doit être mis à jour et cumulé. Par exemple, le temps ne doit pas être considéré si : il dépasse la période d'application, le statut du système était Down, l'incident avait un statut en attente.

Bien que la situation détaillée ici utilise souvent la fonction Tools.NetTime() pour calculer des durées, la fonction VB standard DateDiff() peut être préférable dans certains cas.

La fonction Tools.NetTime engendre des frais généraux dans la vérification de la période d'application chaque fois qu'elle est utilisée. Il est recommandé d'éviter NetTime pour les procédures d'événement de données car celles-ci sont appelées pour tout nouvel événement arrivant, invoquant ainsi l'appel NetTime. Si votre période d'application est 24/7, il vous est recommandé d'utiliser la fonction DateDiff pour éviter les frais généraux lors de la vérification de la période d'application.

Exemple 1 :

La routine de mise à jours des compteurs suivante cumule la période totale de temps dans la variable de PeriodNetTime. La routine AvailabilityTime cumule le temps pendant lequel le statut du système était Up, signifiant que le système était disponible.

L'objet Outils contient la méthode NetTime, NetTime(beginTime, endTime)0. Cette méthode renvoie le nombre de secondes entre beginTime et endTime se trouvant dans la période d'application de la métrique actuelle. Tout temps entre ces deux variables fait partie d'une période d'application exclue, cette procédure est par conséquent très utilisée pour les calculs de durée où une période d'application est utilisée. (Par exemple : pour des tickets de priorité 1 résolus dans les quatre heures ouvertes, bien qu'un ticket envoyé en fin de journée ne sera pas résolu avant le lendemain matin, celui-ci reste dans le SLA à cause de l'exclusion des heures de période d'application.)

Sub UpdateCounters (time)
   PeriodNetTime = PeriodNetTime + tools.NetTime (LastUpdateTime, time)
   If SystemStatus = UP Then
      AvailabilityTime = AvailabilityTime + tools.NetTime (LastUpdateTime, time)
   End If
   LastUpdateTime = time
End sub

Exemple 2 :

L'exemple suivant calcule la disponibilité d'application en gérant les événements Up et Down de plusieurs composants critiques, ainsi que les événements de maintenance de ces composants. Si tous les composants sont sous maintenance, le temps n'est pas considéré comme un temps de disponibilité attendu.

La sous-routine UpdateCounters avance le compteur de temps si nécessaire et est exécutée avec tous les événements reçus dans la formule (événement de données brutes/événement de moteur). Elle met également à jour le temps de disponibilité attendu dans les cas où le temps est dans la période d'application et où les composants ne sont pas dans une période d'indisponibilité planifiée. La formule ne met à jour le temps de disponibilité actuel que lorsqu'elle dispose d'un statut de système Up.

DateDiff est une fonction standard de VB qui renvoie le temps entre deux dates mais n'exclut aucune information de période d'application.

'Force la déclaration de variable
Option Explicit

'Variables globales
Dim ExpectedAvailabilityTime
Dim ActualAvailabilityTime
Dim LastUpdateTime
Dim AvailabilityIndicators
Dim MonitoredComponents
Dim DowntimeStatuses

'Création d'objets Plans
Set AvailabilityIndicators=CreateObject("SlalomMap.Map")
Set MonitoredComponents=CreateObject("SlalomMap.Map")
Set DowntimeStatuses=CreateObject("SlalomMap.Map")

'Après le chargement et chaque fois que survient un changement d'infrastructure
Sub OnRegistration(dispatcher)
   dispatcher.RegisterByResourceGroup "OnComponentDownEvent","Component Down","Application Components"
   dispatcher.RegisterByResourceGroup "OnComponentUpEvent","Component Up","Application Components"
   dispatcher.RegisterByResourceGroup "OnMaintenanceStartEvent","Maintenance Start","Application Components"
   dispatcher.RegisterByResourceGroup "OnMaintenanceEndEvent","Maintenance End","Application Components"
   UpdateCounters Context.RegistrationTime

   Dim AllocatedComponents
   Set AllocatedComponents = Context.ResourcesOfResourceGroup("Application Components")

   's'assure que la formule ne surveille que toutes les ressources pertinentes
   UpdateMonitoredComponents AllocatedComponents
End sub

Sub OnLoad(time)
   'Lorsque le système démarre pour la première fois - part du principe que la disponibilité est OK
   LastUpdateTime = time
End sub

Sub OnPeriodStart(time)
   'initialise les compteurs pour renouveler le calcul périodique
   ExpectedAvailabilityTime = 0
   ActualAvailabilityTime = 0
End sub

Sub OnTimeslotEnter(time)
   UpdateCounters time
End sub

Sub OnTimeslotExit(time)
   UpdateCounters time
End sub

Sub OnComponentDownEvent(eventDetails)
   UpdateCounters eventDetails.Time
   'écrire le statut de disponibilité de la ressource faisant l'objet d'un rapport
   AvailabilityIndicators(eventDetails.ResourceId) = _
      AvailabilityIndicators(eventDetails.ResourceId)+1
End sub

Sub OnComponentUpEvent(eventDetails)
   UpdateCounters eventDetails.Time
   'écrire le statut de disponibilité de la ressource faisant l'objet d'un rapport
   AvailabilityIndicators(eventDetails.ResourceId)= _
      AvailabilityIndicators(eventDetails.ResourceId)-1
End sub

Sub OnMaintenanceStartEvent(eventDetails)
   UpdateCounters eventDetails.Time
   'écrire le statut de disponibilité de la ressource faisant l'objet d'un rapport
   DowntimeStatuses(eventDetails.ResourceId) = _
      DowntimeStatuses(eventDetails.ResourceId)+1
End sub

Sub OnMaintenanceEndEvent(eventDetails)
   UpdateCounters eventDetails.Time
   'écrire le statut de disponibilité de la ressource faisant l'objet d'un rapport
   DowntimeStatuses(eventDetails.ResourceId) = _
      DowntimeStatuses(eventDetails.ResourceId)-1
End sub

Sub OnPeriodEnd(time,isComplete)
   UpdateCounters time
End sub

Function Result
   If ExpectedAvailabilityTime <> 0 Then
      Résultat = 100 * (ActualAvailabilityTime/ExpectedAvailabilityTime)
   Else
      Result = Null
   End If
End Function

Sub UpdateCounters(time)
   If Context.IsWithinTimeslot And Not AllComponentsAreInPlannedDowntime Then
      'met à jour le compteur de secondes dans la période (lorsque la disponibilité est attendue)
      ExpectedAvailabilityTime = ExpectedAvailabilityTime + DateDiff("s",LastUpdateTime,time)
      If SystemIsAvailable Then
         'met à jour le compteur des seconde de disponibilité
         ActualAvailabilityTime = ActualAvailabilityTime + DateDiff("s",LastUpdateTime,time)
      End If
   End If
   LastUpdateTime=time
End sub

Sub UpdateMonitoredComponents(allocatedComponents)
   Dim Component
   'ajoute au plan des composants surveillés tous les nouveaux composants à surveiller
   For Each Component In allocatedComponents
      If Not MonitoredComponents.Exist(Component) Then
         MonitoredComponents(Component) = Component
         AvailabilityIndicators(Component) = 0
         DowntimeStatuses(Component) = 0
      End If
   Next

   'supprime du plan des composants surveillés tous les composants devenus non pertinents
   For Each Component In MonitoredComponents
      If Not allocatedComponents.Exist(Component) Then
         MonitoredComponents.Erase Component
         AvailabilityIndicators.Erase Component
         DowntimeStatuses.Erase Component
      End If
   Next
End sub

Function SystemIsAvailable
   Dim SystemAvailability
   SystemAvailability = True

   Dim Component
   Dim ComponentAvailability
   For Each Component In MonitoredComponents
      ComponentAvailability = AvailabilityIndicators(Component) = 0 _
         Or DowntimeStatuses(Component) > 0
      'la disponibilité du système est évaluée avec la disponibilité
      SystemAvailability = SystemAvailability And ComponentAvailability
   Next
   SystemIsAvailable = SystemAvailability
End Function

Function AllComponentsAreInPlannedDowntime
   Dim ComponentsInPlannedDowntime
   ComponentsInPlannedDowntime = 0
   Dim Component
   For Each Component In MonitoredComponents
      If DowntimeStatuses(Component) > 0 Then
         ComponentsInPlannedDowntime = ComponentsInPlannedDowntime + 1
      End If
   Next

   If ComponentsInPlannedDowntime = MonitoredComponents.Count Then
      AllComponentsAreInPlannedDowntime = True
   Else
      AllComponentsAreInPlannedDowntime = False
   End If
End Function