in aws-xray-agent/src/main/java/com/amazonaws/xray/agent/runtime/handlers/downstream/AWSV2Handler.java [188:258]
public void handleResponse(Event event) {
AwsServiceDownstreamResponseEvent responseEvent = (AwsServiceDownstreamResponseEvent) event;
Subsegment subsegment = getSubsegmentOptional().orElse(null);
if (subsegment == null) {
return;
}
Map<String, Object> responseInformation = new HashMap<>();
// Retrieve the response parameters such as the table name, table size, etc.
Map<String, Object> parameterMap = extractResponseParameters(responseEvent);
subsegment.putAllAws(parameterMap);
// Detect throwable for the downstream call.
Throwable exception = responseEvent.getThrown();
if (exception != null && exception.getMessage() != null) {
subsegment.addException(exception);
subsegment.getCause().setMessage(exception.getMessage());
setRemoteForException(subsegment, exception);
}
// Store retry count
subsegment.putAws(EntityDataKeys.AWS.RETRIES_KEY, responseEvent.getRetryCount());
// Get status code an add it to the response map.
// TODO unify this in the XRayHandler superclass.
int responseCode = responseEvent.getStatusCode();
switch (responseCode/100) {
case 4:
subsegment.setError(true);
subsegment.setFault(false);
if (429 == responseCode) {
subsegment.setThrottle(true);
}
break;
case 5:
subsegment.setError(false);
subsegment.setFault(true);
break;
}
if (responseCode >= 0) {
responseInformation.put(STATUS_CODE_KEY, responseCode);
}
// Obtain the content length from the header map and store it in the subsegment
Map<String, List<String>> headerMap = responseEvent.getHeaderMap();
List<String> contentLengthList = headerMap.get(EntityHeaderKeys.HTTP.CONTENT_LENGTH_HEADER);
if (contentLengthList != null && contentLengthList.size() > 0) {
long contentLength = Long.parseLong(contentLengthList.get(0));
responseInformation.put(CONTENT_LENGTH_KEY, contentLength);
}
if (responseInformation.size() > 0) {
subsegment.putHttp(HTTP_RESPONSE_KEY, responseInformation);
}
// Store request ID
String requestId = responseEvent.getRequestId();
if (requestId != null) {
subsegment.putAws(EntityDataKeys.AWS.REQUEST_ID_KEY, requestId);
}
// Store extended ID
String extendedRequestId = extractExtendedRequestIdFromHeaderMap(responseEvent.getHeaderMap());
if (extendedRequestId != null) {
subsegment.putAws(EntityDataKeys.AWS.EXTENDED_REQUEST_ID_KEY, extendedRequestId);
}
endSubsegment();
}