Dans le cadre de la gestion des incidents et de la gestion de la capacité d’un service informatique, il peut être intéressant de définir des alertes de fonctionnement de SQL Server et de son environnement pour anticiper d’éventuels problèmes de fonctionnement. En effet, rien n’est plus désagréable pour une équipe de production par exemple d’être mis au courant par un utilisateur qu’un de ses serveurs est en panne ou que le système d’information ne fonctionne pas. La qualité de service de cette équipe s’en retrouverait affectée.
Avec SQL Server, il est possible de définir des alertes de performance SQL Server. Cependant, ces alertes ne peuvent être définies qu’à partir de compteurs de performances propres à SQL Server et non sur des compteurs plus généraux du système lui même. Il n’est par exemple pas possible de créer une alerte basée sur la valeur de la file d’attente processeur ou bien sur le pourcentage d’occupation processeur. Pour surveiller ce type de compteur depuis SQL Server il existe les alertes d’événements WMI (Windows Management Instrumentation). WMI est un système de gestion interne à Windows pour le contrôle et la surveillance des ressources systèmes. Dans ce billet, nous créerons une alerte WMI surveillant le pourcentage d’activité processeur et déclenche une notification si ce pourcentage dépasse 85%.
Pour créer une telle alerte on se sert du langage WQL qui est un langage SQL simplifié et destiné à la manipulation des données WMI. Dans notre cas nous allons utiliser un testeur WMI nommé WBEMTest qui est utilitaire natif de Windows pour créer les requêtes adéquates à la gestion de nos alertes.
Pour exécuter ce programme il suffit d’exécuter la commande suivante dans une fenêtre « Exécuter » ou une fenêtre de commande DOS :
> wbemtest
et une fenêtre apparaît :
Le but ici n’est pas d’expliquer en détail le fonctionnement de cet utilitaire. Nous verrons simplement la partie qui nous intéresse pour créer et comprendre comment fonctionne les requêtes WMI pour nos alertes.
Il faut d’abord se connecter à l’espace de nom root/CIMV2 qui est un espace où se trouve l’ensemble des classes de gestion des ressources systèmes.
Pour constituer notre requête il faut connaître premièrement la classe qui gère les événements relatifs aux processeurs. Pour cela on peut soit trouver la classe adéquate à l’aide du menu « Enumérer les classes » de l’utilitaire soit consulter directement l’aide en ligne. Dans notre exemple la classe recherchée s’intitule Win32_PerfFormattedData_PerfOS_Processor. Elle contient certaines propriétés nécessaires (PercentProcessorTime et name) pour le seuil de déclenchement de notre alerte.
Nous devons également utiliser un gestionnaire d’événement WMI __InstanceModificationEvent qui permet de capturer les changements de valeurs de propriétés survenus sur nos classes. Nous allons nous servir du menu « Requête de notification »Â et entrer la requête suivante :
SELECT * FROM __InstanceModificationEvent WITHIN 30 WHERE TargetInstance ISA « Win32_PerfFormattedData_PerfOS_Processor »
Que fais cette requête ? Elle cherche les modifications intervenus sur l’instance de la classe Win32_PerfFormattedData_PerfOS_Processor toutes les 30 secondes à l’aide du gestionnaire d’événement __InstanceModificationEvent.
Pour tester notre requête, il faut cliquer sur le bouton Appliquer. A intervalle régulier, une instance de l’objet __InstanceModificationEvent apparaît, ce qui signifie que pour chaque instance d’objet les valeurs de propriétés ont changé.
Pour extraire les valeurs des propriétés il faut cliquer 2 fois sur un des objets __InstanceModificationEvent pour faire apparaître la fenêtre des propriétés.
Il faut se placer sur la propriété TargetInstance et cliquer 2 fois pour ouvrir la fenêtre d’édition de propriétés.
Enfin il faut cliquer sur le bouton Vue incorporée pour visualiser la valeur de propriété qui nous intéresse : PercentProcessorTime.
La propriété PercentProcessorTime prend ici la valeur 3 (%). Pour chaque autre résultat de requête apparu, la valeur de cette propriété peut changer, ce qui permet d’avoir un échantillonnage de valeurs pour une durée déterminée.
Il ne reste plus qu’à modifier notre requête d’origine avant de créer notre alerte SQL Server car, pour rappel, il s’agit ici récupérer une ligne de résultat de notre requête seulement si la valeur de la propriété PercentProcessorTime est supérieure à 85%. Notre requête devient alors :
SELECT * FROM __InstanceModificationEvent WITHIN 30 WHERE TargetInstance ISA « Win32_PerfFormattedData_PerfOS_Processor » AND TargetInstance.name =’_Total’ AND TargetInstance.PercentProcessorTime > 85
Notez ici l’apparition de la propriété name car nous ne voulons récupérer que les valeurs globales concernant l’ensemble des processeurs (cas des processeurs multi-cour par exemple où ils existent autant d’instance que de cour de processeurs).
Créons enfin notre alerte. Pour cela 2 méthodes :
- En passant par l’interface graphique
- En passant par un script SQL
@message_id=0,
@severity=0,
@enabled=1,
@delay_between_responses=300,
@include_event_description_in=1,
@notification_message=N'Il existe une suractivité des processeurs. Ceux-ci sont occupés > 85 % (DI680SW – EASILY PROD).',
@wmi_namespace=N'\\.\root\CIMV2',
@wmi_query=N'SELECT * FROM __InstanceModificationEvent WITHIN 30 WHERE TargetInstance ISA "Win32_PerfFormattedData_PerfOS_Processor" AND TargetInstance.name = "_Total" AND TargetInstance.PercentProcessorTime > 85'
Nous avons donc vu comment utiliser SQL Server pour générer des notifications d’alertes pour des compteurs de performances relatifs au système d’exploitation. Gérer les alertes depuis SQL Server présentent plusieurs intérêts. Il existe plusieurs méthodes de notifications. Il est possible de mutualiser et de gérer ces alertes en un même point et enfin il est envisageable de proposer un jeu de template d’alertes en relation avec un standard technique concernant la surveillance d’un serveur SQL.
Bonne gestion d’alertes !!
David BARBARIN (Mikedavem)
Elève ingénieur CNAM Lyon
Hello Eric,
Comment vas-tu depuis le temps? et aux hospices toujours bien?
Ton problème se situe sur le namespace utilisé qui doit être \\.\root\CIMV2
Il y a également des fautes de typo dans mon blog qui sont malheureusement héritées de la migration vers WordPress. En principe le bon code devrait être le suivant:
EXEC msdb.dbo.sp_add_alert @name=N’Alert System : Processor : % Process Time > 85%’,
@message_id=0,
@severity=0,
@enabled=1,
@delay_between_responses=300,
@include_event_description_in=1,
@notification_message=N’Il existe une suractivité des processeurs. Ceux-ci sont occupés > 85 % (DI680SW – EASILY PROD).’,
@wmi_namespace=N’\\.\root\CIMV2′,
@wmi_query=N’SELECT * FROM __InstanceModificationEvent WITHIN 30 WHERE TargetInstance ISA « Win32_PerfFormattedData_PerfOS_Processor » AND TargetInstance.name = « _Total » AND TargetInstance.PercentProcessorTime > 85′
Cette alerte ne pose pas de problème à la création :
EXEC msdb.dbo.sp_add_alert @name=N’WMI – Database DDL Events’,
@message_id=0,
@severity=0,
@enabled=1,
@delay_between_responses=15,
@include_event_description_in=1,
@notification_message=N’WMI – DB Change notification’,
@wmi_namespace=N’\\.\root\Microsoft\SqlServer\ServerEvents\MSSQLSERVER’,
@wmi_query=N’select * from DDL_DATABASE_EVENTS’
–@job_name=N’WMI Response – DATABASE Class Event’
GO
Bonsoir,
Je suis entrain de reconduire un système d’alerte d’un serveur SQL2008 vers SQL 2014 SP1.
Lors de la création de l’alerte WMI suivante :
/****** Object: Alert [Alert System : Processor : % Process Time > 85%] Script Date: 12/15/2015 21:20:33 ******/
EXEC msdb.dbo.sp_add_alert @name=N’Alert System : Processor : % Process Time > 85%’,
@message_id=0,
@severity=0,
@enabled=1,
@delay_between_responses=300,
@include_event_description_in=1,
@notification_message=N’Il existe une suractivité des processeurs. Ceux-ci sont occupés > 85 % (DI680SW – EASILY PROD).’,
@wmi_namespace=N’\\.\root\Microsoft\SqlServer\ServerEvents\MSSQLSERVER’,
@wmi_query=N’SELECT * FROM __InstanceModificationEvent WITHIN 30 WHERE TargetInstance ISA « Win32_PerfFormattedData_PerfOS_Processor » AND TargetInstance.name = »_Total » AND TargetInstance.PercentProcessorTime > 85′
J’ai l’erreur suivante :
Msg 22022, Niveau 16, État 1, Ligne 12
Erreur SQLServerAgent : Erreur WMI : 0x80041010.
Msg 14511, Niveau 16, État 1, Procédure sp_verify_alert, Ligne 316
Impossible d’exécuter le @wmi_query dans l’@wmi_namespace fourni. Vérifiez qu’une classe d’événements sélectionnée dans la requête existe dans l’espace de noms et que cette requête a une syntaxe adéquate.
Merci pour votre aide