public void TestSubsegmentStreamingParentSubsegmentDoNotGetRemoved() { _recorder.BeginSegment(GetType().Name, TraceId); var segment = (Segment)TraceContext.GetEntity(); _recorder.BeginSubsegment("parent"); for (int i = 0; i < 98; i++) { _recorder.BeginSubsegment("job" + i); _recorder.EndSubsegment(); } _recorder.BeginSubsegment("last job"); var lastJob = (Subsegment)TraceContext.GetEntity(); // End parent subsegment, and trigger subsegment stream TraceContext.SetEntity(lastJob.Parent); _recorder.EndSubsegment(); Assert.AreEqual(2, segment.Size); Assert.AreEqual(1, segment.Subsegments.Count); Assert.AreEqual(1, segment.Subsegments[0].Subsegments.Count); TraceContext.ClearEntity(); }
/// <summary> /// Begin a tracing subsegment. A new segment will be created and added as a subsegment to previous segment. /// </summary> /// <param name="name">Name of the operation.</param> /// <exception cref="ArgumentNullException">The argument has a null value.</exception> /// <exception cref="EntityNotAvailableException">Entity is not available in trace context.</exception> public override void BeginSubsegment(string name) { try { if (IsTracingDisabled()) { _logger.DebugFormat("X-Ray tracing is disabled, do not start subsegment"); return; } // If the request is not sampled, a segment will still be available in TraceContext to // stores the information of the trace. The trace information will still propagated to // downstream service, in case downstream may overwrite the sample decision. Entity parentEntity = TraceContext.GetEntity(); // If the segment is not sampled, do nothing and exit. if (parentEntity.Sampled != SampleDecision.Sampled) { _logger.DebugFormat("Do not start subsegment because the segment doesn't get sampled. ({0})", name); return; } Subsegment subsegment = new Subsegment(name); parentEntity.AddSubsegment(subsegment); subsegment.Sampled = parentEntity.Sampled; subsegment.SetStartTimeToNow(); TraceContext.SetEntity(subsegment); } catch (EntityNotAvailableException e) { HandleEntityNotAvailableException(e, "Failed to start subsegment because the parent segment is not available."); } }
public void TestSyncGet() { var segment = new Segment("test", TraceId); TraceContext.SetEntity(segment); var later = TraceContext.GetEntity(); Assert.ReferenceEquals(segment, later); }
/// <summary> /// Begin a tracing segment. A new tracing segment will be created and started. /// </summary> /// <param name="name">The name of the segment.</param> /// <param name="traceId">Trace id of the segment.</param> /// <param name="parentId">Unique id of the upstream remote segment or subsegment where the downstream call originated from.</param> /// <param name="sampleDecision">Sample decision for the segment from upstream service.</param> /// <exception cref="ArgumentNullException">The argument has a null value.</exception> public override void BeginSegment(string name, string traceId = null, string parentId = null, SampleDecision sampleDecision = SampleDecision.Sampled) { Segment newSegment = new Segment(name, traceId, parentId); if (!IsTracingDisabled()) { newSegment.SetStartTimeToNow(); //sets current timestamp PopulateNewSegmentAttributes(newSegment); } newSegment.Sampled = sampleDecision; TraceContext.SetEntity(newSegment); }
public async Task TestAsyncGet() { var origin = new Subsegment("test"); TraceContext.SetEntity(origin); Entity later = null; await Task.Run(() => { later = TraceContext.GetEntity(); }); Assert.ReferenceEquals(origin, later); }
public async Task TestAsyncGetAfterOverwrite() { var segment1 = new Segment("hello", TraceId); var segment2 = new Subsegment("bye"); TraceContext.SetEntity(segment1); Entity later = null; Task task = Task.Run(() => { Thread.Sleep(10); // Wait for overwrite to complete later = TraceContext.GetEntity(); }); TraceContext.SetEntity(segment2); // Overwrite in parent await task; Assert.ReferenceEquals(later, segment1); }
public void TestSegmentExistAfterSet() { TraceContext.SetEntity(new Segment("test", TraceId)); Assert.IsNotNull(TraceContext.GetEntity()); }