Книга: C# для профессионалов. Том II

Добавление счетчиков производительности

Добавление счетчиков производительности

Теперь мы хотим добавить счетчики производительности в сервер цитат. Класс QuoteServiсе не располагает информацией, необходимой для счетчиков производительности. Мы хотим получить число запросов, но после запуска службы QuoteService не получает запросов. Информация полностью содержится в классе QuoteServer, созданном ранее.

Добавление поддержки Visual Studio.NET Designer в библиотеку классов

Можно вручную добавить в код экземпляры класса PerformanceCounter либо использовать приложение Visual Studio.NET Designer. С его помощью перетаскиваются компоненты PerformanceCounter из панели инструментов на его рабочую поверхность. Поддержку легко добавить в библиотеку компонентов, выводя класс из System.ComponentModel.Component. Метод InitializeComponent(), который используется для задания свойств компонентов, будет исполняться автоматически, необходимо добавить лишь его вызов.

Добавление компонентов PerformanceCounter

Далее можно добавить компоненты PerformanceCounter из панели инструментов. Для нашей службы добавляется четыре экземпляра, где свойство CategoryName задается как Quote Service Count для всех объектов, а свойство CounterName задается одним из значений, доступным в выбранной категории. Свойство ReadOnly должно быть задано как False.

Код, который был внесен в InitializeComponent() путем добавления Components в конструктор и заданием свойств, выглядит так:

private void InitializeComponent() {
 // ...
 //
 // performanceCounterRequestsPerSec
 //
 this.performanceCounterRequestsPerSec.CategoryName =
  "Quote Service Counts";
 this.performanceCounterRequestsPerSec.CounterName =
  "# of Requests / sec";
 this.performanceCounterRequestsPerSec.ReadOnly = false;
 //
 // performanceCounterBytesSentTotal
 //
 this.performanceCounterBytesSentTotal.CategoryName =
  "Quote Service Counts";
 this.performanceCounterBytesSentTotal.CounterName =
  "# of Bytes sent";
 this.performanceCounterBytesSentTotal.ReadOnly = false;
 //
 // performanceCounterBytesSentPerSec
 //
 this.performanceCounterBytesSentPerSec.CategoryName =
  "Quote Service Counts";
 this.performanceCounterBytesSentPerSec.CounterName =
  "# of Bytes sent / sec";
 this.performanceCounterBytesSentPerSec.ReadOnly = false;
 //
 // performanceCounterRequestsTotal
 //
 this.performanceCounterRequestsTotal.CategoryName =
  "Quote Service Counts";
 this.performanceCounterRequestsTotal.CounterName =
  "# of Requests";
 this.performanceCounterRequestsTotal.Readonly = false;
 // ...

Счетчики производительности, которые показывают общие значения, увеличиваются в методе Listener() класса QuoteServer. Метод Increment() увеличивает счетчик на 1, метод IncrementBy() увеличивает счетчик на значение аргумента.

Для счетчиков производительности, которые показывают посекундные значения, в методе Listener() обновляются только две переменные — requestPerSec и bytessPerSec:

void protected void Listener() {
 try {
  listener = new TCPListener(port);
  listener.Start();
  while (true) {
   Socket socket = listener.Accept();
   if (socket == null) {
    return;
   }
   string message = GetRandomQuoteOfTheDay();
   UnicodeEncoding encoder = new UnicodeEncoding();
   byte [] buffer = encoder.GetBytes(message);
   socket.Send(buffer, buffer.Length, 0);
   socket.Close();
   performanceCounterRequestsTotal.Increment();
   performanceCounterBytesSentTotal.IncrementBy(nBytes);
   requestsPerSec++;
   bytesPerSec += Bytes;
  }
 } catch (Exception e) {
  string message = "Quote Server failed in Listener: " + e.Message;
  eventLog.WriteEntry(message, EventLogEntryType.Error);
 }
}

Чтобы показывать обновленные значения каждую секунду, используется компонент Timer. Метод OnTimer() вызывается раз в секунду и задает счетчики производительности с помощью свойства RawValue класса PerformanceCounter:

protected void OnTimer(object sender, system.EventArgs e) {
 performanceCounterBytesSentPerSec.RawValue = bytesPerSec;
 performanceCounterRequestsPerSec.RawValue = reguestsPerSec;
 bytesPerSec = 0;
 requestsPerSec = 0;
}

Оглавление книги


Генерация: 1.458. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз