Ho un servizio Windows che serve messaggi di qualche coda virtuale tramite un'interfaccia di servizio WCF. Volevo esporre due contatori di prestazioni -Contatore di tipo RateOfCountsPerSecond32 mostra sempre 0
- Il numero di elementi sulla coda
- Il numero di elementi rimossi dalla coda al secondo
Il primo funziona bene, il secondo sempre visualizzato come 0 in PerfMon.exe, nonostante RawValue appaia corretto.
Sto creando i contatori in quanto tali -
internal const string PERF_COUNTERS_CATEGORY = "HRG.Test.GDSSimulator";
internal const string PERF_COUNTER_ITEMSINQUEUE_COUNTER = "# Messages on queue";
internal const string PERF_COUNTER_PNR_PER_SECOND_COUNTER = "# Messages read/sec";
if (!PerformanceCounterCategory.Exists(PERF_COUNTERS_CATEGORY))
{
System.Diagnostics.Trace.WriteLine("Creating performance counter category: " + PERF_COUNTERS_CATEGORY);
CounterCreationDataCollection counters = new CounterCreationDataCollection();
CounterCreationData numberOfMessagesCounter = new CounterCreationData();
numberOfMessagesCounter.CounterHelp = "This counter provides the number of messages exist in each simulated queue";
numberOfMessagesCounter.CounterName = PERF_COUNTER_ITEMSINQUEUE_COUNTER;
numberOfMessagesCounter.CounterType = PerformanceCounterType.NumberOfItems32;
counters.Add(numberOfMessagesCounter);
CounterCreationData messagesPerSecondCounter= new CounterCreationData();
messagesPerSecondCounter.CounterHelp = "This counter provides the number of messages read from the queue per second";
messagesPerSecondCounter.CounterName = PERF_COUNTER_PNR_PER_SECOND_COUNTER;
messagesPerSecondCounter.CounterType = PerformanceCounterType.RateOfCountsPerSecond32;
counters.Add(messagesPerSecondCounter);
PerformanceCounterCategory.Create(PERF_COUNTERS_CATEGORY, "HRG Queue Simulator performance counters", PerformanceCounterCategoryType.MultiInstance,counters);
}
Poi, per ogni chiamata di servizio, ho incrementare il contatore in questione, per il contatore per ogni/sec questo momento sembra che questo -
messagesPerSecCounter = new PerformanceCounter();
messagesPerSecCounter.CategoryName = QueueSimulator.PERF_COUNTERS_CATEGORY;
messagesPerSecCounter.CounterName = QueueSimulator.PERF_COUNTER_PNR_PER_SECOND_COUNTER;
messagesPerSecCounter.MachineName = ".";
messagesPerSecCounter.InstanceName = this.ToString().ToLower();
messagesPerSecCounter.ReadOnly = false;
messagesPerSecCounter.Increment();
Come accennato - se inserisco un breakpoint dopo la chiamata per incrementare posso vedere il RawValue in costante aumento, in coerenza con le chiamate al servizio (abbastanza frequentemente, più di una volta al secondo, penserei) Ma il contatore delle prestazioni stesso rimane su 0.
Il contatore delle prestazioni che fornisce il conteggio degli elementi nella "coda", che viene implementato nello stesso modo (sebbene io assegni RawValue, piuttosto che chiamare Incremento) funziona bene.
Cosa mi manca?
Stai davvero la creazione di un nuovo * * contatore ogni volta che incrementarlo? Non è corretto, basta crearne uno. –
Quindi - inizialmente non l'ho fatto e ancora non ha funzionato, ma non penso che sia un problema in quanto tale. Infatti, ho provato un esempio dal web (http://www.codeguru.com/columns/dotnet/article.php/c7279/) che funziona abbastanza bene e ho cambiato il modo di ricreare il contatore delle prestazioni ogni tempo e funziona ancora (anche se sono completamente d'accordo, non è il modo più efficiente. In entrambi i casi - come ho già detto, ho provato entrambi, questo è solo lo stato del codice al momento, mentre continuo a provare varie cose: –