/// <summary>
        /// Streams subsegments of instance of <see cref="Entity"/>.
        /// </summary>
        /// <param name="entity">Instance of <see cref="Entity"/>.</param>
        /// <param name="emitter">Instance of <see cref="ISegmentEmitter"/>.</param>
        public void Stream(Entity entity, ISegmentEmitter emitter)
        {
            lock (entity.Subsegments)
            {
                foreach (var next in entity.Subsegments)
                {
                    Stream(next, emitter);
                }

                entity.Subsegments.RemoveAll(x => x.HasStreamed);
            }

            if (entity is Segment || entity.IsInProgress || entity.Reference > 0 || entity.IsSubsegmentsAdded)
            {
                return;
            }

            Subsegment subsegment = entity as Subsegment;

            subsegment.TraceId  = entity.RootSegment.TraceId;
            subsegment.Type     = "subsegment";
            subsegment.ParentId = subsegment.Parent.Id;
            emitter.Send(subsegment);
            subsegment.RootSegment.DecrementSize();
            subsegment.HasStreamed = true;
        }
Пример #2
0
        public void TestSubsegmentIsSerializable()
        {
            Subsegment subsegment    = new Subsegment("test");
            string     testNamespace = "namespace";

            subsegment.Namespace = testNamespace;

            Entity parent = new Segment("parent", TraceId);

            subsegment.Parent = parent;

            subsegment.HasStreamed = true;

            string type = "type1";

            subsegment.Type = type;

            string precursorId = Entity.GenerateId();

            subsegment.AddPrecursorId(precursorId);

            Subsegment subsegmentAfterSerialize = (Subsegment)SerializeAndDeserialize(subsegment);

            Assert.AreEqual(testNamespace, subsegmentAfterSerialize.Namespace);
            Assert.AreEqual(parent.TraceId, subsegmentAfterSerialize.Parent.TraceId);
            Assert.IsTrue(subsegmentAfterSerialize.HasStreamed);
            Assert.AreEqual(type, subsegmentAfterSerialize.Type);
            Assert.AreEqual(precursorId, subsegmentAfterSerialize.PrecursorIds.First());
        }
Пример #3
0
        public void TestAddRefAndReleaseWithTwoSubsegment()
        {
            var s1  = new Segment("s1", TraceId);
            var s21 = new Subsegment("s21");
            var s22 = new Subsegment("s22");

            s1.AddSubsegment(s21);
            s1.AddSubsegment(s22);

            Assert.AreEqual(s1.Reference, 3);
            Assert.AreEqual(s21.Reference, 1);
            Assert.AreEqual(s22.Reference, 1);

            s21.Release();
            Assert.AreEqual(s1.Reference, 2);
            Assert.AreEqual(s21.Reference, 0);
            Assert.AreEqual(s22.Reference, 1);
            Assert.IsFalse(s1.IsEmittable());
            Assert.IsFalse(s21.IsEmittable());
            Assert.IsFalse(s22.IsEmittable());

            s22.Release();
            Assert.AreEqual(s1.Reference, 1);
            Assert.AreEqual(s22.Reference, 0);
            Assert.IsFalse(s1.IsEmittable());
            Assert.IsFalse(s22.IsEmittable());

            s1.Release();
            Assert.AreEqual(s1.Reference, 0);
            Assert.IsTrue(s1.IsEmittable());
            Assert.IsTrue(s21.IsEmittable());
            Assert.IsTrue(s22.IsEmittable());
        }
Пример #4
0
        public void TestAddRefAndReleaseWithThreeSegment()
        {
            var s1 = new Segment("s1", TraceId);
            var s2 = new Subsegment("s2");
            var s3 = new Subsegment("s3");

            s1.AddSubsegment(s2);
            s2.AddSubsegment(s3);

            Assert.AreEqual(s1.Reference, 2);
            Assert.AreEqual(s2.Reference, 2);
            Assert.AreEqual(s3.Reference, 1);

            s2.Release();
            Assert.AreEqual(s1.Reference, 2);
            Assert.AreEqual(s2.Reference, 1);
            Assert.AreEqual(s3.Reference, 1);
            Assert.IsFalse(s1.IsEmittable());
            Assert.IsFalse(s2.IsEmittable());
            Assert.IsFalse(s3.IsEmittable());

            s3.Release();
            Assert.AreEqual(s1.Reference, 1);
            Assert.AreEqual(s2.Reference, 0);
            Assert.AreEqual(s3.Reference, 0);
            Assert.IsFalse(s1.IsEmittable());
            Assert.IsFalse(s2.IsEmittable());
            Assert.IsFalse(s3.IsEmittable());

            s1.Release();
            Assert.AreEqual(s1.Reference, 0);
            Assert.IsTrue(s1.IsEmittable());
            Assert.IsTrue(s2.IsEmittable());
            Assert.IsTrue(s3.IsEmittable());
        }
