2013-03-22 56 views
2

我是c#和.net的初學者。 我的意圖是爲unix人提供服務,爲windows團隊從windows服務器收集性能數據並在graphite(通過StatsD)重新編碼它們。收集wmi性能計數器與刷新對象

我發現了一個source code which seems to do exactly that,只是它看起來使用錯誤的接口(錯誤的抽象級別)。例如標籤被翻譯成本地化的Windows版本(這是瘋狂的),並且使得這種服務的使用不可行。

使用wmi性能計數器似乎是要走的路,但我想有效地查詢,並發現爲此使用刷新對象是推薦的解決方案,但我不知道該怎麼做。

不知何故相關I found an answer for querying the values once我在這裏作爲參考。

的問題是:

  • 如何使用複習對象爲每5秒以前的鏈接上所看到查詢磁盤統計信息?
  • (對於積分)如何整合,我應該對the service mentioned before通過wmi而不是性能計數器收集數據做出什麼改變?

感謝

+1

我探索了一些,似乎只是複習對象是VBScript。它似乎是第一個這是一個通用的概念。 – cstamas 2013-03-25 18:36:12

回答

2

以下是我使用的通過WMI在C#中收集有關磁盤使用情況的信息:

private List<DiskInfo> GetDiskInfo() 
{ 
    List<DiskInfo> disks = new List<DiskInfo>(); 
    SelectQuery query = new SelectQuery("SELECT Size, FreeSpace, Name, FileSystem FROM Win32_LogicalDisk WHERE DriveType = 3"); 

    ManagementObjectSearcher moSearcher = new ManagementObjectSearcher(scope, query); 
    ManagementObjectCollection collection = moSearcher.Get(); 
    foreach (ManagementObject res in collection) 
    { 
     float size = Convert.ToSingle(res["Size"])/1024f; 
     float usedSpace = size - (Convert.ToSingle(res["FreeSpace"])/1024f); 
     DiskInfo di = new DiskInfo(); 
     di.Name = res["Name"].ToString(); 
     di.Size = ConvertVal(size); 
     di.UsedSpace = ConvertVal(usedSpace); 
     if (size > 0) 
     { 
      di.PercentUsed = ((usedSpace/size) * 100).ToString("N0"); 
     } 
     else 
     { 
      di.PercentUsed = "0"; 
     } 
     if (res["FileSystem"] != null) 
     { 
      di.FileSystem = res["FileSystem"].ToString(); 
      disks.Add(di); 
     }        
    } 

    return disks; 
} 

// handles returning the correct units  
private string ConvertVal(float value) 
    {   
     float K = value; 
     float M = value/1024f; 
     float G = M/1024f; 
     float T = G/1024f; 
     string unit = "KB"; 
     float val = K;    

     if (K >= 1024) 
     { 
      unit = "MB"; 
      val = M; 
     } 

     if (M >= 1024) 
     { 
      unit = "GB"; 
      val = G; 
     } 

     if (G >= 1024) 
     { 
      unit = "TB"; 
      val = T; 
     } 

     return val.ToString("N2") + unit; 
    } 

我主要結合全ComputerInfo類使用上面的代碼,我可以每隔幾秒向一個返回JSON的瀏覽器的ASP.NET MVC服務調用jQuery AJAX,然後使用提供的數據即時構建頁面。
這裏是我的製作更容易的數據顯示DISKINFO類:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ComputerInfo.Models 
{ 
    public class DiskInfo 
    { 
     public string Name { get; set; } 
     public string Size { get; set; } 
     public string UsedSpace { get; set; } 
     public string PercentUsed { get; set; } 
     public string FileSystem { get; set; } 
    } 
} 

我希望這有助於。讓我知道你是否需要答案中的其他內容。

+0

我真正需要的是一種以有效的方式每隔5秒向控制檯輸出一些指標的方法。用JavaScript刷新是完全不同的場景。 – cstamas 2013-03-23 02:25:57

+0

複習對象的一些說明http://msdn.microsoft.com/en-us/library/windows/desktop/aa393838(v=vs.85).aspx – cstamas 2013-03-23 02:31:28

+1

不是100%完美的答案,但我接受反正。 – cstamas 2013-03-25 18:38:03