in aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/contexts/ThreadLocalSegmentContext.java [63:99]
public void endSubsegment(AWSXRayRecorder recorder) {
Entity current = getTraceEntity();
if (current instanceof Subsegment) {
if (logger.isDebugEnabled()) {
if (current.getName().isEmpty() && !current.getParentSegment().isSampled()) {
logger.debug("Ending no-op subsegment");
} else {
logger.debug("Ending subsegment named: " + current.getName());
}
}
Subsegment currentSubsegment = (Subsegment) current;
List<SegmentListener> segmentListeners = recorder.getSegmentListeners();
segmentListeners
.stream()
.filter(Objects::nonNull)
.forEach(listener -> listener.beforeEndSubsegment(currentSubsegment));
if (currentSubsegment.end() && currentSubsegment.isSampled()) {
recorder.sendSegment(currentSubsegment.getParentSegment());
} else {
if (recorder.getStreamingStrategy().requiresStreaming(currentSubsegment.getParentSegment())) {
recorder.getStreamingStrategy().streamSome(currentSubsegment.getParentSegment(), recorder.getEmitter());
}
segmentListeners
.stream()
.filter(Objects::nonNull)
.forEach(listener -> listener.afterEndSubsegment(currentSubsegment));
setTraceEntity(current.getParent());
}
} else {
recorder.getContextMissingStrategy().contextMissing("Failed to end subsegment: subsegment cannot be found.",
SubsegmentNotFoundException.class);
}
}