public void GetTransactionTrace_RetainsComplicatedSegmentTreeStructure()
        {
            var node1   = GetNodeBuilder(name: "1");
            var node2   = GetNodeBuilder(name: "2");
            var node11  = GetNodeBuilder(name: "1.1");
            var node12  = GetNodeBuilder(name: "1.2");
            var node121 = GetNodeBuilder(name: "1.2.1");

            node1.Children.Add(node11);
            node1.Children.Add(node12);
            node12.Children.Add(node121);

            var transaction           = BuildTestTransaction();
            var topLevelSegments      = new[] { node1.Build(), node2.Build() };
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace = _transactionTraceMaker.GetTransactionTrace(transaction, topLevelSegments, transactionMetricName, attributes);

            var realSegments = trace.TransactionTraceData.RootSegment.Children.First().Children;
            var segment1     = realSegments.ElementAt(0);
            var segment2     = realSegments.ElementAt(1);
            var segment11    = segment1.Children.ElementAt(0);
            var segment12    = segment1.Children.ElementAt(1);
            var segment121   = segment12.Children.ElementAt(0);

            NrAssert.Multiple(
                () => Assert.AreEqual("1", segment1.Name),
                () => Assert.AreEqual("2", segment2.Name),
                () => Assert.AreEqual("1.1", segment11.Name),
                () => Assert.AreEqual("1.2", segment12.Name),
                () => Assert.AreEqual("1.2.1", segment121.Name)
                );
        }
        public void TransformSegment_TwoTransformCallsSame()
        {
            const string type    = "type";
            const string method  = "method";
            var          segment = GetSegment(type, method);;

            var txName  = new TransactionMetricName("WebTransaction", "Test", false);
            var txStats = new TransactionMetricStatsCollection(txName);

            segment.AddMetricStats(txStats, _configurationService);
            segment.AddMetricStats(txStats, _configurationService);

            var scoped   = txStats.GetScopedForTesting();
            var unscoped = txStats.GetUnscopedForTesting();

            Assert.AreEqual(1, scoped.Count);
            Assert.AreEqual(1, unscoped.Count);

            const string metricName = "DotNet/type/method";

            Assert.IsTrue(scoped.ContainsKey(metricName));
            Assert.IsTrue(unscoped.ContainsKey(metricName));

            var nameScoped   = scoped[metricName];
            var nameUnscoped = unscoped[metricName];

            Assert.AreEqual(2, nameScoped.Value0);
            Assert.AreEqual(2, nameUnscoped.Value0);
        }
Esempio n. 3
0
        public void ReportTransactionGarbageCollected(TransactionMetricName transactionMetricName, string lastStartedSegmentName, string lastFinishedSegmentName)
        {
            var transactionName = transactionMetricName.PrefixedName;

            Log.Debug($"Transaction was garbage collected without ever ending.\nTransaction Name: {transactionName}\nLast Started Segment: {lastStartedSegmentName}\nLast Finished Segment: {lastFinishedSegmentName}");
            _agentHealthEventCounters[AgentHealthEvent.TransactionGarbageCollected]?.Increment();
        }
        public void TransformSegment_TwoTransformCallsSame()
        {
            const string vendor      = "vendor1";
            const string destination = "queueA";
            const MetricNames.MessageBrokerDestinationType destinationType = MetricNames.MessageBrokerDestinationType.Queue;
            const MetricNames.MessageBrokerAction          action          = MetricNames.MessageBrokerAction.Consume;
            var segment = GetSegment(vendor, destinationType, destination, action);
            TransactionMetricName            txName  = new TransactionMetricName("WebTransaction", "Test", false);
            TransactionMetricStatsCollection txStats = new TransactionMetricStatsCollection(txName);

            segment.AddMetricStats(txStats, _configurationService);

            segment.AddMetricStats(txStats, _configurationService);

            var scoped   = txStats.GetScopedForTesting();
            var unscoped = txStats.GetUnscopedForTesting();

            Assert.AreEqual(1, scoped.Count);
            Assert.AreEqual(1, unscoped.Count);
            const string metricName = "MessageBroker/vendor1/Queue/Consume/Named/queueA";


            Assert.IsTrue(scoped.ContainsKey(metricName));
            Assert.IsTrue(unscoped.ContainsKey(metricName));

            var nameScoped   = scoped[metricName];
            var nameUnscoped = unscoped[metricName];

            Assert.AreEqual(2, nameScoped.Value0);
            Assert.AreEqual(2, nameUnscoped.Value0);
        }