Пример #5
0
 private void AssertExpectedSqlInformation(Subsegment subsegment)
 {
     Assert.IsNotNull(subsegment);
     Assert.IsNotNull(subsegment.Sql);
     Assert.AreEqual(_connectionString, subsegment.Sql["connection_string"]);
     Assert.AreEqual(connection.ServerVersion, subsegment.Sql["database_version"]);
 }
Пример #6
0
        public void TestAsyncCreateTwoSubsegment()
        {
            _recorder.BeginSegment("parent", TraceId);
            Segment parent = (Segment)AWSXRayRecorder.Instance.TraceContext.GetEntity();

            Subsegment child1 = null;
            Subsegment child2 = null;

            Task task1 = Task.Run(async() =>
            {
                _recorder.BeginSubsegment("child1");
                await Task.Delay(1000);   // Ensure task1 will not complete when task1 is running
                child1 = (Subsegment)AWSXRayRecorder.Instance.TraceContext.GetEntity();
                _recorder.EndSubsegment();
            });

            Task task2 = Task.Run(() =>
            {
                _recorder.BeginSubsegment("child2");
                child2 = (Subsegment)AWSXRayRecorder.Instance.TraceContext.GetEntity();
                _recorder.EndSubsegment();
            });

            Task.WaitAll(task1, task2);

            _recorder.EndSegment();

            Assert.IsNotNull(child1);
            Assert.IsNotNull(child2);
            Assert.ReferenceEquals(parent, child1.Parent);
            Assert.ReferenceEquals(parent, child2.Parent);
            Assert.IsTrue(parent.Subsegments.Contains(child1));
            Assert.IsTrue(parent.Subsegments.Contains(child2));
        }
Пример #7
0
        public async Task TestAsyncCreateSubsegmentInAChain()
        {
            _recorder.BeginSegment("parent", TraceId);
            var parent = AWSXRayRecorder.Instance.TraceContext.GetEntity();

            Subsegment subsegment1 = null;
            Subsegment subsegment2 = null;

            await Task.Run(async() =>
            {
                _recorder.BeginSubsegment("subsegment1");
                subsegment1 = (Subsegment)AWSXRayRecorder.Instance.TraceContext.GetEntity();

                await Task.Run(() =>
                {
                    _recorder.BeginSubsegment("subsegment2");
                    subsegment2 = (Subsegment)AWSXRayRecorder.Instance.TraceContext.GetEntity();
                    _recorder.EndSubsegment();
                });

                _recorder.EndSubsegment();
            });

            _recorder.EndSegment();

            Assert.ReferenceEquals(parent, subsegment1.Parent);
            Assert.IsTrue(parent.Subsegments.Contains(subsegment1));
            Assert.ReferenceEquals(subsegment1, subsegment2.Parent);
            Assert.IsTrue(subsegment1.Subsegments.Contains(subsegment2));
        }
Пример #8
0
        public async Task TestSubsegmentOutLiveParent()
        {
            var mockEmitter = new Mock <ISegmentEmitter>();

            using (var client = AWSXRayRecorderFactory.CreateAWSXRayRecorder(mockEmitter.Object))
            {
                client.BeginSegment("parent", TraceId);
                var parent = AWSXRayRecorder.Instance.TraceContext.GetEntity();

                Subsegment child = null;
                Task       task  = Task.Run(async() =>
                {
                    client.BeginSubsegment("child");
                    child = (Subsegment)AWSXRayRecorder.Instance.TraceContext.GetEntity();

                    await Task.Delay(1000);    // Wait for parent to end first

                    client.EndSubsegment();
                });

                await Task.Delay(50);    // Wait to ensure subsegment has started

                client.EndSegment();

                // Subsegment is not ended
                mockEmitter.Verify(x => x.Send(It.IsAny <Segment>()), Times.Never);

                Task.WaitAll(task);
                Assert.IsNotNull(child);

                // subsegment ends
                mockEmitter.Verify(x => x.Send(It.IsAny <Segment>()), Times.Once);
            }
        }
