Пользовательские показатели AWS CloudWatch - агрегирование по группе автоматического масштабирования - PullRequest
9 голосов
/ 31 марта 2012

Я пытаюсь установить некоторые пользовательские метрики AWS CloudWatch с помощью Java SDK.

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

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. Где я могу получить данные для размещения здесь, используя JavaAWS SDK?
  2. Где взять данные для размещения здесь, используя Java AWS SDK?
  3. Какие еще данные мне нужно включить, чтобы обеспечить возможность агрегирования при автоматическом масштабированиигруппа?(агрегирование по группам безопасности также было бы хорошо)

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

Ответы [ 4 ]

9 голосов
/ 04 апреля 2012

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

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

Группу автоматического масштабирования можно получить с помощью AWS SDK для 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();
        }
    }
}
2 голосов
/ 21 апреля 2015

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

Что касается получения имени ASG, AWS документы , что

при запуске экземпляра в группе автоматического масштабирования автоматическое масштабирование добавляет к экземпляру тег с ключом aws: autoscaling: groupName и значением имени группы автоматического масштабирования

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

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

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

new Dimension().withName("AutoScalingGroupName").withValue(asgName)
0 голосов
/ 14 сентября 2015

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

    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, но функциональность эквивалентна с функциональностью (на сегодня) последней версии командной строки AWSклиент

0 голосов
/ 27 февраля 2014

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

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

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

...