Java AWS自定义CloudWatch指标-按自动缩放组聚合

Java AWS自定义CloudWatch指标-按自动缩放组聚合,java,amazon-web-services,amazon-ec2,amazon-cloudwatch,Java,Amazon Web Services,Amazon Ec2,Amazon Cloudwatch,我正在尝试使用JavaSDK设置一些自定义AWS CloudWatch指标 在文档中,我似乎找不到任何描述如何获取某些数据的内容,也找不到需要包含哪些数据 MetricDatum datum = new MetricDatum() .withDimensions( new Dimension() .withName("InstanceType").withValue(/* 1 */), new Dimension()

我正在尝试使用JavaSDK设置一些自定义AWS CloudWatch指标

在文档中,我似乎找不到任何描述如何获取某些数据的内容,也找不到需要包含哪些数据

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));
因此,问题(针对上述代码中的每个注释数字):

  • 使用Java AWS SDK,我从哪里获得要放在这里的数据
  • 使用Java AWS SDK,我从哪里获得要放在这里的数据
  • 我还需要包括哪些其他数据,以确保我可以按自动缩放组进行聚合? (按安全组聚合也可以)

  • 对于#1,我已经看到我可以通过常规HTTP调用来获取实例id,但我希望通过AWS SDK来实现这一点,如果有可用的方法的话。

    我将问题发布给了Amazon支持团队

    给出了一个URL列表,可以调用这些URL来获取一组元数据,包括InstanceType(问题1)、InstanceId(问题2)和安全组(问题3)

    可以使用获取所有自动缩放组的列表,然后迭代该列表,直到找到具有您自己的instanceId(使用上面列出的URL检索)的实例,从而获得自动缩放组:


    您可以按图像id进行聚合:

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

    通常,自动缩放组在专用映像上运行,因此这种方法应该有效。

    它不在javadocs中,但有一个名为的实用程序类,它将为您提供诸如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;
        }
    }
    

    尝试在AWS Java SDK的1.10.17版中实现同样的功能,而@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中尝试这一点,但在最新版本的AWS命令行客户端中(截至今天)使用了该功能

    new Dimension().withName("AutoScalingGroupName").withValue(asgName)
    
        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;
    }