2011-08-14 4 views
0

Comment puis-je obtenir l'utilisation du processeur d'une instance dans C#? J'ai déjà lu Amazon EC2 - how to get available ram and cpu usage via AWS API?, mais je n'arrive pas à le faire fonctionner.Utilisation du processeur d'une instance avec l'API Cloudwatch

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

Qu'avez-vous spécifiquement essayé? Publiez du code. Quelles erreurs spécifiques obtenez-vous? – Joe

+0

NameValueCollection appConfig = ConfigurationManager.AppSettings; var client = AWSClientFactory.CreateAmazonCloudWatchClient ( appConfig ["AWSAccessKey"], appConfig ["AWSSecretKey"] ); dimension var = new dimension { Name = "InstanceId", Value = "", }; var request = new GetMetricStatisticsRequest(); request.MetricName = "CPUUtilization"; – bill

+0

request.Period = 60; request.Statistics.Add ("Maximum"); request.Dimensions.Add (dimension); request.Namespace = "AWS/EC2"; request.Unit = "Pourcentage"; var currentTime = DateTime.UtcNow; var startTime = currentTime.AddSeconds (-5); chaîne currentTimeString = currentTime.ToString ("aaaa-MM-jjTHH: mm: ssZ"); chaîne startTimeString = startTime.ToString ("aaaa-MM-jjTHH: mm: ssZ"); – bill

Répondre

3

est ici une simple preuve de concept pour montrer l'utilisation du processeur au cours des deux derniers jours. Je pense qu'il y aura un point de données comme toutes les demi-heure, mais vous pouvez facilement changer en changeant la valeur de la propriété Period dans l'objet GetMetricStatisticsRequest.

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

nouveau AmazonCloudWatchConfig(). WithServiceURL ("https://eu-west-1.monitoring.amazonaws.com")); "WithServiceURL" n'existe pas? – bill

+0

modifiez-le pour définir la propriété .ServiceURL avec l'hôte approprié. – Joe

+0

@Joe j'utilise service url = "https://ec2.us-east-1.amazonaws.com/" et obtenir erreur La version demandée (2010-08-01) du service AmazonEC2 n'existe pas " – arun

0

Moyens noter également que lorsque vous voulez obtenir l'utilisation du processeur ou de tout autre type de mesure, il faut se méfier de l'horodatage vous inclure dans la demande. En effet, cela peut prendre plus de 48 heures pour que les données soient disponibles dans CloudWatch (selon Amazon). C'est pourquoi j'essaie personnellement de récupérer des données il y a environ 3-4 jours car parfois CloudWatch ne retournera aucune donnée même si la requête et le code sont corrects car il n'y a aucune donnée à publier depuis le précédent jour ou deux.

Pour plus d'informations, consultez cette URL et faites défiler jusqu'à StartTime: http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricStatistics.html

1

Ceci est mon code final qui fonctionne pour moi. J'ai ajouté un nouvel utilisateur dans la console de gestion d'aws d'IAM puis j'ai attaché la politique de CloudWatchfullacess au nouvel utilisateur alors j'ai employé cette clé secrète d'Accesskey & d'utilisateur dans ce code.

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