使用复习对象收集wmi性能计数器

时间:2013-03-22 23:12:47

标签: c# wmi performancecounter

我是c#和.net的初学者。 我作为unix人的意图是为windows团队提供服务,从windows服务器收集性能数据并在graphite中重新编码(通过StatsD)。

我找到了一个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 个答案:

答案 0 :(得分:2)

以下是我用于通过C#中的WMI收集有关磁盘使用情况的信息:

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类,我可以在ASP.NET MVC服务上每隔几秒从jQuery AJAX调用一次,它将JSON返回给浏览器,我随时用数据构建页面提供。
这是我的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; }
    }
}

我希望这会有所帮助。如果您在答案中还需要其他任何内容,请与我联系。