2010-07-20 2 views
13

У меня есть специальная категория счетчиков, к которой мне нужно добавить новый счетчик, без удаления или сброса всех существующих счетчиков. Как я могу это сделать?Как добавить новый счетчик к существующей категории счетчиков производительности без удаления старых счетчиков?

Я пытался использовать CounterExists(), но даже после создания счетчика, как я могу связать его с элементом CounterCreationDataCollection и связать его с моей существующей категорией счетчиков?

ответ

13

Лучший способ сделать это я нашел, тем более, что здесь не очень много информации по этой теме, заключается в сохранении существующих исходных значений, а затем их повторного применения после удаления и повторного создания категории ,

/// <summary> 
/// When deleting the Category, need to preserve the existing counter values 
/// </summary> 
static Dictionary<string, long> GetPreservedValues(string category, XmlNodeList nodes) 
{ 
    Dictionary<string, long> preservedValues = new Dictionary<string, long>(); 

    foreach (XmlNode counterNode in nodes) 
    { 
     string counterName = counterNode.Attributes["name"].Value; 

     if (PerformanceCounterCategory.CounterExists(counterName, category)) 
     { 
      PerformanceCounter performanceCounter = new PerformanceCounter(category, counterName, false); 
      preservedValues.Add(counterName, performanceCounter.RawValue); 

      Console.WriteLine("Preserving {0} with a RawValue of {1}", counterName, performanceCounter.RawValue); 
     } 
     else 
     { 
      Console.WriteLine("Unable to preserve {0} because it doesn't exist", counterName); 
     } 
    } 

    return preservedValues; 
} 

/// <summary> 
/// Restore preserved values after the category has been re-created 
/// </summary> 
static void SetPreservedValues(string category, Dictionary<string, long> preservedValues) 
{ 
    foreach (KeyValuePair<string, long> preservedValue in preservedValues) 
    { 
     PerformanceCounter performanceCounter = new PerformanceCounter(category, preservedValue.Key, false); 
     performanceCounter.RawValue = preservedValue.Value; 

     Console.WriteLine("Restoring {0} with a RawValue of {1}", preservedValue.Key, performanceCounter.RawValue); 
    } 
}