public void beforeRequest()

in aws-xray-recorder-sdk-aws-sdk/src/main/java/com/amazonaws/xray/handlers/TracingHandler.java [166:207]


    public void beforeRequest(Request<?> request) {
        String serviceName = extractServiceName(request);
        String operationName = extractOperationName(request);

        if (S3_SERVICE_NAME.equals(serviceName) && S3_PRESIGN_REQUEST.equals(operationName)) {
            return;
        }

        if (XRAY_SERVICE_NAME.equals(serviceName) && (XRAY_SAMPLING_RULE_REQUEST.equals(operationName)
                || XRAY_SAMPLING_TARGET_REQUEST.equals(operationName))) {
            return;
        }

        if (isSubsegmentDuplicate(recorder.getCurrentSubsegmentOptional(), request)) {
            return;
        }
        Entity entityContext = request.getHandlerContext(ENTITY_KEY);
        if (null != entityContext) {
            recorder.setTraceEntity(entityContext);
        }

        Subsegment currentSubsegment = recorder.beginSubsegment(serviceName);
        currentSubsegment.putAllAws(extractRequestParameters(request));
        currentSubsegment.putAws(EntityDataKeys.AWS.OPERATION_KEY, operationName);
        if (null != accountId) {
            currentSubsegment.putAws(EntityDataKeys.AWS.ACCOUNT_ID_SUBSEGMENT_KEY, accountId);
        }
        currentSubsegment.setNamespace(Namespace.AWS.toString());

        if (recorder.getCurrentSegment() != null && recorder.getCurrentSubsegment().shouldPropagate()) {
            // If no-op, only propagate root trace ID to not taint sampling decision
            TraceHeader t = TraceHeader.fromEntity(currentSubsegment);
            if (currentSubsegment.getParentSegment() instanceof NoOpSegment) {
                request.addHeader(
                        TraceHeader.HEADER_KEY,
                        "Root=" + t.getRootTraceId().toString());
            } else {
                // This will propagate Parent and Sampled
                request.addHeader(TraceHeader.HEADER_KEY, t.toString());
            }
        }
    }