Performance Counters i ich kategorie
Performance Counters to taki mechanizm Windows, dzięki któremu możemy oszacować wydajność naszej aplikacji (i nie tylko naszej). Świetnie się również sprawdzają, przy identyfikacji wszelkich problemów z wyciekami pamięci lub przy poszukiwaniu niezamkniętych połączeń do bazy danych. Pełną listę odstępnych ‘liczników’ podzielonych na kategorie można zobaczyć uruchamiając Performance Monitor umieszczony Control Panel -> Administrative Tools.
Wszystkie liczniki podzielone są na kategorie – i właśnie z tymi kategoriami miałem problem. Otóż przykładowo, aby stworzyć nową kategorię i dodać do niej nasze liczniki, wywołamy następującą metodą:
CounterCreationDataCollection counters = new CounterCreationDataCollection(); counters.Add(new CounterCreationData("Counter 1", "Counter 1 Description", PerformanceCounterType.NumberOfItems32)); counters.Add(new CounterCreationData("Counter 2", "Counter 2 Description", PerformanceCounterType.NumberOfItems32)); PerformanceCounterCategory.Create("Nowa Kategoria", "Nowe Kategoria Description", PerformanceCounterCategoryType.Unknown, counters);
Fajnie, a co jeśli teraz chcemy dodać nowy licznik do naszej kategorii? No cóż klops – nieco skostniałe API nam tego nie umożliwia, przynajmniej nie bezpośrednio. Otóż, co możemy zrobić to pobrać wszystkie istniejące liczniki, skasować kategorie i utworzyć ja ponownie wzbogacona o nowe liczniki. Przykładowo:
string categoryName = "Nowa Kategoria"; CounterCreationDataCollection counters = new CounterCreationDataCollection(); if (PerformanceCounterCategory.Exists(categoryName)) { PerformanceCounterCategory pcc = PerformanceCounterCategory.GetCategories() .Where(c => c.CategoryName == categoryName).FirstOrDefault(); if (pcc != null) { var existingCouters = pcc.GetCounters(). Select(c => new CounterCreationData() { CounterName = c.CounterName, CounterHelp = c.CounterHelp, CounterType = c.CounterType }).ToArray(); counters.AddRange(existingCouters); } PerformanceCounterCategory.Delete(categoryName); } counters.Add(new CounterCreationData("Counter 3", "Counter 3 Description", PerformanceCounterType.NumberOfItems32)); PerformanceCounterCategory.Create(categoryName, categoryName + " Description", PerformanceCounterCategoryType.Unknown, counters);
Powinno grac i buczeć. Jedno, na co trzeba zwrócić uwagę to, ze możliwy jest mały poślizg z ‘publikacja’ nowego licznika przez Windows. Co może powodować problemy? Gdy instalujemy cos np. serwisy windowsowe z pliku batch – licznik z jednego serwisu jeszcze nie został opublikowany a drugi serwis juz pobiera ich listę, aby je zmodyfikować.
Więcej o Performance Counters można znaleźć tutaj.


