Partager via


Cibles des Événements étendus SQL Server

Les cibles des Événements étendus SQL Server sont des consommateurs d'événements. Les cibles peuvent écrire dans un fichier, agréger des données d'événement ou démarrer une tâche associée à un événement. Les cibles peuvent traiter des données de façon synchrone ou asynchrone.

La conception des Événements étendus garantit que les cibles sont assurées de recevoir des événements une seule fois par session.

Les Événements étendus fournissent les cibles suivantes que vous pouvez utiliser pour une session Événements étendus :

  • Event bucketing

    À utiliser pour comptabiliser le nombre d'occurrences d'un événement donné, en fonction d'une colonne d'événement ou d'une action définie.

  • Event pairing

    De nombreux événements surviennent sous forme de paires, tels que les acquisitions et les libérations de verrous. Permet de savoir si un événement jumelé n'entre pas dans le cadre d'une correspondance.

  • Event Tracing for Windows (ETW)

    Permet de mettre en corrélation les événements SQL Server avec les données d'événement du système d'exploitation Windows ou des applications.

  • Event file

    Permet d'enregistrer sur le disque les résultats d'une session d'événements stockés en mémoire tampon.

  • Synchronous event counter

    Permet de comptabiliser tous les événements qui surviennent au cours d'une session Événements étendus. Permet d'obtenir des informations sur les caractéristiques de charge de travail sans ajouter la surcharge de la collecte d'événements complète.

  • Ring buffer

    Permet de conserver les événements en mémoire selon le principe FIFO (premier entré/premier sorti) ou au cas par cas.

Les cibles peuvent être des fichiers ou des segments de mémoire.

  • La cible de fichier et les cibles ETW sont considérées comme des cibles de fichiers.

  • Les événements compartimentés, les événements jumelés, le compteur d'événements synchrones et les cibles de mémoire tampon en anneau sont des cibles stockées en mémoire. Les données sont enregistrées dans la mémoire tampon de la session (la colonne données_cibles dans la vue de gestion dynamique sys.dm_xe_session_targets).

Notez bien que lorsque vous interrompez une session faisant intervenir une cible en mémoire, les informations stockées en mémoire tampon au cours de cette session ne sont pas conservées. Si vous souhaitez accéder aux données d'un événement après avoir interrompu une session, vous devez configurer la session pour pouvoir utiliser un fichier cible (recommandé) ou enregistrer les données avant de mettre fin à la session.

Suivez les instructions ci-après pour sélectionner la cible que vous comptez utiliser.

Cible

Utilisation recommandée

Cible de fichier d'événements ou ETW

Utilisez une cible de fichier lorsqu'au moins une des conditions suivantes est vraie :

  • Vous souhaitez effectuer une collecte de données sur le long terme.

  • Vous souhaitez collecter des données relatives à des événements très volumineux.

  • Vous souhaitez conserver un historique des données d'événements.

Cible de mémoire tampon en anneau

