2011-08-14 19 views
0

C#에서 인스턴스의 CPU 사용량을 얻으려면 어떻게해야합니까? 이미 Amazon EC2 - how to get available ram and cpu usage via AWS API?을 읽었지만 제대로 작동하지 않습니다.CPU Cloudwatch API가있는 인스턴스 사용

NameValueCollection appConfig = ConfigurationManager.AppSettings;

 var client = AWSClientFactory.CreateAmazonCloudWatchClient(
       appConfig["AWSAccessKey"], 
       appConfig["AWSSecretKey"] 
       ); 

     var dimension = new Dimension 
      { 
        Name = "InstanceId", 
        Value = "<i-ad20b4db>", 
      }; 

     var request = new GetMetricStatisticsRequest(); 
     request.MetricName = "CPUUtilization"; 
     request.Period = 60; 
     request.Statistics.Add("Maximum"); 
     request.Dimensions.Add(dimension); 
     request.Namespace = "AWS/EC2"; 
     request.Unit = "Percent"; 

     var currentTime = DateTime.UtcNow; 
     var startTime = currentTime.AddSeconds(-5); 
     string currentTimeString= currentTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); 
     string startTimeString= startTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); 

     request.StartTime = Convert.ToDateTime(startTimeString); 
     request.EndTime = Convert.ToDateTime(currentTimeString); 

     var response = client.GetMetricStatistics(request); 

     if (response.GetMetricStatisticsResult.Datapoints.Count > 0) 
      { 
       var dataPoint = response.GetMetricStatisticsResult.Datapoints[0]; 
       Console.WriteLine("Instance: {0} CPU Max load: {1}", dimension.Value, dataPoint.Maximum); 

      } 
+2

특별히 시도한 것은 무엇입니까? 몇 가지 코드를 게시하십시오. 어떤 구체적인 오류가 발생합니까? – Joe

+0

NameValueCollection appConfig = ConfigurationManager.AppSettings; var client = AWSClientFactory.CreateAmazonCloudWatchClient ( appConfig [ "AWSAccessKey"], appConfig [ "AWSSecretKey"] ); VAR 치수 = 새로운 차원 {= "InstanceID에" 이름, 값 = "" }; var request = new GetMetricStatisticsRequest(); request.MetricName = "CPUUtilization"; – bill

+0

request.Period = 60; request.Statistics.Add ("Maximum"); 요청 .Dimensions.Add (dimension); request.Namespace = "AWS/EC2"; request.Unit = "퍼센트"; var currentTime = DateTime.UtcNow; var startTime = currentTime.AddSeconds (-5); 문자열 currentTimeString = currentTime.ToString ("yyyy-MM-ddTHH : mm : ssZ"); string startTimeString = startTime.ToString ("yyyy-MM-ddTHH : mm : ssZ"); – bill

답변

3

지난 2 일 동안의 CPU 사용률을 보여주는 간단한 개념 증명입니다. 30 분마다처럼 데이터 포인트가 있다고 생각하지만 GetMetricStatisticsRequest 객체의 Period 속성 값을 변경하여 쉽게 변경할 수 있습니다.

AmazonCloudWatch cw = AWSClientFactory.CreateAmazonCloudWatchClient(accessKey, secretKey, new AmazonCloudWatchConfig().WithServiceURL("https://eu-west-1.monitoring.amazonaws.com")); 

     DataTable data = new DataTable(); 
     try 
     { 
      Dimension dim = new Dimension() { Name = "InstanceId", Value = GetInstanceName(amazonInstance) }; 
      System.Collections.Generic.List<Dimension> dimensions = new List<Dimension>() { dim }; 

      string startTime = startTime = DateTimeOffset.Parse(DateTime.Now.AddDays(-2).ToString()).ToUniversalTime().ToString("s"); // "2010-09-29T11:00:00+01:00"; 

      GetMetricStatisticsRequest reg = new GetMetricStatisticsRequest() 
      { 
       MeasureName = "CPUUtilization", 
       Period = 1800 
       Statistics = new System.Collections.Generic.List<string>() { "Average" }, 
       Dimensions = dimensions, 
       Namespace = "AWS/EC2", 
       EndTime = DateTime.Now.ToUniversalTime().ToString("s"), //has to be in this format: 2010-09-29T14:00:00+01:00; 
       StartTime = startTime 
      }; 

      var points = cw.GetMetricStatistics(reg).GetMetricStatisticsResult.Datapoints.OrderBy(p => p.Timestamp); 

      data.Columns.Add("Average"); 
      data.Columns.Add("TimeStamp"); 
      foreach (var p in points) 
      { 
       DataRow row = data.NewRow(); 
       row["Average"] = Math.Round(p.Average, 0); 
       row["TimeStamp"] = DateTimeOffset.Parse(p.Timestamp).LocalDateTime.ToString("yyyy-MM-dd HH:mm"); 

       data.Rows.Add(row); 
      } 
     } 
    catch (AmazonCloudWatchException ex) 
       { 
        if (ex.ErrorCode.Equals("OptInRequired")) 
         throw new Exception("You are not signed in for Amazon EC2."); 
        else 
         throw; 
       } 
