2013-03-22 3 views
2

저는 C# 및 .net의 초보자입니다. 유닉스 사용자로서 나의 의도는 Windows 서버에서 성능 데이터를 수집하고이를 graphite (StatsD 통해)으로 기록하는 Windows 팀을위한 서비스를 제공하는 것입니다.리프레셔 개체가있는 wmi 성능 카운터 수집

잘못된 인터페이스 (잘못된 추상화 수준)를 사용한다는 점을 제외하고는 source code which seems to do exactly that이 발견되었습니다. 예 : 레이블은 현지화 된 Windows 버전 (이는 미친)으로 번역되며이 서비스를 사용할 수 없게 만듭니다.

wmi 성능 카운터를 사용하는 것이 최선의 방법 인 것처럼 보이지만 효율적으로 쿼리하고 싶습니다. 권장되는 해결 방법은 리프레서 개체를 사용하는 것입니다. 그러나이를 수행하는 방법을 모르겠습니다.

아무 래도 관련 I found an answer for querying the values once 여기에 참조로 포함됩니다.

질문 :

  • 어떻게 이전 링크를 5 초마다에서 볼 수 있듯이 디스크 통계를 조회하기위한 재교육 객체를 사용합니까?
  • (보너스 포인트) 성능 카운터 대신 wmi를 통해 데이터를 수집하기 위해 변경해야 할 사항은 the service mentioned before입니다.

감사

다음
+1

나는 조금 더 탐험하고 리프레쉬 객체가 vbscript 인 것으로 보인다. 그것이 일반적인 개념 인 것처럼 처음 보였다. – cstamas

답변

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 클래스와 함께 위의 코드를 사용하는 내가 할 수있는 브라우저에 JSON을 반환하는 ASP.NET MVC 서비스에서 몇 초마다 jQuery AJAX를 호출하고 제공된 데이터로 즉석에서 페이지를 구성합니다. 난이 도움이되기를 바랍니다

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; } 
    } 
} 

:
다음은 디스플레이로 쉽게 데이터를 만들기위한 내 DISKINFO 클래스입니다. 대답에 필요한 것이 있으면 알려주세요.

+0

정말 필요한 것은 매 5 초마다 효율적인 메트릭을 콘솔에 출력하는 방법입니다. JavaScript로 새로 고침하는 것은 완전히 다른 시나리오입니다. – cstamas

+0

리프레셔 객체에 대한 설명 http://msdn.microsoft.com/en-us/library/windows/desktop/aa393838(v=vs.85).aspx – cstamas

+1

100 % 완벽한 답변이 아니지만 어쨌든 허용되었습니다. – cstamas