Esempio n. 5
0
        public void MergeScopedStats_Three()
        {
            var txName  = new TransactionMetricName("WebTransaction", "Test", false);
            var txStats = new TransactionMetricStatsCollection(txName);

            txStats.MergeScopedStats(MetricName.Create("DotNet/name"), MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2)));
            txStats.MergeScopedStats(MetricName.Create("DotNet/name"), MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(4)));
            txStats.MergeScopedStats(MetricName.Create("DotNet/other"), MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(4), TimeSpan.FromSeconds(3)));

            Assert.AreEqual("WebTransaction/Test", txStats.GetTransactionName().PrefixedName);

            MetricStatsDictionary <string, MetricDataWireModel> unscoped = txStats.GetUnscopedForTesting();
            MetricStatsDictionary <string, MetricDataWireModel> scoped   = txStats.GetScopedForTesting();

            Assert.AreEqual(0, unscoped.Count);
            Assert.AreEqual(2, scoped.Count);
            var data = scoped["DotNet/name"];

            Assert.NotNull(data);
            Assert.AreEqual(2, data.Value0);
            Assert.AreEqual(8, data.Value1);
            Assert.AreEqual(6, data.Value2);
            Assert.AreEqual(3, data.Value3);
            Assert.AreEqual(5, data.Value4);

            data = scoped["DotNet/other"];
            Assert.NotNull(data);
            Assert.AreEqual(1, data.Value0);
            Assert.AreEqual(4, data.Value1);
            Assert.AreEqual(3, data.Value2);
            Assert.AreEqual(4, data.Value3);
            Assert.AreEqual(4, data.Value4);
        }
        public void GetTransactionTrace_AddsAsyncParametersToAllNodes()
        {
            var now    = new TimeSpan();
            var node1  = GetNodeBuilder(name: "1", startTime: now, duration: TimeSpan.FromSeconds(1));
            var node2  = GetNodeBuilder(name: "2", startTime: now, duration: TimeSpan.FromSeconds(.5));
            var node11 = GetNodeBuilder(name: "1.1", startTime: now, duration: TimeSpan.FromSeconds(.25));

            node1.Children.Add(node11);
            node1.Segment.ChildFinished(node11.Segment);

            var transaction           = BuildTestTransaction();
            var topLevelSegments      = new[] { node1.Build(), node2.Build() };
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace = _transactionTraceMaker.GetTransactionTrace(transaction, topLevelSegments, transactionMetricName, attributes);

            var realSegments = trace.TransactionTraceData.RootSegment.Children.First().Children;
            var segment1     = realSegments.ElementAt(0);
            var segment2     = realSegments.ElementAt(1);
            var segment11    = segment1.Children.ElementAt(0);

            NrAssert.Multiple(
                () => Assert.AreEqual(750, segment1.Parameters["exclusive_duration_millis"]),
                () => Assert.AreEqual(500, segment2.Parameters["exclusive_duration_millis"]),
                () => Assert.AreEqual(250, segment11.Parameters["exclusive_duration_millis"])
                );
        }
        public void SqlTrace_WithtUriExcluded()
        {
            //Arrange
            var attribDefs    = Mock.Create <IAttributeDefinitions>();
            var attribDefSvc  = new AttributeDefinitionService((f) => attribDefs);
            var sqlTraceMaker = new SqlTraceMaker(_configurationService, attribDefSvc, _databaseService);
            var attribFilter  = Mock.Create <IAttributeFilter>();

            Mock.Arrange(() => attribDefs.RequestUri)
            .Returns(AttributeDefinitionBuilder.CreateString("request.uri", AttributeClassification.AgentAttributes)
                     .AppliesTo(AttributeDestinations.TransactionEvent)
                     .AppliesTo(AttributeDestinations.ErrorEvent)
                     .AppliesTo(AttributeDestinations.ErrorTrace)
                     .AppliesTo(AttributeDestinations.TransactionTrace)
                     .AppliesTo(AttributeDestinations.SqlTrace, false)
                     .WithDefaultOutputValue("/unknown")
                     .Build(attribFilter));

            var uri                   = "sqlTrace/Uri";
            var commandText           = "Select * from Table1";
            var duration              = TimeSpan.FromMilliseconds(500);
            var transaction           = BuildTestTransaction(uri: uri, attribDefs: attribDefs);
            var transactionMetricName = new TransactionMetricName("WebTransaction", "Name");
            var datastoreSegment      = BuildSegment(DatastoreVendor.MSSQL, "Table1", commandText, new TimeSpan(), duration, null, null, null, "myhost", "myport", "mydatabase");

            //Act
            var sqlTrace = sqlTraceMaker.TryGetSqlTrace(transaction, transactionMetricName, datastoreSegment);

            //Assert
            Assert.IsNotNull(sqlTrace);
            Assert.AreEqual("<unknown>", sqlTrace.Uri);
        }
