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); }
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); }
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); }
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)); }
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); }
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) ); }
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) ); }
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); }
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); }
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); }