2012-03-30 9 views
9

Tôi đang cố gắng đặt một số chỉ số AWS CloudWatch tùy chỉnh bằng cách sử dụng SDK Java.Số liệu AWS tùy chỉnh CloudWatch - Tổng hợp theo nhóm Tự động chia tỷ lệ

Tôi dường như không tìm thấy bất kỳ điều gì trong tài liệu mô tả cách lấy một số dữ liệu nhất định hoặc dữ liệu tôi cần đưa vào.

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

Vì vậy, câu hỏi (cho mỗi số nhận xét trong đoạn code trên):

  1. Nơi nào tôi nhận được dữ liệu để đưa đây, bằng cách sử dụng Java AWS SDK?
  2. Tôi lấy dữ liệu để đặt ở đâu, sử dụng SDK Java AWS?
  3. Tôi cần bao gồm những dữ liệu nào khác để đảm bảo tôi có thể tổng hợp theo nhóm tự động mở rộng? (tập hợp theo nhóm an ninh cũng sẽ ổn thôi)

Đối # 1, tôi đã nhìn thấy rằng tôi có thể thực hiện cuộc gọi HTTP thông thường để http://169.254.169.254/latest/meta-data/instance-id để có được những ví dụ-id, nhưng tôi hy vọng để làm điều này tất cả thông qua SDK AWS, nếu có sẵn phương pháp để làm như vậy.

Trả lời

9

Tôi đã đăng câu hỏi lên nhóm hỗ trợ Amazon.

EC2 documentation cung cấp danh sách URL có thể được gọi để lấy một loạt siêu dữ liệu, bao gồm InstanceType (câu hỏi 1), InstanceId (câu hỏi 2) và nhóm bảo mật (câu hỏi 3).

Nhóm quy mô tự động có thể lấy bằng cách sử dụng AWS SDK for Java, bằng cách nhận danh sách tất cả các nhóm tự động chia tỷ lệ và sau đó lặp qua danh sách đó cho đến khi bạn tìm thấy cá thể đó với instanceId của riêng bạn (đã được truy xuất bằng URL liệt kê ở trên):

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 đã theo sát cuộc giải pháp, cảm ơn! –

-1

Bạn có thể tổng hợp bởi id hình ảnh:

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

Thông thường, một nhóm tự động quy mô chạy trên một hình ảnh chuyên dụng, vì vậy phương pháp này nên làm việc.

2

Nó không có trong javadocs, nhưng có một lớp tiện ích tiện dụng gọi là EC2MetadataUtils sẽ cung cấp cho bạn thông tin siêu dữ liệu như InstanceType (1) và InstanceId (2).

Theo như nhận tên ASG, AWS documents rằng

khi bạn khởi động một thể hiện trong một nhóm Auto Scaling, Auto Scaling thêm một thẻ để thể hiện với một chìa khóa của AWS: autoscaling: groupName và một giá trị của tên của nhóm Auto Scaling

vì vậy, bạn có thể tiết kiệm một chút vòng lặp bằng cách chỉ lấy các thẻ cho các trường hợp

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

Tên Dimension bạn sẽ sử dụng để đảm bảo bạn có thể tổng hợp bằng Auto Scaling Group Name là AutoScalingGroupName (3)

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

Đang cố gắng để thực hiện điều này tương tự với phiên bản 1.10.17 của SDK Java AWS và giải pháp được cung cấp bởi @Tinclon trong câu trả lời được chấp nhận chỉ trả về giá trị rỗng cho nhóm tự động chia tỷ lệ. Đoạn mã sau, tuy nhiên, đã trả lại chính xác nhóm chia tỷ lệ tự động cho tôi.

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

Tôi không thử điều này với các phiên bản khác của SDK, nhưng functionality is equivalent với các chức năng trong (tính đến nay) phiên bản mới nhất của AWS dòng lệnh client