Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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());
 }