Java AWS自定义CloudWatch指标-按自动缩放组聚合
我正在尝试使用JavaSDK设置一些自定义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()
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,我已经看到我可以通过常规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;
}