Utilisez une cible de mémoire tampon en anneau lorsqu'au moins une des conditions suivantes est vraie :

  • Vous souhaitez effectuer un suivi cyclique pour continuer à collecter des données tout en ne tenant compte que des événements les plus récents (environ 2 mégaoctets de données d'événement). Vous avez également la possibilité d'effectuer une collecte de données à court terme pour consulter les événements les plus récents.

  • Vous souhaitez consulter toutes les données d'événement stockées dans la mémoire tampon. En d'autres termes, vous souhaitez consulter les données brutes plutôt que des informations agrégées.

  • Il est inutile de conserver un historique des données d'événements.

Création d'une cible d'événements compartimentés, d'une cible d'événements jumelés ou d'une cible de compteur d'événements synchrones

Utilisez une cible en mémoire lorsqu'au moins une des conditions suivantes est vraie :

  • Vous souhaitez traiter un incident déterminé en utilisant une cible permettant d'analyser ou de regrouper les données d'événement. Vous pouvez notamment savoir s'il existe des transactions ouvertes (cible de jumelage d'événements) ou consulter les résultats d'une requête relative à l'utilisation des ressources sur une période déterminée (cible de jumelage d'événements).

  • Vous souhaitez effectuer une collecte de données à court terme.

  • Il est inutile de conserver un historique des données d'événements.

Cible de création de compartiments d'événements

Une cible de création de compartiments d'événements regroupe les occurrences d'un type d'événement spécifique en fonction de données d'événement. Un « compartiment » est un regroupement d'événements comptés en fonction d'une colonne d'événement ou d'une action. Vous pouvez utiliser la cible de création de compartiments d'événements pour résoudre les problèmes de performance. En identifiant les événements qui se produisent le plus souvent, vous pouvez trouver des « zones réactives » qui indiquent la cause probable d'un problème de performance.

Le tableau suivant décrit les options pouvant être utilisées pour configurer la cible de création de compartiments d'événements.

Option

Valeurs autorisées

Description 

slots

Toute valeur entière. Cette valeur est facultative.

Une valeur spécifiée par l'utilisateur qui indique le nombre maximal de compartiments à conserver. Lorsque cette valeur est atteinte, les nouveaux événements qui n'appartiennent pas aux compartiments existants sont ignorés.

filtering_event_name

Tout événement présent dans la session Événements étendus. Cette valeur est facultative.

Une valeur spécifiée par l'utilisateur qui permet d'identifier une classe d'événements. Seules les instances de l'événement spécifié sont placées dans un compartiment. Tous les autres événements sont ignorés.

Si vous spécifiez cette valeur, vous devez utiliser le format : nom_package.nom_événement, par exemple 'sqlserver.checkpoint_end'. Vous pouvez identifier le nom du package à l'aide de la requête suivante :

SELECT p.name, se.event_name
FROM sys.dm_xe_session_events se
JOIN sys.dm_xe_packages p
ON se_event_package_guid = p.guid
ORDER BY p.name, se.event_name

Si vous ne spécifiez pas la valeur filtering_event_name, source_type doit avoir la valeur 1 (valeur par défaut).

source_type

Type d'objet sur lequel le compartiment est basé. Cette valeur est facultative et a la valeur par défaut 1 si elle n'est pas spécifiée.

Peut avoir l'une des valeurs suivantes :

  • 0 pour un événement

  • 1 pour une action

source

Colonne d'événement ou nom d'action.

La colonne d'événement ou le nom d'action utilisé(e) comme source de données.

Lorsque vous spécifiez une colonne d'événement pour la source, vous devez spécifier une colonne à partir de l'événement qui est utilisé pour la valeur filtering_event_name. Vous pouvez identifier les colonnes possibles à l'aide de la requête suivante :

SELECT name FROM sys.dm_xe_object_columns
WHERE object_name = '<eventname>'
AND column_type != 'readonly'

Lorsque vous spécifiez une colonne d'événement pour la source, il n'est pas nécessaire d'inclure le nom du package dans la valeur de la source.

Lorsque vous spécifiez un nom d'action pour la source, vous devez utiliser l'une des actions configurées pour la collection dans la session d'événements pour laquelle cette cible est utilisée. Pour trouver les valeurs possibles pour le nom d'action, vous pouvez interroger la colonne action_name de la vue sys.dm_xe_sesssion_event_actions.

Si vous utilisez un nom d'action comme source de données, vous devez spécifier la valeur de la source en utilisant le format : nom_package.nom_action.

L'exemple suivant montre globalement comment la cible de création de compartiments d'événements collecte les données. Dans cet exemple, vous utilisez la cible de création de compartiments d'événements pour compter le nombre d'attentes de chaque type d'attente. Pour ce faire, spécifiez les options suivantes lorsque vous définissez la cible de création de compartiments d'événements :

  • filtering_event_name = 'wait_info'

  • source = 'wait_type'

  • source_type = 0 (car wait_type est une colonne d'événement)

Dans ce scénario d'exemple, les données suivantes sont enregistrées pour la source wait_type.

Nom de l'événement de filtrage

Valeur de la colonne source

wait_info

file_io

wait_info

file_io

wait_info

réseau

wait_info

réseau

wait_info

veille

Les valeurs de type d'attente sont catégorisées en compartiments, avec les valeurs et nombres d'emplacements suivants :

Valeur

Nombre d'emplacements

file_io

2

réseau

2

veille

1

Pour plus d'informations sur la syntaxe de la cible de création de compartiments d'événements, consultez Procédure : surveiller l'activité système à l'aide d'événements étendus.

La cible de création de compartiments conserve seulement les données d'événement pour la source spécifiée. Dans certains cas, les données d'événement peuvent être trop volumineuses pour être conservées complètement, auxquels cas les données sont tronquées. Lorsque des données d'événement sont tronquées, le nombre d'octets est enregistré et affiché comme sortie XML.

La cible de création de compartiments applique en série les données à un programme ou une procédure d'appel dans le format XML.

[!REMARQUE]

La sortie de création de compartiments n'est conforme à aucun schéma.

L'exemple suivant illustre le format de sortie de la cible de création de compartiments.

<Slots truncated = "0" buckets=[count]>
    <Slot count=[count] trunc=[truncated bytes]>
        <value>
        </value>
    </Slot>
</Slots>

Cible d'appariement d'événements

La cible d'appariement d'événements correspond à deux événements qui utilisent une ou plusieurs colonnes de données qui sont présentes dans chaque événement. De nombreux événements se présentent sous forme de paires, tels que les acquisitions et les libérations de verrous. Une fois qu'une séquence d'événement a été couplée, les deux événements sont ignorés. Ignorer des jeux correspondants permet de détecter facilement les acquisitions de verrous qui n'ont pas été libérées.

Grâce aux filtres au niveau des événements, la cible d'appariement peut être utilisée pour capturer uniquement les événements qui ne correspondent pas aux critères prédéfinis.

Lorsque vous utilisez la cible d'appariement d'événements, vous êtes autorisé à choisir deux événements à associer, ainsi qu'une séquence de colonnes sur lesquelles s'effectuera la correspondance. Toutes les colonnes dans cette séquence doivent être du même type.

Le tableau suivant décrit les options disponibles pour configurer l'appariement d'événements.

Option

Valeurs autorisées

Description

begin_event

Tout nom d'événement qui est présent dans la session active.

Le nom d'événement qui spécifie l'événement de début dans une séquence couplée.

end_event

Tout nom d'événement présent dans la session active.

Le nom d'événement qui spécifie l'événement de fin dans une séquence couplée.

begin_matching_columns

Une liste ordonnée de noms de colonnes séparés par des virgules.

Les colonnes sur lesquelles effectuer la correspondance.

end_matching_columns

Une liste ordonnée de noms de colonnes séparés par des virgules.

Les colonnes sur lesquelles effectuer la correspondance.

begin_matching_actions

Liste ordonnée d'actions séparées par des virgules.

Actions sur lesquelles effectuer la correspondance.

end_matching_actions

Liste ordonnée d'actions séparées par des virgules.

Actions sur lesquelles effectuer la correspondance.

respond_to_memory_pressure

Une des valeurs suivantes :

  • 0 = ne pas répondre.

  • 1 = arrêter d'ajouter de nouveaux orphelins à la liste en cas de sollicitation de la mémoire.

La réponse cible aux événements de mémoire. Si la valeur spécifiée est 1 et que la mémoire du serveur est insuffisante, les informations non couplées qui sont conservées sont supprimées.

Toutes les données associées à un événement sont capturées et stockées pour un appariement futur. De plus, les données ajoutées par les actions sont également collectées. Les données d'événement collectées sont stockées en mémoire et, comme telles, ont une limite finie. Cette limite est basée sur la capacité et l'activité du système. Plutôt que prendre la quantité maximale de mémoire à utiliser comme paramètre, la quantité de mémoire utilisée sera basée sur les ressources système disponibles. Lorsque celles-ci ne sont pas disponibles, les événements non couplés qui ont été conservés seront supprimés. Si un événement n'a pas été couplé et est supprimé, l'événement correspondant apparaîtra comme un événement non couplé.

La cible d'appariement applique en série des événements non couplés à un format XML. Ce format n'est conforme à aucun schéma. Le format contient uniquement deux types d'éléments. L'élément <unpaired> est la racine, suivi par un élément <event> pour chaque événement non couplé qui fait actuellement l'objet d'un suivi. L'élément <event> contient un attribut qui contient le nom de l'événement non couplé.

L'exemple suivant illustre le format de sortie de la cible d'appariement.

<unpaired truncated = "0" matchedCount = "[matched count]" memoryPressureDroppedCount = " [lost count]">
    <event name  = "[event name]" package = "[package]" id= "[event ID value]" version = "[event version]">
    <data name = "[column name]"> 
    <type name = "[column type]" package = "[type package]" /> 
    <value>[column value]</value>
    <text value>[text value]</text>>
        </data>
    </event>
</unpaired>

Cible du suivi d'événements pour Windows

Avant d'utiliser le suivi d'événements pour Windows (ETW) comme cible, il est recommandé de posséder une connaissance pratique du Suivi d'événements pour Windows. Le suivi ETW est utilisé conjointement avec les Événements étendus ou en tant que consommateur d'événements des Événements étendus. Les liens externes suivants fournissent un point de départ pour obtenir des informations générales sur le suivi ETW :

Les événements étendus prennent en charge la version Windows XP et Windows Server 2003 d'ETW. La cible du suivi ETW est une cible singleton, bien qu'elle puisse être ajoutée à plusieurs sessions. Si un événement est déclenché sur plusieurs sessions, l'événement sera propagé uniquement à la cible ETW une fois par occurrence de l'événement. Le moteur des Événements étendus est limité à une seule instance par processus.

Important

Pour pouvoir utiliser la cible du suivi ETW, le compte de démarrage du service SQL Server doit être membre du groupe Utilisateurs du journal de performances.

La configuration des événements présents dans une session ETW est contrôlée par le processus qui héberge le moteur des Événements étendus. Le moteur contrôle quels événements déclencher et quelles conditions doivent être respectées pour qu'un événement se déclenche.

Après avoir créé une liaison à une session Événements étendus, ce qui joint la cible ETW pour la première fois pendant la durée de vie d'un processus, la cible ETW ouvre une session ETW unique sur le fournisseur SQL Server. Si une session ETW existe déjà, la cible ETW obtient une référence à la session existante. Cette session ETW est partagée sur toutes les instances de SQL Server sur un ordinateur donné. Cette session ETW reçoit tous les événements à partir des sessions qui possèdent la cible ETW.

Comme ETW a besoin de fournisseurs pour pouvoir consommer des événements et les transmettre en aval au suivi ETW, tous les packages des Événements étendus sont activés sur la session. Lorsqu'un événement est déclenché, la cible ETW envoie l'événement à la session sur laquelle le fournisseur pour l'événement est activé.

La cible ETW prend en charge la publication synchrone d'événements sur le thread qui déclenche l'événement. Cependant, la cible ETW ne prend pas en charge la publication asynchrone d'événements.

La cible ETW ne prend pas en charge le contrôle à partir de contrôleurs ETW externes tels que logman.exe. Pour produire des traces ETW, une session d'événements doit être créée avec la cible ETW. Pour plus d'informations, consultez CREATE EVENT SESSION (Transact-SQL).

[!REMARQUE]

L'activation de la cible ETW crée une session ETW nommée XE_DEFAULT_ETW_SESSION. Si une session XE_DEFAULT_ETW_SESSION existe déjà, elle est utilisée sans modifier la moindre propriété de la session existante. La session XE_DEFAULT_ETW_SESSION est partagée entre toutes les instances de SQL Server. Après avoir démarré XE_DEFAULT_ETW_SESSION, vous devez l'arrêter à l'aide d'un contrôleur ETW, tel que l'outil Logman. Par exemple, vous pouvez exécuter la commande suivante à l'invite de commandes : logman stop XE_DEFAULT_ETW_SESSION -ets.

Le tableau suivant décrit les options disponibles pour configurer la cible ETW.

Option

Valeurs autorisées

Description

default_xe_session_name

Toute chaîne incluant jusqu'à 256 caractères. Cette valeur est facultative.

Nom de la session Événements étendus. Par défaut, il s'agit de XESESSION0_4B7A5EC6-37EF-4d4c-81EC-13C547B9AC46.

default_etw_session_logfile_path

Toute chaîne incluant jusqu'à 256 caractères. Cette valeur est facultative.

Chemin d'accès au fichier journal pour la session Événements étendus. Par défaut, il s'agit de %TEMP%\ XEEtw.etl.

default_etw_session_logfile_size_mb

Entier quelconque non signé. Cette valeur est facultative.

Taille du fichier journal, en mégaoctets (Mo), de la session Événements étendus. La valeur par défaut est 20 Mo.

default_etw_session_buffer_size_kb

Entier quelconque non signé. Cette valeur est facultative.

Taille des tampons en mémoire, en kilo-octets (Ko), pour la session Événements étendus. La valeur par défaut est 128 Ko.

retries

Entier quelconque non signé.

Nombre de nouvelles tentatives de publication de l'événement dans le sous-système ETW avant la suppression de l'événement. La valeur par défaut est 0.

La configuration des paramètres précédents est facultative. La cible ETW utilise les valeurs par défaut de ces paramètres.

La cible ETW est chargée des opérations suivantes :

  • Création de la session ETW par défaut.

  • Enregistrement de tous les packages des Événements étendus auprès d'ETW. Cela garantit que les événements ne seront pas supprimés par ETW.

  • Gestion de l'envoi du flux d'événements à ETW. La cible ETW crée un événement ETW avec les données des Événements étendus et l'envoie à la session ETW appropriée. Si l'événement est plus grand que la taille de la mémoire tampon ou si les données ne peuvent pas s'ajuster dans un événement ETW, le suivi ETW fractionne l'événement en fragments.

  • Conservation des packages des Événements étendus activés à tout instant.

Les emplacements de fichier par défaut suivants sont utilisés par ETW :

  • Le fichier de sortie ETW se trouve dans %TEMP%\XEEtw.etl.

    Important

    Le chemin d'accès ne peut pas être modifié une fois la première session démarrée.

  • Les fichiers MOF (Managed Object Format) se trouvent dans le dossier <votre dossier d'installation>\Microsoft SQL Server\Shared. Pour plus d'informations, consultez Format d'objet managé sur MSDN (en anglais).

Cible de fichier d'événements

La cible de fichier d'événements est une cible asynchrone qui écrit des mémoires tampon complètes sur disque. La cible de fichier crée deux types de fichiers, journal et métadonnées. Le fichier de métadonnées décrit le contenu des événements présents dans le fichier journal de sortie cible. Cela permet une analyse correcte de tous les événements dans le fichier journal, ainsi que l'analyse des données d'action associées à un événement.

Pour utiliser cette cible, vous devez spécifier les noms des emplacements du fichier journal et du fichier de métadonnées. Les autres options de configuration, telles que la taille de fichier et les caractéristiques de croissance, sont facultatives.

Le tableau ci-dessous décrit les options disponibles pour configurer la cible de fichier d'événements.

Option

Valeurs autorisées

Description

filename

Toute chaîne incluant jusqu'à 260 caractères. Cette valeur est requise.

Emplacement et nom du fichier.

Vous pouvez utiliser toute extension de nom de fichier.

max_file_size

Entier quelconque de 64 bits. Cette valeur est facultative.

Taille maximale du fichier, en mégaoctets (Mo). Si l'option max_file_size n'est pas spécifiée, la taille du fichier augmente jusqu'à ce que le disque soit saturé. La taille de fichier par défaut est 1 Go.

max_file_size doit être supérieure à la taille actuelle des tampons de session. Si ce n'est pas le cas, la cible de fichier ne pourra pas s'initialiser, et indiquera que max_file_size n'est pas valide. Pour afficher la taille actuelle des tampons, interrogez la colonne buffer_size dans la vue de gestion dynamique sys.dm_xe_sessions.

Si la taille de fichier par défaut est plus petite que la taille de la mémoire tampon de session, nous vous recommandons d'affecter à max_file_size la valeur spécifiée dans la colonne max_memory dans l'affichage catalogue sys.server_event_sessions.

Lorsque max_file_size a une taille plus grande que la taille des tampons de session, cette valeur peut être arrondie au multiple le plus proche de la taille de la mémoire tampon de session. Cela peut créer un fichier cible qui est plus petit que la valeur spécifiée de max_file_size. Par exemple, si la taille de la mémoire tampon est de 100 Mo et que max_file_size a la valeur 150 Mo, la taille de fichier résultante est arrondie à 100 Mo parce qu'une deuxième mémoire tampon ne tiendrait pas dans l'espace de 50 Mo restant.

Si la taille de fichier par défaut est plus petite que la taille de la mémoire tampon de session, nous vous recommandons d'affecter à max_file_size la valeur figurant dans la colonne max_memory dans l'affichage catalogue sys.server_event_sessions.

max_rollover_files

Entier quelconque de 32 bits. Cette valeur est facultative.

Nombre maximal de fichiers à conserver dans le système de fichiers.

increment

Entier quelconque de 32 bits. Cette valeur est facultative.

Croissance incrémentielle, en mégaoctets (Mo), pour le fichier. Si cette option n'est pas spécifiée, la valeur par défaut pour l'incrément est égale à deux fois la taille de la mémoire tampon de session.

metadatafile

Toute chaîne incluant jusqu'à 260 caractères. Cette valeur est requise.

Emplacement et nom des métadonnées pour le fichier.

La première fois qu'une cible de fichier est créée, le nom de fichier que vous spécifiez est ajouté avec _0_ et une valeur d'entier long. La valeur entière est calculée en tant que nombre de millisecondes écoulées entre le 1er janvier 1600 et la date et l'heure de création du fichier. Les fichiers de substitution suivants utilisent également ce format. En examinant la valeur de l'entier long, vous pouvez déterminer le fichier le plus actuel. L'exemple suivant illustre comment les fichiers sont nommés dans un scénario où vous spécifiez l'option de nom de fichier comme C:\OutputFiles\MyOutput.xel :

  • premier fichier créé - C:\OutputFiles\MyOutput_0_128500310259380000.xel

  • premier fichier de substitution - C:\OutputFiles\MyOutput_0_128505831770890000.xel

  • deuxième fichier de substitution - C:\OutputFiles\MyOutput_0_132410772966237000.xel

Cible de compteur d'événements synchrone

La cible de compteur d'événements synchrone compte tous les événements qui se déclenchent au cours d'une session Événements étendus. Elle vous permet d'obtenir des informations sur les caractéristiques de charge de travail sans ajouter la surcharge de la collecte d'événements complète. Cette cible n'a aucun paramètre personnalisable.

L'exemple suivant illustre la sortie de la cible de compteur d'événements synchrone.

<CounterTarget truncated = "0">
  <Packages>
    <Package name = "[package name]">
      <Event name = "[event name]" count = "[number]" />
    </Package>
  </Packages>
</CounterTarget>

Cible de mémoire tampon en anneau

La cible de mémoire tampon en anneau maintient brièvement les données d'événements en mémoire. Cette cible peut gérer des événements dans deux modes différents.

  • Le premier mode est le mode FIFO strict (premier entré, premier sorti), où l'événement le plus ancien est supprimé lorsque toute la mémoire allouée à la cible est utilisée. Dans ce mode (par défaut), l'option occurrence_number a la valeur 0.

  • Le deuxième mode est le mode FIFO par événement, où un nombre spécifié d'événements de chaque type est conservé. Dans ce mode, les événements les plus anciens de chaque type sont supprimés lorsque toute la mémoire allouée à la cible est utilisée. Vous pouvez configurer l'option occurrence_number pour spécifier le nombre d'événements de chaque type à conserver.

Le tableau suivant décrit les options disponibles pour configurer la cible de mémoire tampon en anneau.

Option

Valeurs autorisées

Description

default_memory

Entier quelconque de 32 bits. Cette valeur est facultative.

Quantité de mémoire maximale, en kilo-octet (Ko), à utiliser. Les événements existants sont supprimés lorsque cette valeur est atteinte.

occurrence_number

Une des valeurs suivantes :

  • 0 (par défaut) = l'événement le plus ancien est supprimé lorsque toute la mémoire allouée à la cible est utilisée.

  • entier 32 bits = le nombre d'événements de chaque type à conserver avant d'être supprimés en fonction du mode FIFO par événement.

Cette valeur est facultative.

Le mode FIFO à utiliser, s'il est défini a une valeur supérieur à 0, le nombre d'événements préférés de chaque type à conserver dans la mémoire tampon.

L'exemple suivant illustre la sortie de la cible de mémoire tampon en anneau.

<RingBufferTarget eventsPerSec="" processingTime="" totalEventsProcessed="" eventCount="" droppedCount="" memoryUsed="">
 <event name="" package="" id="" version="" timestamp="">
    <data name="">
      <type name="" package="" />
      <value></value>
      <text></text>
    </data>
    <action name="" package="">
      <type name="" package="" />
      <value></value>
      <text></text>
    </action>
  </event>
</RingBufferTarget>

Historique des modifications

Mise à jour du contenu

Ajout d'une remarque sur la session XE_DEFAULT_ETW_SESSION à la section « Suivi d'événements pour Windows ».

Dans l'introduction, insertion d'une synthèse décrivant chaque type de cible, ainsi que des recommandations relatives à l'utilisation.