Esempio n. 8
0
        public TransactionMetricName RenameTransaction(TransactionMetricName proposedTransactionName)
        {
            var    shouldIgnore = false;
            string newPrefixedTransactionName;

            try
            {
                newPrefixedTransactionName = RenameUsingRegexRules(proposedTransactionName.PrefixedName, _configuration.TransactionNameRegexRules);
                newPrefixedTransactionName = RenameUsingWhitelistRules(newPrefixedTransactionName, _configuration.TransactionNameWhitelistRules);
            }
            catch (IgnoreTransactionException ex)
            {
                Log.Debug(ex.Message);
                shouldIgnore = true;
                newPrefixedTransactionName = ex.IgnoredTransactionName;
            }

            // Renaming rules are not allowed to change the first segment of a transaction name
            var newTransactionName = GetTransactionMetricName(newPrefixedTransactionName, proposedTransactionName, shouldIgnore);

            if (!IsMetricNameAllowed(newPrefixedTransactionName))
            {
                return(proposedTransactionName.IsWebTransactionName ? NormalizedWebTransactionMetricName : NormalizedOtherTransactionMetricName);
            }

            return(newTransactionName);
        }
        public void GetTransactionTrace_CreatesTraceWithDatastoreInstanceInformation()
        {
            var expectedDatabaseParameter = "My Database";
            var expectedPortParameter     = "My Port";
            var expectedHostParameter     = "My Host";

            var transaction           = BuildTestTransaction();
            var segments              = new[] { BuildDataStoreSegmentNodeWithInstanceData() };
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace = _transactionTraceMaker.GetTransactionTrace(transaction, segments, transactionMetricName, attributes);

            Assert.IsTrue(trace.TransactionTraceData.RootSegment.Children[0].Children[0].Parameters.ContainsKey("database_name"));
            Assert.IsTrue(trace.TransactionTraceData.RootSegment.Children[0].Children[0].Parameters.ContainsKey("host"));
            Assert.IsTrue(trace.TransactionTraceData.RootSegment.Children[0].Children[0].Parameters.ContainsKey("port_path_or_id"));

            var actualDatabaseParameter = trace.TransactionTraceData.RootSegment.Children[0].Children[0].Parameters["database_name"];
            var actualHostParameter     = trace.TransactionTraceData.RootSegment.Children[0].Children[0].Parameters["host"];
            var actualPathPortParameter = trace.TransactionTraceData.RootSegment.Children[0].Children[0].Parameters["port_path_or_id"];

            Assert.AreEqual(expectedDatabaseParameter, actualDatabaseParameter);
            Assert.AreEqual(expectedHostParameter, actualHostParameter);
            Assert.AreEqual(expectedPortParameter, actualPathPortParameter);
        }
        public void GetTransactionTrace_AppendsNodeToFauxTopLevelSegmentChildren()
        {
            var          transactionStartTime        = DateTime.Now;
            var          segmentStartTime            = transactionStartTime.AddSeconds(1);
            var          expectedStartTimeDifference = TimeSpan.FromSeconds(1);
            var          segmentDuration             = TimeSpan.FromSeconds(10);
            var          expectedEndTimeDifference   = expectedStartTimeDifference + segmentDuration;
            const string expectedName       = "some segment name";
            var          expectedParameters = new Dictionary <string, object> {
                { "foo", "bar" }
            };
            var expectedClassName     = "foo";
            var expectedMethodName    = "bar";
            var methodCallData        = new MethodCallData(expectedClassName, expectedMethodName, 1);
            var transaction           = BuildTestTransaction(startTime: transactionStartTime);
            var segments              = new[] { BuildNode(transaction, startTime: segmentStartTime, duration: segmentDuration, name: expectedName, parameters: expectedParameters, methodCallData: methodCallData) };
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace        = _transactionTraceMaker.GetTransactionTrace(transaction, segments, transactionMetricName, attributes);
            var realSegments = trace.TransactionTraceData.RootSegment.Children.First().Children;
            var firstSegment = realSegments.First();

            NrAssert.Multiple(
                () => Assert.AreEqual(expectedStartTimeDifference, firstSegment.TimeBetweenTransactionStartAndSegmentStart),
                () => Assert.AreEqual(expectedEndTimeDifference, firstSegment.TimeBetweenTransactionStartAndSegmentEnd),
                () => Assert.AreEqual(expectedName, firstSegment.Name),
                () => Assert.AreEqual(expectedClassName, firstSegment.ClassName),
                () => Assert.AreEqual(expectedMethodName, firstSegment.MethodName),
                () => Assert.AreEqual(0, firstSegment.Children.Count),
                () => Assert.True(expectedParameters.All(kvp => expectedParameters[kvp.Key] == firstSegment.Parameters[kvp.Key]))
                );
        }
        public void GetTransactionTrace_PrependsTreeWithRootNodeAndFauxTopLevelSegment()
        {
            var expectedStartTimeDifference = TimeSpan.FromSeconds(0);
            var expectedEndTimeDifference   = TimeSpan.FromSeconds(10);
            var transaction           = BuildTestTransaction(duration: expectedEndTimeDifference);
            var segments              = new[] { BuildNode() };
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace = _transactionTraceMaker.GetTransactionTrace(transaction, segments, transactionMetricName, attributes);
            var root  = trace.TransactionTraceData.RootSegment;
            var fauxTopLevelSegment = root.Children.First();

            NrAssert.Multiple(
                // ROOT
                () => Assert.AreEqual(expectedStartTimeDifference, root.TimeBetweenTransactionStartAndSegmentStart),
                () => Assert.AreEqual(expectedEndTimeDifference, root.TimeBetweenTransactionStartAndSegmentEnd),
                () => Assert.AreEqual("ROOT", root.Name),
                () => Assert.AreEqual(1, root.Children.Count),

                // Faux top-level segment
                () => Assert.AreEqual(expectedStartTimeDifference, fauxTopLevelSegment.TimeBetweenTransactionStartAndSegmentStart),
                () => Assert.AreEqual(expectedEndTimeDifference, fauxTopLevelSegment.TimeBetweenTransactionStartAndSegmentEnd),
                () => Assert.AreEqual("Transaction", fauxTopLevelSegment.Name),
                () => Assert.AreEqual(1, fauxTopLevelSegment.Children.Count)
                );
        }
        public void GetTransactionTrace_Throws_IfSegmentTreeIsEmpty()
        {
            var transaction           = BuildTestTransaction();
            var segments              = Enumerable.Empty <ImmutableSegmentTreeNode>();
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            Assert.Throws <ArgumentException>(() => _transactionTraceMaker.GetTransactionTrace(transaction, segments, transactionMetricName, attributes));
        }
        private string GetEncodedAppData(IInternalTransaction transaction, TransactionMetricName transactionMetricName, string crossProcessId)
        {
            var txMetadata            = transaction.TransactionMetadata;
            var queueTime             = txMetadata.QueueTime?.TotalSeconds ?? 0;
            var referrerContentLength = txMetadata.GetCrossApplicationReferrerContentLength();
            var responseTimeInSeconds = txMetadata.CrossApplicationResponseTimeInSeconds;
            var appData = new CrossApplicationResponseData(crossProcessId, transactionMetricName.PrefixedName, (float)queueTime, responseTimeInSeconds, referrerContentLength, transaction.Guid);

            return(HeaderEncoder.EncodeSerializedData(JsonConvert.SerializeObject(appData), _configurationService.Configuration.EncodingKey));
        }