+0

new AmazonCloudWatchConfig(). WithServiceURL ("https://eu-west-1.monitoring.amazonaws.com")); "WithServiceURL"이 (가) 없습니다. – bill

+0

.ServiceURL 속성을 적절한 호스트로 설정하려면이 주소를 변경하십시오. – Joe

+0

@Joe 서비스 url = "https://ec2.us-east-1.amazonaws.com/"을 사용하고 오류가 발생했습니다. AmazonEC2의 요청 버전 (2010-08-01)이 존재하지 않습니다 " – arun

0

탄원 또한 CPU 사용량 또는 메트릭의 다른 유형을 얻고 싶은 경우에, 당신은 당신이 요청에 포함 타임 스탬프 조심해야합니다 있습니다. CloudWatch에서 데이터를 사용할 수있게하려면 48 시간 이상이 걸릴 수 있기 때문입니다 (Amazon에 따르면).

그 이유는 약 3-4 일 전부터 개인적으로 데이터를 검색하려고하는 이유입니다. CloudWatch는 요청 및 코드가 모두 정확하더라도 이전의 데이터를 게시 할 데이터가 없기 때문에 데이터를 반환하지 않습니다. 하루 또는 이틀.

자세한 내용은이 URL을 확인하고 상영 아래로 스크롤 : http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricStatistics.html

1

이 나를 위해 일 내 최종 코드입니다. IAM aws 관리 콘솔에 새 사용자를 추가 한 다음 새로운 사용자에게 CloudWatchfullacess 정책을 첨부 한 다음이 코드에이 사용자 액세스 키 & 비밀 키를 사용했습니다.

var cw =AWSClientFactory.CreateAmazonCloudWatchClient("AccessKey","secretkey",Amazon.RegionEndpoint.USWest2); 

    DataTable data = new DataTable(); 
    try 
    { 
     Dimension dim = new Dimension() { Name = "InstanceId", Value = "InstanceId of you EC2 Server" }; 
     System.Collections.Generic.List<Dimension> dimensions = new List<Dimension>() { dim }; 

     string startTime1 = DateTimeOffset.Parse(DateTime.Now.AddMinutes(-60).ToString()).ToUniversalTime().ToString("s"); 


     GetMetricStatisticsRequest reg = new GetMetricStatisticsRequest() 
     { 
      MetricName = "CPUUtilization", 
      Period = 60, 
      Statistics = new System.Collections.Generic.List<string>() { "Average","Minimum","Maximum" }, 
      Dimensions = dimensions, 
      Namespace = "AWS/EC2", 
      EndTime = DateTime.Now, //Convert.ToDateTime(DateTime.Now.ToUniversalTime().ToString("s")), //has to be in this format: 2010-09-29T14:00:00+01:00; 
      StartTime = DateTime.Now.AddHours(Convert.ToInt32(-15)),// Convert.ToDateTime(startTime1), 
     }; 

     var points = cw.GetMetricStatistics(reg).GetMetricStatisticsResult.Datapoints.OrderBy(p => p.Timestamp); 

     data.Columns.Add("Average"); 
     data.Columns.Add("TimeStamp"); 
     foreach (var p in points) 
     { 
      DataRow row = data.NewRow(); 
      row["Average"] = Math.Round(p.Average, 0); 
      row["TimeStamp"] = p.Timestamp; //DateTimeOffset.Parse(Convert.ToDateTime(p.Timestamp)).LocalDateTime.ToString("yyyy-MM-dd HH:mm"); 
      data.Rows.Add(row); 
     } 
     dataGridView1.DataSource = data; 


    } 
    catch (AmazonCloudWatchException ex) 
      { 
       if (ex.ErrorCode.Equals("OptInRequired")) 
        throw new Exception("You are not signed in for Amazon EC2."); 
       else 
        throw; 
      }