AWS Lambda
Guia do desenvolvedor

Instrumentação do código Java no AWS Lambda

No Java, você pode ter que emitir subsegmentos do Lambda para X-Ray para mostrar informações sobre chamadas downstream para outros serviços da AWS criados pela sua função. Para aproveitar esta capacidade, inclua o AWS X-Ray SDK para Java no seu pacote de implantação. Nenhuma mudança de código é necessária. Enquanto você estiver usando uma versão AWS SDK 1.11.48 ou posterior, não é necessário adicionar quaisquer linhas de código adicionais para chamadas downstream da sua função para serem rastreadas.

O SDK da AWS importará dinamicamente o SDK do X-Ray para emitir subsegmentos para chamadas downstream feitas por sua função. Ao usar o SDK do X-Ray para Java, você pode instrumentar seu código para emitir subsegmentos personalizados e/ou adicionar anotações ao seus segmentos do X-Ray.

O exemplo a seguir usa o SDK do X-Ray para Java para instrumentar uma função Lambda para emitir um subsegmento personalizado e enviar uma anotação personalizada para o X-Ray:

package uptime; import java.io.IOException; import java.time.Instant; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import com.amazonaws.regions.Regions; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.xray.AWSXRay; import com.amazonaws.xray.proxies.apache.http.HttpClientBuilder; public class Hello { private static final Log logger = LogFactory.getLog(Hello.class); private static final AmazonDynamoDB dynamoClient; private static final HttpClient httpClient; static { dynamoClient = AmazonDynamoDBClientBuilder.standard().withRegion(Regions.US_EAST_1).build(); httpClient = HttpClientBuilder.create().build(); } public void checkUptime(Context context) { AWSXRay.createSubsegment("makeRequest", (subsegment) -> { HttpGet request = new HttpGet("https://aws.amazon.com/"); boolean is2xx = false; try { HttpResponse response = httpClient.execute(request); is2xx = (response.getStatusLine().getStatusCode() / 100) == 2; subsegment.putAnnotation("responseCode", response.getStatusLine().getStatusCode()); } catch (IOException ioe) { logger.error(ioe); } Map<String, AttributeValue> item = new HashMap<>(); item.put("Timestamp", new AttributeValue().withN("" + Instant.now().getEpochSecond())); item.put("2xx", new AttributeValue().withBOOL(is2xx)); dynamoClient.putItem("amazon-2xx", item); }); } }

Veja a seguir como se parece um rastreamento emitido pelo código precedente (invocação síncrona):