Esempio n. 14
0
        public void TransformSegment_CreatesNullModelSegmentMetrics()
        {
            var wrapperVendor = Extensions.Providers.Wrapper.DatastoreVendor.MSSQL;
            var model         = null as string;
            var operation     = "INSERT";

            var segment = GetSegment(wrapperVendor, operation, model, 5);


            var txName  = new TransactionMetricName("WebTransaction", "Test", false);
            var txStats = new TransactionMetricStatsCollection(txName);

            segment.AddMetricStats(txStats, _configurationService);


            var scoped   = txStats.GetScopedForTesting();
            var unscoped = txStats.GetUnscopedForTesting();

            Assert.AreEqual(1, scoped.Count);
            Assert.AreEqual(5, unscoped.Count);

            //no statement metric for null model
            const string statementMetric = "Datastore/statement/MSSQL/MY_TABLE/INSERT";
            const string operationMetric = "Datastore/operation/MSSQL/INSERT";

            Assert.IsTrue(unscoped.ContainsKey("Datastore/all"));
            Assert.IsTrue(unscoped.ContainsKey("Datastore/allWeb"));
            Assert.IsTrue(unscoped.ContainsKey("Datastore/MSSQL/all"));
            Assert.IsTrue(unscoped.ContainsKey("Datastore/MSSQL/allWeb"));
            Assert.IsFalse(unscoped.ContainsKey(statementMetric));
            Assert.IsTrue(unscoped.ContainsKey(operationMetric));

            Assert.IsTrue(scoped.ContainsKey(operationMetric));

            var data = scoped[operationMetric];

            Assert.AreEqual(1, data.Value0);
            Assert.AreEqual(5, data.Value1);
            Assert.AreEqual(5, data.Value2);
            Assert.AreEqual(5, data.Value3);
            Assert.AreEqual(5, data.Value4);

            var unscopedMetricsWithExclusiveTime = new string[] { operationMetric, "Datastore/all", "Datastore/allWeb", "Datastore/MSSQL/all", "Datastore/MSSQL/allWeb" };

            foreach (var current in unscopedMetricsWithExclusiveTime)
            {
                data = unscoped[current];
                Assert.AreEqual(1, data.Value0);
                Assert.AreEqual(5, data.Value1);
                Assert.AreEqual(5, data.Value2);
                Assert.AreEqual(5, data.Value3);
                Assert.AreEqual(5, data.Value4);
            }
        }
        public void TryGetSqlTrace_ReturnsNullWhenDurationIsNull()
        {
            var uri                   = "sqlTrace/Uri";
            var commandText           = "Select * from Table1";
            var transaction           = BuildTestTransaction(uri);
            var transactionMetricName = new TransactionMetricName("WebTransaction", "Name");
            var datastoreSegment      = BuildSegment(DatastoreVendor.MSSQL, "Table1", commandText, new TimeSpan(), null);

            var sqlTrace = _sqlTraceMaker.TryGetSqlTrace(transaction, transactionMetricName, datastoreSegment);

            Assert.IsNull(sqlTrace);
        }
        public void GetTransactionTrace_CreatesTraceWithCorrectStartTime()
        {
            var expectedStartTime     = DateTime.Now.AddSeconds(-50);
            var transaction           = BuildTestTransaction(startTime: expectedStartTime);
            var segments              = new[] { BuildNode() };
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace = _transactionTraceMaker.GetTransactionTrace(transaction, segments, transactionMetricName, attributes);

            Assert.AreEqual(expectedStartTime, trace.StartTime);
        }
        public void GetTransactionTrace_CreatesTraceWithCorrectDuration()
        {
            var expectedDuration      = TimeSpan.FromSeconds(5);
            var transaction           = BuildTestTransaction(duration: expectedDuration);
            var segments              = new[] { BuildNode() };
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace = _transactionTraceMaker.GetTransactionTrace(transaction, segments, transactionMetricName, attributes);

            Assert.AreEqual(expectedDuration, trace.Duration);
        }
        public void TransformSegment_NullTransactionStats()
        {
            const string vendor      = "vendor1";
            const string destination = "queueA";
            const MetricNames.MessageBrokerDestinationType destinationType = MetricNames.MessageBrokerDestinationType.Queue;
            const MetricNames.MessageBrokerAction          action          = MetricNames.MessageBrokerAction.Consume;
            var segment = GetSegment(vendor, destinationType, destination, action);
            TransactionMetricName            txName  = new TransactionMetricName("WebTransaction", "Test", false);
            TransactionMetricStatsCollection txStats = new TransactionMetricStatsCollection(txName);

            segment.AddMetricStats(txStats, _configurationService);
        }
        public void GetTransactionTrace_CreatesTraceWithCorrectGuid()
        {
            var expectedGuid          = Guid.NewGuid().ToString();
            var transaction           = BuildTestTransaction(guid: expectedGuid);
            var segments              = new[] { BuildNode() };
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace = _transactionTraceMaker.GetTransactionTrace(transaction, segments, transactionMetricName, attributes);

            Assert.AreEqual(expectedGuid, trace.Guid);
        }
        public void SqlTrace_WithoutUri()
        {
            var commandText           = "Select * from Table1";
            var duration              = TimeSpan.FromMilliseconds(500);
            var transaction           = BuildTestTransaction();
            var transactionMetricName = new TransactionMetricName("WebTransaction", "Name");
            var datastoreSegment      = BuildSegment(DatastoreVendor.MSSQL, "Table1", commandText, new TimeSpan(), duration, null, null, null, "myhost", "myport", "mydatabase");

            var sqlTrace = _sqlTraceMaker.TryGetSqlTrace(transaction, transactionMetricName, datastoreSegment);

            Assert.IsNotNull(sqlTrace);
            Assert.AreEqual("<unknown>", sqlTrace.Uri);
        }