Пример #9
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.");
            }
        }
Пример #10
0
 private void AssertTraceCollected(Subsegment subsegment)
 {
     Assert.AreEqual(connection.ConnectionString, subsegment.Sql["connection_string"]);
     Assert.AreEqual(database, subsegment.Sql["database_type"]);
     Assert.AreEqual(connection.ServerVersion, subsegment.Sql["database_version"]);
     Assert.AreEqual(nameSpace, subsegment.Namespace);
     Assert.IsTrue(subsegment.HasFault);
 }
Пример #11
0
        public void TestCreateSubsegmentWithName()
        {
            var subsegment = new Subsegment("test");

            Assert.AreEqual(subsegment.Name, "test");
            Assert.IsTrue(Entity.IsIdValid(subsegment.Id));
            Assert.IsNull(subsegment.TraceId);
            Assert.IsNull(subsegment.ParentId);
            Assert.IsFalse(subsegment.IsSubsegmentsAdded);
        }
Пример #12
0
        public void TestAddSegment()
        {
            var parent = new Segment("parent", TraceId);
            var child  = new Subsegment("child");

            parent.AddSubsegment(child);

            Assert.ReferenceEquals(child.Parent, parent);
            Assert.IsTrue(parent.Subsegments.Contains(child));
        }
        public void TestSubsegment()
        {
            _recorder.BeginSubsegment("subsegment1");
            Subsegment    subsegment1   = (Subsegment)TraceContext.GetEntity();
            FacadeSegment facadeSegment = (FacadeSegment)subsegment1.RootSegment;

            _recorder.EndSubsegment();
            Assert.AreEqual(facadeSegment.GetType(), typeof(FacadeSegment));
            Assert.IsFalse(facadeSegment.Subsegments.Contains(subsegment1)); //only subsegment is streamed
            Assert.IsFalse(TraceContext.IsEntityPresent());                  // facade segment is cleared from TraceContext
        }
Пример #14
0
        public void TestMarshallNamespace()
        {
            var subsegment = new Subsegment("test");

            subsegment.Id        = "1111111111111111";
            subsegment.Namespace = "remote";

            var actual   = _marshaller.Marshall(subsegment);
            var expected = "{\"format\":\"json\",\"version\":1}\n{\"id\":\"1111111111111111\",\"start_time\":0,\"end_time\":0,\"name\":\"test\",\"namespace\":\"remote\"}";

            Assert.AreEqual(expected, actual);
        }
Пример #15
0
        public void TestMarshallThrottle()
        {
            var subsegment = new Subsegment("test");

            subsegment.Id          = "1111111111111111";
            subsegment.IsThrottled = true;

            var actual   = _marshaller.Marshall(subsegment);
            var expected = "{\"format\":\"json\",\"version\":1}\n{\"id\":\"1111111111111111\",\"start_time\":0,\"end_time\":0,\"name\":\"test\",\"throttle\":true}";

            Assert.AreEqual(expected, actual);
        }
        public void TestLambdaVariablesNotSetCorrectly()
        {
            String invalidTraceHeader = "Root=" + TraceId + ";Parent=53995c3f42cd8ad8"; //sample decision is missing

            Environment.SetEnvironmentVariable(AWSXRayRecorder.LambdaTraceHeaderKey, invalidTraceHeader);
            _recorder.BeginSubsegment("subsegment1");
            Subsegment subsegment = (Subsegment)TraceContext.GetEntity(); //subsegment added with sample decision set to not sampled

            Assert.AreEqual(SampleDecision.NotSampled, subsegment.Sampled);
            _recorder.EndSubsegment();                      //subsegment not sampled since invalid TraceHeader value set in the lambda environment
            Assert.IsFalse(TraceContext.IsEntityPresent()); // Facade segment not present in the callcontext
        }
