2012-03-30 10 views
9

Estoy intentando establecer algunas métricas personalizadas de AWS CloudWatch con el SDK de Java.AWS Métrica personalizada de CloudWatch: agregar por escala automática al grupo

Parece que no encuentro nada en la documentación que describa cómo obtener ciertos datos, ni qué datos necesito incluir.

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

Por lo tanto, las preguntas (por cada uno de los números comentadas en el código anterior):

  1. ¿Dónde puedo conseguir los datos para poner aquí, utilizando el SDK Java de AWS?
  2. ¿Dónde obtengo los datos para poner aquí, usando el Java AWS SDK?
  3. ¿Qué otros datos necesito incluir para asegurar que puedo agregar por grupo de escalado automático? (agregación por grupos de seguridad también estaría bien)

Para # 1, he visto que puedo hacer una llamada HTTP normal a http://169.254.169.254/latest/meta-data/instance-id para obtener la instancia-id, pero espero hacerlo todo a través de AWS SDK, si hay métodos disponibles para hacerlo.

Respuesta

9

Publiqué la pregunta al equipo de soporte de Amazon.

El EC2 documentation proporciona una lista de URL a las que se puede llamar para obtener un montón de metadatos, incluido InstanceType (pregunta 1), InstanceId (pregunta 2) y el grupo de seguridad (pregunta 3).

El grupo de escalado automático se puede obtener utilizando el AWS SDK for Java, obteniendo una lista de todos los grupos de escalado automático y luego recorriendo la lista hasta encontrar la instancia con su propio Id. De instancia (que se recuperó mediante la URL enumerados anteriormente):

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 para el seguimiento de la la solución, gracias! –

-1

puede agregarse por imagen Identificación:

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

Típicamente, un grupo de auto-escala se ejecuta en una imagen dedicada, por lo que este enfoque debería funcionar.

2

No está en los javadocs, pero hay una útil clase de utilidad llamada EC2MetadataUtils que le dará información de metadatos como InstanceType (1) e InstanceId (2).

En cuanto a conseguir el nombre ASG, AWS documents que

cuando se inicia una instancia en un grupo de Auto Scaling, Auto Scaling añade una etiqueta a la instancia con una clave de AWS: autoscaling: nombre de grupo y un valor del nombre del grupo de Auto Scaling

lo que puede ahorrar un poco de bucle con sólo ir a buscar las etiquetas para la instancia

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

el nombre de dimensión que se utiliza para asegurarse de que puede agruparse por Auto Scaling nombre del grupo es AutoScalingGroupName (3)

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

Tratando de poner en práctica este mismo con la versión 1.10.17 del AWS Java SDK, y la solución provista por @Tinclon en la respuesta aceptada solo devuelve nulo para el grupo de autoescalamiento. El siguiente fragmento, sin embargo, devolvió correctamente el grupo de escala automática para mí.

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

No he intentado esto con otras versiones del SDK, pero el functionality is equivalent con la funcionalidad en el (fecha de hoy) última versión del cliente de línea de comandos de AWS

Cuestiones relacionadas