in aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/contexts/LambdaSegmentContext.java [117:161]
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));
currentSubsegment.end();
if (recorder.getStreamingStrategy().requiresStreaming(currentSubsegment.getParentSegment())) {
recorder.getStreamingStrategy().streamSome(currentSubsegment.getParentSegment(), recorder.getEmitter());
}
segmentListeners
.stream()
.filter(Objects::nonNull)
.forEach(listener -> listener.afterEndSubsegment(currentSubsegment));
Entity parentEntity = current.getParent();
if (parentEntity instanceof FacadeSegment) {
if (((Subsegment) current).isSampled()) {
current.getCreator().getEmitter().sendSubsegment((Subsegment) current);
}
clearTraceEntity();
} else if (parentEntity instanceof NoOpSegment) {
clearTraceEntity();
} else {
setTraceEntity(current.getParent());
}
} else {
recorder.getContextMissingStrategy().contextMissing("Failed to end subsegment: subsegment cannot be found.",
SubsegmentNotFoundException.class);
}
}