System.Diagnostics.PerformanceData Espace de noms

Utilise les classes de cet espace de noms pour fournir des données de compteur. Les compteurs sont utilisés pour exposer les métriques de performances aux consommateurs comme la Surveillance des performances. L’espace de noms ne contient pas de classes pour consommer les données du compteur. Pour obtenir une description complète de l’architecture des compteurs de performances, consultez Compteurs de performances.

Classes

CounterData

Contient les données brutes pour un compteur.

CounterSet

Définit un ensemble de compteurs logiques.

CounterSetInstance

Crée une instance des compteurs logiques définis dans la classe CounterSet.

CounterSetInstanceCounterDataSet

Contient la collection de valeurs de compteur.

Énumérations

CounterSetInstanceType

Spécifie si l'ensemble de compteurs autorise plusieurs instances telles que les processus et disques physiques, ou une instance unique telle que la mémoire.

CounterType

Définit les types de compteurs possibles. Un type de compteur est assigné à chaque compteur. Le type de compteur détermine comment les données de compteur sont calculées, comment la moyenne est faite et comment elles s'affichent.

Exemples

Voici un manifeste simple :

<!-- <?xml version="1.0" encoding="UTF-16"?> -->  
<instrumentationManifest xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd"   
     xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"   
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
     xmlns:xs="http://www.w3.org/2001/XMLSchema"   
     xmlns:trace=http://schemas.microsoft.com/win/2004/08/events/trace>  

    <instrumentation>  

        <counters xmlns=http://schemas.microsoft.com/win/2005/12/counters>  

            <provider  
              applicationIdentity = "provider1.exe"  
              providerType = "userMode"  
              providerGuid = "{51D1685C-35ED-45be-99FE-17261A4F27F3}">  

               <counterSet guid = "{582803C9-AACD-45e5-8C30-571141A22092}"  
                  uri = "Microsoft.Windows.System.PerfCounters.Typing"  
                  name = "$(string.CounterSet1.Name)"   
                  description = "$(string.CounterSet1.Description)"   
                  instances = "single">  

                    <counter id = "1"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.TotalWords"  
                      name = "$(string.CS1.Counter1.Name)"  
                      description = "$(string.CS1.Counter1.Description)"  
                      type = "perf_counter_rawcount"  
                      detailLevel = "standard"/>  

                    <counter id = "2"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.WordsInInterval"  
                      name = "$(string.CS1.Counter2.Name)"  
                      description = "$(string.CS1.Counter2.Description)"  
                      type = "perf_counter_delta"  
                      detailLevel = "standard"/>  

                    <counter id = "3"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.LetterAPressed"  
                      name = "$(string.CS1.Counter3.Name)"  
                      description = "$(string.CS1.Counter3.Description)"  
                      type = "perf_counter_rawcount"  
                      detailLevel = "standard"/>  

                    <counter id = "4"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.WordsContainingLetterA"  
                      name = "$(string.CS1.Counter4.Name)"   
                      description = "$(string.CS1.Counter4.Description)"   
                      type = "perf_counter_rawcount"  
                      detailLevel = "standard"/>  

                    <counter id = "5"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.PercentOfWordsContainingLetterA"  
                      name = "$(string.CS1.Counter5.Name)"   
                      description = "$(string.CS1.Counter5.Description)"   
                      type = "perf_sample_fraction"  
                      baseID = "6"  
                      detailLevel = "standard">  
                      <counterAttributes>  
                          <counterAttribute name = "displayAsReal" />  
                      </counterAttributes>  
                    </counter>  

                    <counter id = "6"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.PercentBase"  
                      type = "perf_sample_base"  
                      detailLevel = "standard">  
                      <counterAttributes>  
                          <counterAttribute name = "noDisplay" />  
                      </counterAttributes>  
                    </counter>  

                </counterSet>  
            </provider>  
        </counters>  
    </instrumentation>  

    <localization>  
        <resources culture="en-US">  
            <stringTable>  

                <string id="CounterSet1.Name" value="Typing"/>  
                <string id="CounterSet1.Description" value="Captures simple typing metrics."/>  
                <string id="CS1.Counter1.Name" value="Total Words Typed"/>   
                <string id="CS1.Counter1.Description" value="The total number of words typed."/>  
                <string id="CS1.Counter2.Name" value="Words Typed In Interval"/>   
                <string id="CS1.Counter2.Description" value="The total number of words typed in the interval."/>  
                <string id="CS1.Counter3.Name" value="Letter A Pressed"/>   
                <string id="CS1.Counter3.Description" value="The number of times that the letter A is pressed."/>  
                <string id="CS1.Counter4.Name" value="Words Containing A"/>   
                <string id="CS1.Counter4.Description" value="The number of words that contain the letter A."/>  
                <string id="CS1.Counter5.Name" value="Percent of Words Containing A"/>   
                <string id="CS1.Counter5.Description" value="The percent of words that contain the letter A in the last interval."/>  

            </stringTable>  
        </resources>  
    </localization>  