Esempio n. 21
0
        public void RenameTransaction_ShouldNotRenameTransaction_IfRuleCreatesInvalidName()
        {
            // The result of this rule is an invalid name -- the renamed metric must still be a WebTransaction
            Mock.Arrange(() => _configuration.TransactionNameRegexRules).Returns(new List <RegexRule>
            {
                new RegexRule("WebTransaction/foo/bar", "*", false, 10, false, false, false)
            });

            var originalMetricName = new TransactionMetricName("WebTransaction", "foo/bar");
            var newName            = _metricNameService.RenameTransaction(originalMetricName);

            Assert.NotNull(newName);
            Assert.AreEqual(originalMetricName.PrefixedName, newName.PrefixedName);
        }
        public void TryGetOutboundResponseHeaders_ReturnsCorrectHeaders()
        {
            Mock.Arrange(() => _configuration.CrossApplicationTracingCrossProcessId).Returns("crossProcessId");
            var refereeTransaction           = BuildTestTransaction();
            var refereeTransactionMetricName = new TransactionMetricName("WebTransaction", "foo");
            var headers = _catHeaderHandler.TryGetOutboundResponseHeaders(refereeTransaction, refereeTransactionMetricName).ToDictionary();
            var resultAppDataHttpHeader = Strings.TryBase64Decode(headers[AppDataHttpHeader]);
            var guid = refereeTransaction.Guid;
            var expectedAppDataHttpHeader = $"[\"crossProcessId\",\"WebTransaction/foo\",0.0,{ExpectedResponseTimeInSeconds},-1,\"{guid}\",false]";

            NrAssert.Multiple
            (
                () => Assert.AreEqual(expectedAppDataHttpHeader, resultAppDataHttpHeader)
            );
        }
