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
|
Copyright © 2013 CA.
Tous droits réservés.
|
|