2012-03-30 6 views
9

Я пытаюсь установить некоторые пользовательские показатели AWS CloudWatch с помощью Java SDK.AWS Custom CloudWatch metrics - Агрегат с помощью команды Auto-Scaling

Я не могу найти ничего в документации, описывающей, как получить определенные части данных, а также какие данные мне нужно включить.

MetricDatum datum = new MetricDatum() 
    .withDimensions(
     new Dimension() 
      .withName("InstanceType").withValue(/* 1 */), 
     new Dimension() 
      .withName("InstanceId").withValue(/* 2 */) 
     /* 3 */ 
    .withMetricName("My metric").withTimestamp(new Date()) 
    .withUnit("Percent").withValue(new Double(55.0)); 

Итак, вопросы (для каждого из комментируемых чисел в коде выше):

  1. Где я могу получить данные, чтобы поместить здесь, используя Java AWS SDK?
  2. Где я могу получить данные здесь, используя Java AWS SDK?
  3. Какие еще данные необходимо включить, чтобы обеспечить возможность агрегирования с помощью группы автомасштабирования? (агрегирование группы безопасности также будет в порядке)

Для # 1, я видел, что я могу сделать обычный HTTP вызов http://169.254.169.254/latest/meta-data/instance-id получить экземпляр идентификатор, но я надеюсь сделать это все через AWS SDK, если есть доступные методы.

ответ

9

Я отправил вопрос в службу поддержки Amazon.

EC2 documentation содержит список URL-адресов, которые могут быть вызваны, чтобы захватить кучу метаданных, включая экземпляр InstanceType (вопрос 1), экземпляр (вопрос 2) и группу безопасности (вопрос 3).

Группа автомасштабирования может быть получена с помощью AWS SDK for Java, получив список всех групп автомасштабирования, а затем итерацию через этот список, пока вы не найдете экземпляр с вашим собственным экземпляром instanceId (который был получен с использованием URL-адреса перечисленных выше):

String instanceId = "Your-InstanceId"; 
AmazonAutoScalingClient amazonAutoScalingClient = new AmazonAutoScalingClient(new BasicAWSCredentials(accessKey, secretKey)); 
DescribeAutoScalingGroupsResult describeAutoScalingGroupsResult = amazonAutoScalingClient.describeAutoScalingGroups(); 
for(AutoScalingGroup autoScalingGroup : describeAutoScalingGroupsResult.getAutoScalingGroups()) { 
    for(Instance instance : autoScalingGroup.getInstances()) { 
     if(instance.getInstanceId().equals(instanceId)) { 
      return autoScalingGroup.getAutoScalingGroupName(); 
     } 
    } 
} 
+1

+1 за добивание решение, спасибо! –

-1

Вы можете агрегировать по идентификатору изображения:

curl http://169.254.169.254/latest/meta-data/ami-id 

Как правило, авто масштаба группа работает на выделенном изображении, так что этот подход должен работать.

2

Это не в javadocs, но есть удобный класс утилиты под названием EC2MetadataUtils, который даст вам информацию метаданных, такую ​​как InstanceType (1) и InstanceId (2).

Насколько получает имя ASG, AWS documents что

при запуске экземпляра в группе Auto Scaling, Auto Scaling добавляет метку к примеру с ключом AWS: автомасштабированиями: Groupname и значение имени группы Auto Scaling

Таким образом, вы можете сэкономить немного зацикливание, просто извлечения тегов для экземпляра

String instanceId = EC2MetadataUtils.getInstanceId(); 

String asgName = null; 
List<TagDescription> tagDescriptions = new AmazonEC2Client().describeTags(
     new DescribeTagsRequest().withFilters(
      new Filter().withName("resource-id").withValues(instanceId) 
     ) 
).getTags(); 
for (TagDescription tagDescription : tagDescriptions) { 
    if ("aws:autoscaling:groupName".equals(tagDescription.getKey())) { 
     asgName = tagDescription.getValue(); 
     break; 
    } 
} 

Имени Dimension вы будете использовать, чтобы гарантировать, что Вы можете агрегировать на Auto Scaling Название группы является AutoScalingGroupName (3)

new Dimension().withName("AutoScalingGroupName").withValue(asgName) 
0

Попытки реализовать такую ​​же вещь с версией 1.10.17 из SDS Java SDK, а решение, предоставленное @Tinclon в принятом ответе, возвращает null только для группы автоматического масштабирования. Однако следующий фрагмент корректно возвращает группу автомасштабирования для меня.

String getAutoscalingGroup(final String instanceId) { 
    final DescribeAutoScalingInstancesRequest describeRequest = new DescribeAutoScalingInstancesRequest().withInstanceIds(Collections.singleton(instanceId)); 
    final DescribeAutoScalingInstancesResult result = autoScalingClient.describeAutoScalingInstances(describeRequest); 

    for (AutoScalingInstanceDetails details : result.getAutoScalingInstances()) { 
     if (StringUtils.equals(instanceId, details.getInstanceId())) { 
      return details.getAutoScalingGroupName(); 
     } 
    } 

    return null; 
} 

Я не пробовал это с другими версиями SDK, но functionality is equivalent с функциональностью в (на сегодняшний день) последняя версия командной строки AWS клиента

Смежные вопросы