public void handleResponse()

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