</instrumentationManifest>  

Voici une implémentation de fournisseur simple pour le manifeste :

using System.Diagnostics.PerformanceData;  

        private static Guid providerId = new Guid("{51D1685C-35ED-45be-99FE-17261A4F27F3}");  
        private static Guid typingCounterSetId = new Guid("{582803C9-AACD-45e5-8C30-571141A22092}");  

        private static CounterSet typingCounterSet;         // Defines the counter set  
        private static CounterSetInstance typingCsInstance; // Instance of the counter set  

        private static int numberOfLetterAInWord = 0;  

        . . .  

            // Create the 'Typing' counter set.  
            typingCounterSet = new CounterSet(providerId, typingCounterSetId, CounterSetInstanceType.Single);  

            // Add the counters to the counter set definition.  
            typingCounterSet.AddCounter(1, CounterType.RawData32, "Total Word Count");  
            typingCounterSet.AddCounter(2, CounterType.Delta32, "Words Typed In Interval");  
            typingCounterSet.AddCounter(3, CounterType.RawData32, "A Key Pressed");  
            typingCounterSet.AddCounter(4, CounterType.RawData32, "Words Containing A");  
            typingCounterSet.AddCounter(5, CounterType.SampleFraction, "Percent of Words Containing A");  
            typingCounterSet.AddCounter(6, CounterType.SampleBase, "Percent Base");  

            // Create an instance of the counter set (contains the counter data).  
            typingCsInstance = typingCounterSet.CreateCounterSetInstance("Typing Instance");  
            typingCsInstance.Counters[1].Value = 0;  
            typingCsInstance.Counters[2].Value = 0;  
            typingCsInstance.Counters[3].Value = 0;  
            typingCsInstance.Counters[4].Value = 0;  
            typingCsInstance.Counters[5].Value = 0;  
            typingCsInstance.Counters[6].Value = 0;  

        . . .  

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
        {  
            typingCounterSet.Dispose();  
        }  

        // Simple effort to capture letter A key press and words typed.  
        private void textInput_KeyDown(object sender, KeyEventArgs e)  
        {  
            Keys keyData = e.KeyData;  

            switch (e.KeyData)  
            {  
                case Keys.A :  
                    // In the .NET 3.5 Framework, you had to use the
                    // Value property to set and increment the counter   
                    // value. Beginning with the .NET 4.0 Framework,   
                    // the Value property is safe to use in a multi-  
                    // threaded application.  
                    typingCsInstance.Counters["A Key Pressed"].Value++;  
                    numberOfLetterAInWord++;  

                    break;  

                case Keys.Enter:  
                case Keys.Space:  
                case Keys.Tab:  

                    if (numberOfLetterAInWord > 0)  
                    {  
                        // Beginning with the .NET 4.0 Framework, you   
                        // can use the Increment method to increment   
                        // the counter value by 1. The Increment method   
                        // is safe to use in a multi-threaded   
                        // application.  
                        typingCsInstance.Counters["Words Containing A"].Increment();  
                        typingCsInstance.Counters["Percent of Words Containing A"].Increment();  
                        numberOfLetterAInWord = 0;  
                    }  

                    typingCsInstance.Counters["Percent Base"].Increment();  
                    typingCsInstance.Counters["Total Word Count"].Increment();  
                    typingCsInstance.Counters["Words Typed In Interval"].Increment();  

                    break;  
            }  
        }  

