public static void addRequestInformation(Subsegment subsegment, HttpRequest request, String url) { subsegment.setNamespace(Namespace.REMOTE.toString()); Segment parentSegment = subsegment.getParentSegment(); TraceHeader header = new TraceHeader(parentSegment.getTraceId(), parentSegment.isSampled() ? subsegment.getId() : null, parentSegment.isSampled() ? SampleDecision.SAMPLED : SampleDecision.NOT_SAMPLED); request.addHeader(TraceHeader.HEADER_KEY, header.toString()); Map<String, Object> requestInformation = new HashMap<>(); requestInformation.put("url", url); requestInformation.put("method", request.getRequestLine().getMethod()); subsegment.putHttp("request", requestInformation); }
/** * Begins a segment and passes it to the supplied consumer. Intercepts exceptions, adds them to the segment, and re-throws them. * * @param name * the name to use for the created segment * @param consumer * the function to invoke */ public void createSegment(String name, Consumer<Segment> consumer) { Segment segment = beginSegment(name); try { consumer.accept(segment); } catch (Exception e) { segment.addException(e); throw e; } finally { endSegment(); } }
@Override public boolean end() { if (logger.isDebugEnabled()) { logger.debug("Subsegment named '" + getName() + "' ending. Parent segment named '" + parentSegment.getName() + "' has reference count " + parentSegment.getReferenceCount()); } if (getEndTime() < Double.MIN_NORMAL) { setEndTime(Instant.now().toEpochMilli() / 1000.0d); } setInProgress(false); boolean shouldEmit = parentSegment.decrementReferenceCount() && parentSegment.isSampled(); if (shouldEmit) { checkAlreadyEmitted(); setEmitted(true); } return shouldEmit; }
/** * {@inheritDoc} * * Indicates that the provided segment requires streaming when it has been marked for sampling and its tree of subsegments reaches a size greater than {@code maxSegmentSize}. * * @see StreamingStrategy#requiresStreaming(Segment) */ public boolean requiresStreaming(Segment segment) { if (segment.isSampled() && null != segment.getTotalSize()) { return segment.getTotalSize().intValue() > maxSegmentSize; } return false; }
/** * Checks whether the current {@code SamplingStrategy} supports forced sampling. * * @return true if forced sampling is supported and the current segment was changed from not sampled to sampled. */ public boolean forceSamplingOfCurrentSegment() { if (samplingStrategy.isForcedSamplingSupported()) { Segment segment = getCurrentSegment(); if (!segment.isSampled()) { segment.setSampled(true); return true; } } return false; }
if (samplingResponse.getRuleName().isPresent()) { logger.debug("Sampling strategy decided to use rule named: " + samplingResponse.getRuleName().get() + "."); created.setRuleName(samplingResponse.getRuleName().get()); created.setSampled(false); } else { created = recorder.beginDummySegment(traceId); created.putHttp("request", requestAttributes); if (incomingHeader.isPresent()) { responseHeader = new TraceHeader(created.getTraceId()); if (SampleDecision.REQUESTED == incomingHeader.get().getSampled()) { responseHeader.setSampled(created.isSampled() ? SampleDecision.SAMPLED : SampleDecision.NOT_SAMPLED); responseHeader = new TraceHeader(created.getTraceId());
private ObjectNode getStreamSerializeObjectNode() { ObjectNode obj = (ObjectNode) mapper.valueToTree(this); obj.put("type", "subsegment"); obj.put("parent_id", getParent().getId()); obj.put("trace_id", parentSegment.getTraceId().toString()); return obj; }
/** * Sends a segment to the emitter if the segment is marked as sampled. * * @param segment * the segment to send * @return * true if the segment was emitted succesfully. */ public boolean sendSegment(Segment segment) { if (segment.isSampled()) { return emitter.sendSegment(segment); } return false; }
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); }
/** * 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); } }
if (samplingResponse.getRuleName().isPresent()) { logger.debug("Sampling strategy decided to use rule named: " + samplingResponse.getRuleName().get() + "."); created.setRuleName(samplingResponse.getRuleName().get()); created.setSampled(false); } else { created = recorder.beginDummySegment(traceId); created.putHttp("request", requestAttributes); if (incomingHeader.isPresent()) { responseHeader = new TraceHeader(created.getTraceId()); if (SampleDecision.REQUESTED == incomingHeader.get().getSampled()) { responseHeader.setSampled(created.isSampled() ? SampleDecision.SAMPLED : SampleDecision.NOT_SAMPLED); responseHeader = new TraceHeader(created.getTraceId());
private ObjectNode getStreamSerializeObjectNode() { ObjectNode obj = (ObjectNode) mapper.valueToTree(this); obj.put("type", "subsegment"); obj.put("parent_id", getParent().getId()); obj.put("trace_id", parentSegment.getTraceId().toString()); return obj; }
/** * Sends a segment to the emitter if the segment is marked as sampled. * * @param segment * the segment to send * @return * true if the segment was emitted succesfully. */ public boolean sendSegment(Segment segment) { if (segment.isSampled()) { return emitter.sendSegment(segment); } return false; }
/** * {@inheritDoc} * * Indicates that the provided segment requires streaming when it has been marked for sampling and its tree of subsegments reaches a size greater than {@code maxSegmentSize}. * * @see StreamingStrategy#requiresStreaming(Segment) */ public boolean requiresStreaming(Segment segment) { if (segment.isSampled() && null != segment.getTotalSize()) { return segment.getTotalSize().intValue() > maxSegmentSize; } return false; }
/** * Checks whether the current {@code SamplingStrategy} supports forced sampling. * * @return true if forced sampling is supported and the current segment was changed from not sampled to sampled. */ public boolean forceSamplingOfCurrentSegment() { if (samplingStrategy.isForcedSamplingSupported()) { Segment segment = getCurrentSegment(); if (!segment.isSampled()) { segment.setSampled(true); return true; } } return false; }
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); }
/** * 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 addRequestInformation(Subsegment subsegment, HttpRequest request, String url) { subsegment.setNamespace(Namespace.REMOTE.toString()); Segment parentSegment = subsegment.getParentSegment(); TraceHeader header = new TraceHeader(parentSegment.getTraceId(), parentSegment.isSampled() ? subsegment.getId() : null, parentSegment.isSampled() ? SampleDecision.SAMPLED : SampleDecision.NOT_SAMPLED); request.addHeader(TraceHeader.HEADER_KEY, header.toString()); Map<String, Object> requestInformation = new HashMap<>(); requestInformation.put("url", url); requestInformation.put("method", request.getRequestLine().getMethod()); subsegment.putHttp("request", requestInformation); }
@Override public boolean end() { if (logger.isDebugEnabled()) { logger.debug("Subsegment named '" + getName() + "' ending. Parent segment named '" + parentSegment.getName() + "' has reference count " + parentSegment.getReferenceCount()); } if (getEndTime() < Double.MIN_NORMAL) { setEndTime(Instant.now().toEpochMilli() / 1000.0d); } setInProgress(false); boolean shouldEmit = parentSegment.decrementReferenceCount() && parentSegment.isSampled(); if (shouldEmit) { checkAlreadyEmitted(); setEmitted(true); } return shouldEmit; }
/** * * @throws SegmentNotFoundException * if {@code contextMissingStrategy} throws exceptions and no segment or subsegment is currently in progress * @return the trace ID of the {@code Segment} currently in progress, or {@code null} if {@code contextMissingStrategy} suppresses exceptions and no segment or subsegment is currently in progress */ public TraceID currentTraceId() { SegmentContext context = getSegmentContext(); if (null == context) { return null; } Entity current = context.getTraceEntity(); if (null != current) { return current.getParentSegment().getTraceId(); } else { contextMissingStrategy.contextMissing("Failed to get current trace ID: segment cannot be found.", SegmentNotFoundException.class); return null; } }