Пример #17
0
        public void TestMarshallPrecursorIds()
        {
            var subsegment = new Subsegment("test");

            subsegment.Id = "1111111111111111";
            subsegment.AddPrecursorId("2222222222222222");
            subsegment.AddPrecursorId("2222222222222222");
            subsegment.AddPrecursorId("3333333333333333");

            var actual   = _marshaller.Marshall(subsegment);
            var expected = "{\"format\":\"json\",\"version\":1}\n{\"id\":\"1111111111111111\",\"start_time\":0,\"end_time\":0,\"name\":\"test\",\"precursor_ids\":[\"2222222222222222\",\"3333333333333333\"]}";

            Assert.AreEqual(expected, actual);
        }
        public async Task TestAsyncGet()
        {
            var origin = new Subsegment("test");

            AWSXRayRecorder.Instance.SetEntity(origin);

            Entity later = null;

            await Task.Run(() =>
            {
                later = AWSXRayRecorder.Instance.GetEntity();
            });

            Assert.ReferenceEquals(origin, later);
        }
        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 void TestNestedSubsegments()
        {
            _recorder.BeginSubsegment("subsegment1");
            Subsegment    child         = (Subsegment)TraceContext.GetEntity();
            FacadeSegment facadeSegment = (FacadeSegment)child.RootSegment;

            _recorder.BeginSubsegment("subsegment2");
            Assert.AreEqual("subsegment2", TraceContext.GetEntity().Name);
            Assert.AreEqual(facadeSegment.TraceId, TraceContext.GetEntity().RootSegment.TraceId); //root segment of subsegment2 is facade segment
            _recorder.EndSubsegment();
            _recorder.EndSubsegment();
            Assert.AreEqual(facadeSegment.GetType(), typeof(FacadeSegment));
            Assert.IsFalse(facadeSegment.Subsegments.Contains(child)); //only subsegments are streamed
            Assert.IsFalse(TraceContext.IsEntityPresent());
        }
Пример #21
0
        public void TestEndSubsegmentWithCustomTime()
        {
            AWSXRayRecorder recorder = new AWSXRayRecorderBuilder().Build();

            recorder.BeginSubsegment("Subsegment1");

            Subsegment subsegment = (Subsegment)recorder.TraceContext.GetEntity();

            Assert.IsTrue(DateTime.UtcNow.ToUnixTimeSeconds() >= subsegment.StartTime);

            var custom_time = new DateTime(2019, 07, 14);

            recorder.EndSubsegment(custom_time);
            Assert.AreEqual(1563062400, subsegment.EndTime);
        }
Пример #22
0
        public void TestMarshallMetadata()
        {
            var subsegment = new Subsegment("metadata");

            subsegment.Id = "1111111111111111";
            subsegment.AddMetadata("key1", "value1");
            subsegment.AddMetadata("key2", "value2");
            subsegment.AddMetadata("aws", "key1", "value1");

            var actual     = _marshaller.Marshall(subsegment);
            var actualJson = JsonMapper.ToObject(actual.Split('\n')[1]);

            Assert.AreEqual("value1", (string)actualJson["metadata"]["default"]["key1"]);
            Assert.AreEqual("value2", (string)actualJson["metadata"]["default"]["key2"]);
            Assert.AreEqual("value1", (string)actualJson["metadata"]["aws"]["key1"]);
        }
 private void AssertExpectedSqlInformation(Subsegment segment, bool isTrustedConn = false)
 {
     Assert.IsNotNull(segment);
     Assert.IsNotNull(segment.Sql);
     Assert.AreEqual("sqlserver", segment.Sql["database_type"]);
     Assert.AreEqual(_command.Connection.ServerVersion, segment.Sql["database_version"]);
     if (!isTrustedConn)
     {
         Assert.AreEqual(_userId, segment.Sql["user"]);
         Assert.AreEqual(_sanitizedConnectionString, segment.Sql["connection_string"]);
     }
     else
     {
         Assert.AreEqual(_collectedTrustedConnectionString, segment.Sql["connection_string"]);
     }
 }
Пример #24
0
        public void TestSegmentAndSubsegmentsWithNullSampleResponse()
        {
            _recorder.BeginSegment("parent", samplingResponse: null);

            Segment parent = (Segment)AWSXRayRecorder.Instance.TraceContext.GetEntity();

            _recorder.BeginSubsegment("child");
            Subsegment child = (Subsegment)AWSXRayRecorder.Instance.TraceContext.GetEntity();

            _recorder.EndSubsegment();
            Assert.ReferenceEquals(AWSXRayRecorder.Instance.TraceContext.GetEntity(), parent);

            _recorder.EndSegment();

            Assert.ReferenceEquals(parent, child.Parent);
            Assert.IsTrue(parent.Subsegments.Contains(child));
        }
