Tengo un servicio de Windows que sirve mensajes de alguna cola virtual a través de una interfaz de servicio WCF. quería exponer a dos contadores de rendimiento -Contador de tipo RateOfCountsPerSecond32 siempre muestra 0
- El número de elementos en la cola
- El número de elementos eliminados de la cola por segundo
El primero funciona bien, el segundo siempre se muestra como 0 en PerfMon.exe, a pesar de que RawValue parece ser correcto.
estoy creando los contadores como tal -
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);
}
Luego, en cada llamada de servicio, que incrementar el contador correspondiente, para el contador por/seg este momento, parece que esto -
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();
Como mencioné, si pongo un punto de interrupción después de la llamada para incrementar, puedo ver RawValue aumentando constantemente, en consistencia con las llamadas al servicio (con bastante frecuencia, más de una vez, creo) Pero el contador de rendimiento se mantiene en 0.
El contador de rendimiento que proporciona el recuento de elementos en la 'cola', que se implementa de la misma manera (aunque asigno RawValue, en lugar de llamar a Incremento) funciona bien.
¿Qué me estoy perdiendo?
¿Está realmente creando una nueva * * contador cada vez que se incrementará? Eso no es correcto, solo crea uno. –
Entonces, inicialmente no lo hice y todavía no funcionó, pero no creo que sea un problema como tal. De hecho, probé una muestra de la web (http://www.codeguru.com/columns/dotnet/article.php/c7279/), que funciona muy bien y la cambié para volver a crear el contador de rendimiento tiempo y todavía funciona (aunque estoy totalmente de acuerdo en que esta no es la manera más eficiente. De cualquier manera, como ya he dicho intenté ambas cosas, este es solo el estado del código en este momento porque sigo probando varias cosas. –