Esempio n. 23
0
        public void GetErrorTrace_ReturnsErrorTrace_IfStatusCodeIs404()
        {
            var transaction           = BuildTestTransaction(statusCode: 404, uri: "http://www.newrelic.com/test?param=value");
            var attributes            = new AttributeValueCollection(AttributeDestinations.ErrorTrace);
            var transactionMetricName = new TransactionMetricName("WebTransaction", "Name");

            var errorTrace = _errorTraceMaker.GetErrorTrace(transaction, attributes, transactionMetricName);

            Assert.NotNull(errorTrace);
            NrAssert.Multiple(
                () => Assert.AreEqual("WebTransaction/Name", errorTrace.Path),
                () => Assert.AreEqual("Not Found", errorTrace.Message),
                () => Assert.AreEqual("404", errorTrace.ExceptionClassName),
                () => Assert.AreEqual(transaction.Guid, errorTrace.Guid),
                () => Assert.AreEqual(null, errorTrace.Attributes.StackTrace)
                );
        }
Esempio n. 24
0
        public void GetErrorTrace_ReturnsErrorTrace_IfExceptionIsNoticed()
        {
            var errorDataIn           = _errorService.FromMessage("My message", (Dictionary <string, object>)null, false);
            var transaction           = BuildTestTransaction(uri: "http://www.newrelic.com/test?param=value", transactionExceptionDatas: new[] { errorDataIn });
            var attributes            = new AttributeValueCollection(AttributeDestinations.ErrorTrace);
            var transactionMetricName = new TransactionMetricName("WebTransaction", "Name");

            var errorTrace = _errorTraceMaker.GetErrorTrace(transaction, attributes, transactionMetricName);

            Assert.NotNull(errorTrace);
            NrAssert.Multiple(
                () => Assert.AreEqual("WebTransaction/Name", errorTrace.Path),
                () => Assert.AreEqual("My message", errorTrace.Message),
                () => Assert.AreEqual("Custom Error", errorTrace.ExceptionClassName),
                () => Assert.AreEqual(transaction.Guid, errorTrace.Guid)
                );
        }
        public void GetTransactionTrace_CreatesTraceWithSql()
        {
            var expectedParameter     = "SELECT * FROM test_table WHERE foo = 1";
            var transaction           = BuildTestTransaction(startTime: DateTime.Now.AddSeconds(-50));
            var segments              = new[] { BuildDataStoreSegmentNode() };
            var transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace = _transactionTraceMaker.GetTransactionTrace(transaction, segments, transactionMetricName, attributes);

            Assert.IsTrue(trace.TransactionTraceData.RootSegment.Children[0].Children[0].Parameters.ContainsKey("sql"));

            var actualParameter = trace.TransactionTraceData.RootSegment.Children[0].Children[0].Parameters["sql"];

            Assert.IsNotNull(actualParameter);
            Assert.IsNotEmpty(actualParameter as string);
            Assert.AreNotEqual(expectedParameter, actualParameter);
        }
        public void GetTransactionTrace_CreatesTraceWithCorrectUri()
        {
            //Mock.Arrange(() => _attributeService.AllowRequestUri(AttributeDestinations.TransactionTrace))
            //    .Returns(true);

            const string inputUrl              = "http://www.google.com/test?param=value";
            var          transaction           = BuildTestTransaction(uri: inputUrl);
            var          segments              = new[] { BuildNode() };
            var          transactionMetricName = new TransactionMetricName("WebTransaction", "TrxName");
            var          attributes            = new AttributeValueCollection(AttributeDestinations.TransactionTrace);

            var trace = _transactionTraceMaker.GetTransactionTrace(transaction, segments, transactionMetricName, attributes);

            // Query parameters should be stripped out
            const string expectedUri = "http://www.google.com/test";

            Assert.AreEqual(expectedUri, trace.Uri);
        }