Пример #25
0
        public void TestSegmentAndSubsegmentsWithNoTraceId()
        {
            _recorder.BeginSegment("parent");

            Segment parent = (Segment)TraceContext.GetEntity();

            _recorder.BeginSubsegment("child");
            Subsegment child = (Subsegment)TraceContext.GetEntity();

            _recorder.EndSubsegment();
            Assert.ReferenceEquals(TraceContext.GetEntity(), parent);

            _recorder.EndSegment();

            Assert.ReferenceEquals(parent, child.Parent);
            Assert.IsTrue(parent.Subsegments.Contains(child));
        }
        public void TestLambdaLeakedSubsegments()
        {
            String secondTraceHeader = "Root=" + Core.Internal.Entities.TraceId.NewId() + ";Parent=53995c3f42cd8ad1;Sampled=1";

            _recorder.BeginSubsegment("subsegment1");
            Subsegment subsegment1 = (Subsegment)TraceContext.GetEntity();

            Environment.SetEnvironmentVariable(AWSXRayRecorder.LambdaTraceHeaderKey, secondTraceHeader);
            _recorder.BeginSubsegment("subsegment2"); //Environment variables changed, subsegment1 will be dropped
            Subsegment    subsegment2   = (Subsegment)TraceContext.GetEntity();
            FacadeSegment facadeSegment = (FacadeSegment)subsegment2.RootSegment;

            Assert.IsFalse(facadeSegment.Subsegments.Contains(subsegment1)); //subsegment1 dropped
            Assert.IsTrue(facadeSegment.Subsegments.Contains(subsegment2));  //only subsegment2 is present
            _recorder.EndSubsegment();                                       //subsegment2 streamed
            Assert.IsFalse(TraceContext.IsEntityPresent());                  // Facade segment not present in the callcontext
        }
Пример #27
0
        public void TestMarshallHttp()
        {
            var subsegment = new Subsegment("test");

            subsegment.Id = "1111111111111111";
            var request = new Dictionary <string, string>();

            request["url"]    = @"http://hello-1.mbfzqxzcpe.us-east-1.elasticbeanstalk.com/foo";
            request["method"] = "GET";

            subsegment.Http["request"] = request;

            var actual   = _marshaller.Marshall(subsegment);
            var expected = "{\"format\":\"json\",\"version\":1}\n{\"id\":\"1111111111111111\",\"start_time\":0,\"end_time\":0,\"name\":\"test\",\"http\":{\"request\":{\"url\":\"http://hello-1.mbfzqxzcpe.us-east-1.elasticbeanstalk.com/foo\",\"method\":\"GET\"}}}";

            Assert.AreEqual(expected, actual);
        }
Пример #28
0
        public void TestSyncCreateSegmentAndSubsegments()
        {
            _recorder.BeginSegment("parent", TraceId);

            Segment parent = (Segment)AWSXRayRecorder.Instance.TraceContext.GetEntity();

            _recorder.BeginSubsegment("child");
            Subsegment child = (Subsegment)AWSXRayRecorder.Instance.TraceContext.GetEntity();

            _recorder.EndSubsegment();
            Assert.ReferenceEquals(AWSXRayRecorder.Instance.TraceContext.GetEntity(), parent);

            _recorder.EndSegment();

            Assert.ReferenceEquals(parent, child.Parent);
            Assert.IsTrue(parent.Subsegments.Contains(child));
        }
Пример #29
0
        public void TestMarshallError()
        {
            try
            {
                throw new ArgumentNullException("value");
            }
            catch (ArgumentNullException)
            {
                var subsegment = new Subsegment("test");
                subsegment.Id       = "1111111111111111";
                subsegment.HasError = true;

                var actual   = _marshaller.Marshall(subsegment);
                var expected = "{\"format\":\"json\",\"version\":1}\n{\"id\":\"1111111111111111\",\"start_time\":0,\"end_time\":0,\"name\":\"test\",\"error\":true}";

                Assert.AreEqual(expected, actual);
            }
        }
Пример #30
0
        public void TestSegmentAndSubsegmentsWithNoTraceId()
        {
            _recorder.BeginSegment("parent");

            Segment parent = (Segment)AWSXRayRecorder.Instance.TraceContext.GetEntity();

            _recorder.BeginSubsegment("child");
            Subsegment child = (Subsegment)AWSXRayRecorder.Instance.TraceContext.GetEntity();

            _recorder.EndSubsegment();
            Assert.ReferenceEquals(AWSXRayRecorder.Instance.TraceContext.GetEntity(), parent);

            _recorder.EndSegment();

            Assert.AreEqual(SampleDecision.Sampled, parent.Sampled);
            Assert.ReferenceEquals(parent, child.Parent);
            Assert.IsTrue(parent.Subsegments.Contains(child));
        }