/** * Begins a subsegment and passes it to the supplied consumer. Intercepts exceptions, adds them to the subsegment, and re-throws them. * * @param name * the name to use for the created subsegment * @param consumer * the function to invoke */ public void createSubsegment(String name, Consumer<Subsegment> consumer) { Subsegment subsegment = beginSubsegment(name); try { consumer.accept(subsegment); } catch (Exception e) { if (subsegment != null) { subsegment.addException(e); } throw e; } finally { endSubsegment(); } }
private Segment beginSegment(Segment segment) { SegmentContext context = getSegmentContext(); if (null == context) { return null; } Entity current; if ((current = getTraceEntity()) != null) { logger.error("Beginning new segment while another segment exists in the segment context. Overwriting current segment named '" + current.getName() + "' to start new segment named '" + segment.getName() + "'."); } segment.setAws(getAwsRuntimeContext()); if (null != getOrigin()){ segment.setOrigin(getOrigin()); } segment.putAllService(getServiceRuntimeContext()); setTraceEntity(segment); return context.beginSegment(this, segment); }
private void finalizeSubsegment(Request<?> request) { recorder.endSubsegment(); Long executingThreadContext = request.getHandlerContext(executingThreadKey); if (executingThreadContext != null && Thread.currentThread().getId() != executingThreadContext) { recorder.clearTraceEntity(); } }
public static Subsegment beginSubsegment(String name) { return globalRecorder.beginSubsegment(name); }
@Override public void beforeExecution(Context.BeforeExecution context, ExecutionAttributes executionAttributes) { AWSXRayRecorder recorder = getRecorder(); Entity origin = recorder.getTraceEntity(); Subsegment subsegment = recorder.beginSubsegment(executionAttributes.getAttribute((SdkExecutionAttribute.SERVICE_NAME))); if (subsegment == null) { return; } subsegment.setNamespace(Namespace.AWS.toString()); subsegment.putAws(EntityDataKeys.AWS.OPERATION_KEY, executionAttributes.getAttribute(SdkExecutionAttribute.OPERATION_NAME)); Region region = executionAttributes.getAttribute(AwsExecutionAttribute.AWS_REGION); if (region != null) { subsegment.putAws(EntityDataKeys.AWS.REGION_KEY, region.id()); } subsegment.putAllAws(extractRequestParameters(context, executionAttributes)); if (accountId != null) { subsegment.putAws(EntityDataKeys.AWS.ACCOUNT_ID_SUBSEGMENT_KEY, accountId); } recorder.setTraceEntity(origin); // store the subsegment in the AWS SDK's executionAttributes so it can be accessed across threads executionAttributes.putAttribute(entityKey, subsegment); }
if (isSubsegmentDuplicate(recorder.getCurrentSubsegmentOptional(), request)) { return; recorder.setTraceEntity(entityContext); Subsegment currentSubsegment = recorder.beginSubsegment(serviceName); if (null == currentSubsegment) { return; if (null != recorder.getCurrentSegment()) { TraceHeader header = new TraceHeader(recorder.getCurrentSegment().getTraceId(), recorder.getCurrentSegment().isSampled() ? currentSubsegment.getId() : null, recorder.getCurrentSegment().isSampled() ? SampleDecision.SAMPLED : SampleDecision.NOT_SAMPLED); request.addHeader(TraceHeader.HEADER_KEY, header.toString());
/** * Ends a segment. * * @throws SegmentNotFoundException * if {@code contextMissingStrategy} throws exceptions and no segment is currently in progress */ public void endSegment() { SegmentContext context = getSegmentContext(); if (null != context) { context.endSegment(this); } Entity current; if ((current = getTraceEntity()) != null) { Segment segment = current.getParentSegment(); logger.debug("Ending segment named '" + segment.getName() + "'."); if(segment.end()) { sendSegment(segment); } else { logger.debug("Not emitting segment named '" + segment.getName() + "' as it parents in-progress subsegments."); } clearTraceEntity(); } else { getContextMissingStrategy().contextMissing("Failed to end segment: segment cannot be found.", SegmentNotFoundException.class); } }
public static void endSubsegment() { globalRecorder.endSubsegment(); }
private void processEvent(AsyncEvent event) throws IOException { AWSXRayRecorder recorder = getRecorder(); Entity prior = recorder.getTraceEntity(); try { Entity entity = (Entity) event.getSuppliedRequest().getAttribute(ENTITY_ATTRIBUTE_KEY); recorder.setTraceEntity(entity); if (null != event.getThrowable()) { entity.addException(event.getThrowable()); } filter.postFilter(event.getSuppliedRequest(), event.getSuppliedResponse()); } finally { recorder.setTraceEntity(prior); } }
@Override public void endSubsegment(AWSXRayRecorder recorder) { Entity current = getTraceEntity(); if (current instanceof Subsegment) { if (logger.isDebugEnabled()) { logger.debug("Ending subsegment named: " + current.getName()); } Subsegment currentSubsegment = (Subsegment) current; if (currentSubsegment.end()) { recorder.sendSegment(currentSubsegment.getParentSegment()); } else { if (recorder.getStreamingStrategy().requiresStreaming(currentSubsegment.getParentSegment())) { recorder.getStreamingStrategy().streamSome(currentSubsegment.getParentSegment(), recorder.getEmitter()); } setTraceEntity(current.getParent()); } } else { recorder.getContextMissingStrategy().contextMissing("Failed to end subsegment: subsegment cannot be found.", SubsegmentNotFoundException.class); } } }
public static Entity getTraceEntity() { return globalRecorder.getTraceEntity(); }
private static ContextMissingStrategy getContextMissingStrategy() { return AWSXRay.getGlobalRecorder().getContextMissingStrategy(); }
public static void setTraceEntity(Entity entity) { globalRecorder.setTraceEntity(entity); }
public void postFilter(ServletRequest request, ServletResponse response) { AWSXRayRecorder recorder = getRecorder(); Segment segment = recorder.getCurrentSegment(); if (null != segment) { HttpServletResponse httpServletResponse = castServletResponse(response); recorder.endSegment();
public static Optional<Subsegment> getCurrentSubsegmentOptional() { return globalRecorder.getCurrentSubsegmentOptional(); }
public static Segment getCurrentSegment() { return globalRecorder.getCurrentSegment(); }
public static void clearTraceEntity() { globalRecorder.clearTraceEntity(); }
public static Subsegment beginSubsegment(String name) { return globalRecorder.beginSubsegment(name); }
@Override public void beforeExecution(Context.BeforeExecution context, ExecutionAttributes executionAttributes) { AWSXRayRecorder recorder = getRecorder(); Entity origin = recorder.getTraceEntity(); Subsegment subsegment = recorder.beginSubsegment(executionAttributes.getAttribute((SdkExecutionAttribute.SERVICE_NAME))); if (subsegment == null) { return; } subsegment.setNamespace(Namespace.AWS.toString()); subsegment.putAws(EntityDataKeys.AWS.OPERATION_KEY, executionAttributes.getAttribute(SdkExecutionAttribute.OPERATION_NAME)); Region region = executionAttributes.getAttribute(AwsExecutionAttribute.AWS_REGION); if (region != null) { subsegment.putAws(EntityDataKeys.AWS.REGION_KEY, region.id()); } subsegment.putAllAws(extractRequestParameters(context, executionAttributes)); if (accountId != null) { subsegment.putAws(EntityDataKeys.AWS.ACCOUNT_ID_SUBSEGMENT_KEY, accountId); } recorder.setTraceEntity(origin); // store the subsegment in the AWS SDK's executionAttributes so it can be accessed across threads executionAttributes.putAttribute(entityKey, subsegment); }
/** * Ends a segment. * * @throws SegmentNotFoundException * if {@code contextMissingStrategy} throws exceptions and no segment is currently in progress */ public void endSegment() { SegmentContext context = getSegmentContext(); if (null != context) { context.endSegment(this); } Entity current; if ((current = getTraceEntity()) != null) { Segment segment = current.getParentSegment(); logger.debug("Ending segment named '" + segment.getName() + "'."); if(segment.end()) { sendSegment(segment); } else { logger.debug("Not emitting segment named '" + segment.getName() + "' as it parents in-progress subsegments."); } clearTraceEntity(); } else { getContextMissingStrategy().contextMissing("Failed to end segment: segment cannot be found.", SegmentNotFoundException.class); } }