Esempio n. 27
0
        public void RenameTransaction_AppliesRegexRulesBeforeWhitelistRules()
        {
            Mock.Arrange(() => _configuration.TransactionNameRegexRules).Returns(new List <RegexRule>
            {
                new RegexRule("/InvalidSegment", "/ValidSegment", false, 10, false, false, false)
            });
            Mock.Arrange(() => _configuration.TransactionNameWhitelistRules).Returns(new Dictionary <string, IEnumerable <string> >
            {
                { "WebTransaction/Uri", new[] { "ValidSegment" } }
            });

            var originalMetricName = new TransactionMetricName("WebTransaction", "Uri/InvalidSegment/OtherInvalidSegment");
            var newMetricName      = _metricNameService.RenameTransaction(originalMetricName);

            // The URL rule should transform it into "WebTransaction/Uri/ValidSegment/OtherInvalidSegment",
            // then the transaction segment should transform it into "WebTransaction/Uri/ValidSegment/*"
            Assert.NotNull(newMetricName);
            Assert.AreEqual("WebTransaction/Uri/ValidSegment/*", newMetricName.PrefixedName);
        }
Esempio n. 28
0
        public void GetErrorTrace_ReturnsExceptionWithoutMessage_IfStripExceptionMessageEnabled()
        {
            Mock.Arrange(() => _configurationService.Configuration.StripExceptionMessages).Returns(true);

            var errorData             = _errorService.FromMessage("This message should be stripped.", (Dictionary <string, object>)null, false);
            var transaction           = BuildTestTransaction(uri: "http://www.newrelic.com/test?param=value", transactionExceptionDatas: new[] { errorData });
            var attributes            = new AttributeValueCollection(AttributeDestinations.ErrorTrace);
            var transactionMetricName = new TransactionMetricName("WebTransaction", "Name");

            var errorTrace = _errorTraceMaker.GetErrorTrace(transaction, attributes, transactionMetricName);

            Assert.NotNull(errorTrace);
            NrAssert.Multiple(
                () => Assert.AreEqual("WebTransaction/Name", errorTrace.Path),
                () => Assert.AreEqual(StripExceptionMessagesMessage, errorTrace.Message),
                () => Assert.AreEqual("Custom Error", errorTrace.ExceptionClassName),
                () => Assert.AreEqual(transaction.Guid, errorTrace.Guid)
                );
        }
        public void TransformSegment_TwoTransformCallsDifferent()
        {
            const string name    = "name";
            var          segment = GetSegment(name);

            const string name1    = "otherName";
            var          segment1 = GetSegment(name1);

            var txName  = new TransactionMetricName("WebTransaction", "Test", false);
            var txStats = new TransactionMetricStatsCollection(txName);

            segment.AddMetricStats(txStats, _configurationService);
            segment1.AddMetricStats(txStats, _configurationService);

            var scoped   = txStats.GetScopedForTesting();
            var unscoped = txStats.GetUnscopedForTesting();

            Assert.AreEqual(2, scoped.Count);
            Assert.AreEqual(2, unscoped.Count);

            const string metricName = "DotNet/name";

            Assert.IsTrue(scoped.ContainsKey(metricName));
            Assert.IsTrue(unscoped.ContainsKey(metricName));

            var nameScoped   = scoped[metricName];
            var nameUnscoped = unscoped[metricName];

            Assert.AreEqual(1, nameScoped.Value0);
            Assert.AreEqual(1, nameUnscoped.Value0);

            const string metricName1 = "DotNet/otherName";

            Assert.IsTrue(scoped.ContainsKey(metricName1));
            Assert.IsTrue(unscoped.ContainsKey(metricName1));

            nameScoped   = scoped[metricName1];
            nameUnscoped = unscoped[metricName1];

            Assert.AreEqual(1, nameScoped.Value0);
            Assert.AreEqual(1, nameUnscoped.Value0);
        }
        public void TransformSegment_CreatesWebWithCat()
        {
            const string host   = "www.bar.com";
            var          uri    = $"http://{host}/foo";
            const string method = "GET";
            var          externalCrossProcessId  = "cpId";
            var          externalTransactionName = "otherTxName";
            var          catResponseData         = new CrossApplicationResponseData(externalCrossProcessId, externalTransactionName, 1.1f, 2.2f, 3, "guid", false);

            var segment = GetSegment(uri, method, catResponseData);


            var txName  = new TransactionMetricName("WebTransaction", "Test", false);
            var txStats = new TransactionMetricStatsCollection(txName);

            segment.AddMetricStats(txStats, _configurationService);

            var scoped   = txStats.GetScopedForTesting();
            var unscoped = txStats.GetUnscopedForTesting();

            Assert.AreEqual(1, scoped.Count);
            Assert.AreEqual(6, unscoped.Count);

            const string segmentMetric = "External/www.bar.com/Stream/GET";
            const string txMetric      = "ExternalTransaction/www.bar.com/cpId/otherTxName";

            Assert.IsTrue(unscoped.ContainsKey("External/all"));
            Assert.IsTrue(unscoped.ContainsKey("External/allWeb"));
            Assert.IsTrue(unscoped.ContainsKey("External/www.bar.com/all"));
            Assert.IsTrue(unscoped.ContainsKey(segmentMetric));
            Assert.IsTrue(unscoped.ContainsKey(txMetric));
            Assert.IsTrue(unscoped.ContainsKey("ExternalApp/www.bar.com/cpId/all"));

            Assert.IsFalse(scoped.ContainsKey(segmentMetric));
            Assert.IsTrue(scoped.ContainsKey(txMetric));

            var nameScoped   = scoped[txMetric];
            var nameUnscoped = unscoped[txMetric];

            Assert.AreEqual(1, nameScoped.Value0);
            Assert.AreEqual(1, nameUnscoped.Value0);
        }