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