Remarques

Les classes de cet espace de noms prennent en charge la nouvelle architecture (version 2.0) pour les compteurs de performances qui a été introduite dans Windows Vista. Dans la nouvelle architecture, le fournisseur ne répond plus directement aux demandes des consommateurs, mais conserve simplement les données de compteur. Le système injecte un thread dans le processus du fournisseur lorsque celui-ci crée une instance du jeu de compteurs ; le thread est responsable de la gestion des demandes des consommateurs.

Les étapes suivantes montrent le processus d’écriture d’un fournisseur de compteurs.

  1. Les compteurs que le fournisseur fournit sont définis dans un manifeste XML. Les compteurs sont logiquement regroupés en ensembles de compteurs. Les compteurs d’un jeu de compteurs sont identifiés par un identificateur numérique unique au sein du jeu de compteurs. Un fournisseur peut définir un ou plusieurs jeux de compteurs. Un jeu de compteurs est identifié par un GUID unique à un fournisseur. Notez que si vous utilisez ces classes pour écrire votre fournisseur :

    • L’attribut de rappel de l’élément provider est ignoré.

    • La valeur de référence de l’attribut name de l’élément counterAttribute est ignorée.

    Pour plus d’informations sur l’écriture du manifeste, consultez Schéma des compteurs de performances.

  2. Après avoir écrit votre manifeste, utilisez l’outil CTRPP pour compiler le manifeste (ctrpp provider.man). L’outil génère quatre fichiers : .h, .c, .rc et *_r.h. Vous pouvez ignorer les fichiers .h et .c. Le fichier .rc contient les chaînes localisées définies dans votre manifeste. Vous utilisez les fichiers .rc et *_r.h pour créer le fichier de ressources compilé (.res) que vous incluez dans votre projet. L’appel suivant montre comment compiler le fichier de ressources :

    rc /r /i "c:\Program Files\Microsoft SDKs\Windows\v6.0\Include" provider.rc  
    

    Si vous obtenez une erreur qui fait référence à sal.h, copiez le fichier sal.h de votre Microsoft répertoire Include Visual Studio, Visual C vers le répertoire que vous spécifiez pour le commutateur /i.

    Ajoutez un chemin d’accès au fichier de ressources compilé (.res) à la page de propriétés Application de votre projet.

  3. Écrivez votre fournisseur. Les étapes suivantes montrent les appels effectués par un fournisseur :

    1. Appelez le CounterSet.CounterSet constructeur pour définir le jeu de compteurs. Appelez cette méthode pour chaque jeu de compteurs défini dans le manifeste.

    2. Pour chaque jeu de compteurs, appelez l’une CounterSet.AddCounter des méthodes pour ajouter les compteurs au jeu. Appelez cette méthode pour chaque compteur défini dans le jeu de compteurs.

    3. Appelez la CounterSet.CreateCounterSetInstance méthode pour créer une instance du jeu de compteurs (une instance contient les données du compteur). Pour les ensembles de compteurs d’instance unique, appelez cette méthode une fois. Pour plusieurs jeux de compteurs d’instances, appelez cette méthode pour chaque instance pour laquelle vous devez fournir des données de compteur (utilisez un nom unique pour chaque instance).

    4. Utilisez la CounterSetInstance.Counters propriété pour accéder aux données du compteur et les définir.

  4. Une fois votre fournisseur terminé, utilisez l’outil LodCtr pour inscrire les compteurs sur l’ordinateur. Par exemple,

    lodctr /m:provider.man  
    

    L’exemple suppose que le manifeste et le fichier exécutable se trouvent dans le répertoire actif.

Vous pouvez utiliser les classes de cet espace de noms sur les ordinateurs qui exécutent les systèmes d’exploitation Windows Vista et ultérieurs.