private ITransaction TryCreateTransaction(IAgent agent, HttpContext httpContext, string requestNotification) { // MapRequestHandler is always called so if we make it past that without having already started a transaction then don't start one since we already missed too much. This is likely to occur during startup when the transaction service spins up half way through a request. var earlyEnoughInTransactionLifecycleToCreate = Statics.PossibleEvents .TakeWhile(@event => @event != "AcquireRequestState") .Where(@event => @event == requestNotification) .Any(); if (!earlyEnoughInTransactionLifecycleToCreate) { return(agent.CurrentTransaction); } Action onCreate = () => { HttpContextActions.TransactionStartup(agent, httpContext); }; return(agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.ASP), transactionDisplayName: "Integrated Pipeline", doNotTrackAsUnitOfWork: true, wrapperOnCreate: onCreate)); }
public void SupportabilityMetric_Response_Accept_Exception() { //Collect the different metric counts in a dictionary that we can use var conditionCounts = new Dictionary <CATSupportabilityCondition, int>(); Mock.Arrange(() => _catMetricCounters.Record(Arg.IsAny <CATSupportabilityCondition>())) .DoInstead <CATSupportabilityCondition>((cond) => { if (!conditionCounts.ContainsKey(cond)) { conditionCounts.Add(cond, 0); } conditionCounts[cond]++; }); var clientTrx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "client", doNotTrackAsUnitOfWork: true); var clientSegment = _agent.StartExternalRequestSegmentOrThrow(new Uri("http://test"), "get"); var dupResponseMetaData = new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>("X-NewRelic-App-Data", "123456"), }; clientTrx.ProcessInboundResponse(dupResponseMetaData, clientSegment); NrAssert.Multiple ( () => TestExistenceOfConditions(conditionCounts, CATSupportabilityCondition.Response_Accept_Failure), () => TestConditionValue(conditionCounts, CATSupportabilityCondition.Response_Accept_Failure, 1)); }
public void GetTransactionEvent_ReturnsCorrectDistributedTraceAttributes() { // ARRANGE Mock.Arrange(() => _configurationService.Configuration.DistributedTracingEnabled).Returns(true); var immutableTransaction = BuildTestImmutableTransaction(sampled: true, guid: "guid", isDTParticipant: _configurationService.Configuration.DistributedTracingEnabled); var transactionMetricName = _transactionMetricNameMaker.GetTransactionMetricName(immutableTransaction.TransactionName); var txStats = new TransactionMetricStatsCollection(transactionMetricName); var attributes = _transactionAttributeMaker.GetAttributes(immutableTransaction, transactionMetricName, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(15), txStats); // ACT var transactionEvent = _transactionEventMaker.GetTransactionEvent(immutableTransaction, attributes); var intrinsicAttributes = transactionEvent.IntrinsicAttributes(); // ASSERT NrAssert.Multiple( //Test Change: Moved from 19->18, missing attribute is transactionName which belongs to error events. () => Assert.AreEqual(18, intrinsicAttributes.Count, "intrinsicAttributes.Count"), () => Assert.Contains("guid", intrinsicAttributes.Keys.ToArray(), "IntrinsicAttributes.Keys.Contains('guid')"), () => Assert.AreEqual(immutableTransaction.TracingState.Type.ToString(), intrinsicAttributes["parent.type"], "parent.type"), () => Assert.AreEqual(immutableTransaction.TracingState.AppId, intrinsicAttributes["parent.app"], "parent.app"), () => Assert.AreEqual(immutableTransaction.TracingState.AccountId, intrinsicAttributes["parent.account"], "parent.account"), () => Assert.AreEqual(EnumNameCache <TransportType> .GetName(immutableTransaction.TracingState.TransportType), intrinsicAttributes["parent.transportType"], "parent.transportType"), () => Assert.AreEqual(immutableTransaction.TracingState.TransportDuration.TotalSeconds, (double)intrinsicAttributes["parent.transportDuration"], 0.000001d, "parent.transportDuration"), () => Assert.AreEqual(immutableTransaction.TracingState.TransactionId, intrinsicAttributes["parentId"], "parentId"), () => Assert.AreEqual(immutableTransaction.TracingState.ParentId, intrinsicAttributes["parentSpanId"], "parentSpanId"), () => Assert.AreEqual(immutableTransaction.TraceId, intrinsicAttributes["traceId"], "traceId"), () => Assert.AreEqual(immutableTransaction.Priority, intrinsicAttributes["priority"], "priority"), () => Assert.AreEqual(immutableTransaction.Sampled, intrinsicAttributes["sampled"], "sampled") ); }
public void CreatesDatastoreTransactionButNoExplainPlanWhenVendorValidationFails() { var sqlCommand = new SqlCommand(); var commandText = "SELECT * FROM Table1"; sqlCommand.CommandText = commandText; _compositeTestAgent.LocalConfiguration.transactionTracer.explainEnabled = true; _compositeTestAgent.LocalConfiguration.transactionTracer.explainThreshold = 0; // Config to run explain plans on queries with any nonzero duration _compositeTestAgent.PushConfiguration(); var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartDatastoreRequestSegmentOrThrow("SELECT", DatastoreVendor.MSSQL, "Table1", commandText); _agent.EnableExplainPlans(segment, () => AllocateResources(sqlCommand), GenerateExplainPlan, () => new VendorExplainValidationResult(false)); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); var sqlTrace = _compositeTestAgent.SqlTraces.First(); var transactionSegments = transactionTrace.TransactionTraceData.RootSegment.Children; var transactionTraceSegmentParameters = transactionSegments.First().Children.First().Parameters; NrAssert.Multiple( () => Assert.IsFalse(sqlTrace.ParameterData.ContainsKey("explain_plan")), () => Assert.IsFalse(transactionTraceSegmentParameters.ContainsKey("explain_plan")) ); }
public void SupportabilityMetric_Request_Create_Failure_Exception() { //Collect the different metric counts in a dictionary that we can use var conditionCounts = new Dictionary <CATSupportabilityCondition, int>(); Mock.Arrange(() => _catMetricCounters.Record(Arg.IsAny <CATSupportabilityCondition>())) .DoInstead <CATSupportabilityCondition>((cond) => { if (cond == CATSupportabilityCondition.Request_Create_Success) { throw new Exception("Test Exception"); } if (!conditionCounts.ContainsKey(cond)) { conditionCounts.Add(cond, 0); } conditionCounts[cond]++; }); var trx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); trx.GetRequestMetadata(); NrAssert.Multiple ( () => TestExistenceOfConditions(conditionCounts, CATSupportabilityCondition.Request_Create_Failure), () => TestConditionValue(conditionCounts, CATSupportabilityCondition.Request_Create_Failure, 1) ); }
public void TransactionSqlSegments() { var stopWatch = Stopwatch.StartNew(); while (stopWatch.ElapsedMilliseconds < PerIterationRunTime.TotalMilliseconds) { var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); for (var x = 0; x < 500; x++) { _agent.StartDatastoreRequestSegmentOrThrow("operation", DatastoreVendor.MongoDB, "model").End(); _agent.StartDatastoreRequestSegmentOrThrow("oper", DatastoreVendor.MySQL, "mod", host: "localhost", portPathOrId: "8080", databaseName: "myDB").End(); } segment.End(); tx.End(); _counter.Increment(); } stopWatch.Stop(); }
public void SimpleTransaction_CreatesDatastoreTransactionAndSqlTrace_NoQueryParameterInput_HasNoQueryParameters() { _compositeTestAgent.LocalConfiguration.transactionTracer.explainThreshold = 0; // Config to run explain plans on queries with any nonzero duration _compositeTestAgent.LocalConfiguration.transactionTracer.recordSql = configurationTransactionTracerRecordSql.raw; _compositeTestAgent.LocalConfiguration.datastoreTracer.queryParameters.enabled = true; _compositeTestAgent.PushConfiguration(); var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartDatastoreRequestSegmentOrThrow("SELECT", DatastoreVendor.MSSQL, "Table1", "SELECT * FROM Table1"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var sqlTrace = _compositeTestAgent.SqlTraces.First(); NrAssert.Multiple( () => Assert.IsNotNull(sqlTrace), () => Assert.IsFalse(sqlTrace.ParameterData.ContainsKey("query_parameters")) ); }
public void ResponseTimeShouldMatchTransactionDurationForWebTransactions() { //Setup a transaction where the response time and transaction duration are about the same var upperBoundStopWatch = Stopwatch.StartNew(); var transaction = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "rootSegmentMetricName", doNotTrackAsUnitOfWork: true); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); var lowerBoundStopWatch = Stopwatch.StartNew(); Thread.Sleep(TimeSpan.FromSeconds(0.5)); segment.End(); lowerBoundStopWatch.Stop(); transaction.End(); upperBoundStopWatch.Stop(); _compositeTestAgent.Harvest(); //Use the WebTransaction metric which should contain the response time var timingMetric = _compositeTestAgent.Metrics.First(x => x.MetricName.Name == "WebTransaction"); NrAssert.Multiple( () => Assert.GreaterOrEqual(timingMetric.Data.Value1, lowerBoundStopWatch.Elapsed.TotalSeconds), () => Assert.LessOrEqual(timingMetric.Data.Value1, upperBoundStopWatch.Elapsed.TotalSeconds) ); }
public void ResponseTimeAndDurationAreNotTheSameForWebTransactions() { //Setup a transaction where the response time and transaction duration are different var stopWatch = Stopwatch.StartNew(); var transaction = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "rootSegmentMetricName", doNotTrackAsUnitOfWork: true); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); transaction.Hold(); transaction.End(); var expectedResponseTimeUpperBound = stopWatch.Elapsed.TotalSeconds; //Cause a delay so that response time and duration should be very different Thread.Sleep(TimeSpan.FromSeconds(0.5)); segment.End(); transaction.Release(); stopWatch.Stop(); _compositeTestAgent.Harvest(); //Use the WebTransaction metric which should contain the response time var timingMetric = _compositeTestAgent.Metrics.First(x => x.MetricName.Name == "WebTransaction"); Assert.LessOrEqual(timingMetric.Data.Value1, expectedResponseTimeUpperBound); }
public void NoRequestUriInTransactionTrace() { _compositeTestAgent.LocalConfiguration.attributes.exclude = new List <string> { "request.uri" }; _compositeTestAgent.PushConfiguration(); var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); tx.SetUri("myuri"); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => Assert.IsFalse(transactionTrace.GetAttributes(AttributeClassification.AgentAttributes).ContainsKey("request.uri")), () => Assert.AreEqual(null, transactionTrace.Uri) ); }
public void ErrorTransaction_CreatesErrorTraceAndEvent() { var transaction = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "rootSegmentMetricName", doNotTrackAsUnitOfWork: true); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); transaction.NoticeError(new Exception("Oh no!")); segment.End(); transaction.End(); _compositeTestAgent.Harvest(); var transactionEvent = _compositeTestAgent.TransactionEvents.FirstOrDefault(); var errorTrace = _compositeTestAgent.ErrorTraces.FirstOrDefault(); NrAssert.Multiple( () => Assert.AreEqual("System.Exception", transactionEvent.IntrinsicAttributes()["errorType"]), () => Assert.AreEqual("Oh no!", transactionEvent.IntrinsicAttributes()["errorMessage"]), () => Assert.AreEqual("WebTransaction/Action/rootSegmentMetricName", errorTrace.Path), () => Assert.AreEqual("System.Exception", errorTrace.ExceptionClassName), () => Assert.AreEqual("Oh no!", errorTrace.Message) ); }
public void TransactionTrace_HasNoQueryParameters() { _compositeTestAgent.LocalConfiguration.transactionTracer.explainThreshold = 0; _compositeTestAgent.LocalConfiguration.transactionTracer.recordSql = configurationTransactionTracerRecordSql.raw; _compositeTestAgent.LocalConfiguration.datastoreTracer.queryParameters.enabled = false; _compositeTestAgent.PushConfiguration(); var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var queryParameters = new Dictionary <string, IConvertible> { { "myKey", "myValue" } }; var segment = _agent.StartDatastoreRequestSegmentOrThrow("SELECT", DatastoreVendor.MSSQL, "Table1", "SELECT * FROM Table1", queryParameters: queryParameters); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var transactionTrace = _compositeTestAgent.TransactionTraces.FirstOrDefault(); Assert.IsNotNull(transactionTrace); var parameters = transactionTrace.TransactionTraceData.RootSegment.Children[0].Children[0].Parameters; Assert.IsFalse(parameters.ContainsKey("query_parameters")); }
public void ShouldNotAcceptBadStringDistributedTracePayload() { var agentWrapperApi = _compositeTestAgent.GetAgent(); var transaction = agentWrapperApi.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.ASP), transactionDisplayName: "TransactionName", doNotTrackAsUnitOfWork: true); var transactionBridgeApi = new TransactionBridgeApi(transaction, _apiSupportabilityMetricCounters, _configSvc); var segment = agentWrapperApi.StartTransactionSegmentOrThrow("segment"); transactionBridgeApi.AcceptDistributedTracePayload(_badDistributedTracePayloadString, 0 /*Unknown TransportType see Agent\NewRelic.Api.Agent\TransportType.cs for more info*/); segment.End(); transaction.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new List <ExpectedMetric> { new ExpectedCountMetric { Name = "Supportability/DistributedTrace/AcceptPayload/ParseException", CallCount = 1 } }; MetricAssertions.MetricsExist(expectedMetrics, _compositeTestAgent.Metrics); }
public void ShouldAcceptStringDistributedTracePayloadWhenDTEnabled() { var agentWrapperApi = _compositeTestAgent.GetAgent(); var transaction = agentWrapperApi.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.ASP), transactionDisplayName: "TransactionName", doNotTrackAsUnitOfWork: true); var transactionBridgeApi = new TransactionBridgeApi(transaction, _apiSupportabilityMetricCounters, _configSvc); var segment = agentWrapperApi.StartTransactionSegmentOrThrow("segment"); transactionBridgeApi.AcceptDistributedTracePayload(_distributedTracePayload.ToJson(), 0 /*Unknown TransportType see Agent\NewRelic.Api.Agent\TransportType.cs for more info*/); segment.End(); transaction.End(); _compositeTestAgent.Harvest(); var transactionEvent = _compositeTestAgent.TransactionEvents.First(); var transactionAttributes = transactionEvent.IntrinsicAttributes(); NrAssert.Multiple( () => Assert.AreEqual(_traceId, transactionAttributes["traceId"]), () => Assert.AreEqual(_type.ToString(), transactionAttributes["parent.type"]), () => Assert.AreEqual(_appId, transactionAttributes["parent.app"]), () => Assert.AreEqual(_accountId, transactionAttributes["parent.account"]), () => Assert.AreEqual("Unknown", transactionAttributes["parent.transportType"]), () => Assert.True(transactionAttributes.ContainsKey("parent.transportDuration")), () => Assert.AreEqual(_transactionId, transactionAttributes["parentId"]), () => Assert.AreEqual(_priority, transactionAttributes["priority"]), () => Assert.AreEqual(_sampled, transactionAttributes["sampled"]) ); }
public void SetWebTransactionNameFromPath_UpdatesTransactionNameCorrectly() { var transaction = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); transaction.SetWebTransactionNameFromPath(WebTransactionType.ASP, "foo"); _agent.StartTransactionSegmentOrThrow("simpleName").End(); transaction.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new[] { new ExpectedMetric { Name = "WebTransaction/Uri/foo" } }; var actualMetrics = _compositeTestAgent.Metrics.ToList(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => MetricAssertions.MetricsExist(expectedMetrics, actualMetrics), () => Assert.AreEqual("WebTransaction/Uri/foo", transactionTrace.TransactionMetricName) ); }
public void ResponseTimeShouldNotBeCapturedWhenReleasingATransactionBeforeItEnds() { //Setup a transaction where the response time and transaction duration are different var upperBoundStopWatch = Stopwatch.StartNew(); var transaction = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "rootSegmentMetricName", doNotTrackAsUnitOfWork: true); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); var lowerBoundStopWatch = Stopwatch.StartNew(); transaction.Hold(); segment.End(); transaction.Release(); //Cause a delay so that we can clearly see a difference between the time when Release and End are called Thread.Sleep(TimeSpan.FromSeconds(0.5)); lowerBoundStopWatch.Stop(); transaction.End(); upperBoundStopWatch.Stop(); _compositeTestAgent.Harvest(); //Use the WebTransaction metric which should contain the response time var timingMetric = _compositeTestAgent.Metrics.First(x => x.MetricName.Name == "WebTransaction"); NrAssert.Multiple( () => Assert.GreaterOrEqual(timingMetric.Data.Value1, lowerBoundStopWatch.Elapsed.TotalSeconds), () => Assert.LessOrEqual(timingMetric.Data.Value1, upperBoundStopWatch.Elapsed.TotalSeconds) ); }
public void TransactionMultipleSqlTraces() { var stopWatch = Stopwatch.StartNew(); _compositeTestAgent.LocalConfiguration.slowSql.enabled = true; _compositeTestAgent.LocalConfiguration.transactionTracer.explainThreshold = 0; _compositeTestAgent.PushConfiguration(); while (stopWatch.ElapsedMilliseconds < PerIterationRunTime.TotalMilliseconds) { var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); for (var x = 0; x < 1000; x++) { var commandText = "SELECT * FROM Table" + x.ToString(); // sqlId derived from commandText must be unique to generate multiple non-aggregated sqltraces var seg1 = _agent.StartDatastoreRequestSegmentOrThrow("SELECT", DatastoreVendor.MSSQL, "Model", commandText); seg1.End(); } segment.End(); tx.End(); _counter.Increment(); } stopWatch.Stop(); }
public void UnfinishedSegments_AreStillReported() { var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment1 = _agent.StartTransactionSegmentOrThrow("segmentName1"); segment1.End(); _agent.StartTransactionSegmentOrThrow("segmentName2"); // Finish the transaction without ending segmentName2 tx.End(); _compositeTestAgent.Harvest(); var rootSegment = GetFirstSegmentOrThrow(); Assert.AreEqual(2, rootSegment.Children.Count); var finishedSegment = rootSegment.Children.ElementAt(0); var unfinishedSegment = rootSegment.Children.ElementAt(1); NrAssert.Multiple( () => Assert.AreEqual("segmentName1", finishedSegment.Name), () => Assert.IsFalse(finishedSegment.Parameters.ContainsKey("unfinished")), () => Assert.AreEqual("segmentName2", unfinishedSegment.Name), () => Assert.IsTrue(unfinishedSegment.Parameters.ContainsKey("unfinished")) ); }
private ITransaction SetupTransaction(HttpRequest request) { var path = request.Path.Value; path = "/".Equals(path) ? "ROOT" : path.Substring(1); var transaction = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.ASP), transactionDisplayName: path, doNotTrackAsUnitOfWork: true); transaction.SetUri(request.Path); if (request.QueryString.HasValue) { var parameters = new Dictionary <string, string>(); foreach (var keyValuePair in request.Query) { parameters.Add(keyValuePair.Key, keyValuePair.Value); } transaction.SetRequestParameters(parameters); } return(transaction); }
public void CustomSegment_HasCorrectTraceNameAndMetrics() { var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartCustomSegmentOrThrow("customName"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new[] { new ExpectedMetric { Name = "Custom/customName" }, new ExpectedMetric { Name = "Custom/customName", Scope = "WebTransaction/Action/name" } }; var expectedSegments = new[] { "customName" }; var actualMetrics = _compositeTestAgent.Metrics.ToList(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => TransactionTraceAssertions.SegmentsExist(expectedSegments, transactionTrace), () => MetricAssertions.MetricsExist(expectedMetrics, actualMetrics) ); }
public void CreatesTransactionAndSqlTrace_RequestUriLocallyExcluded() { _compositeTestAgent.LocalConfiguration.transactionTracer.explainThreshold = 0; // Config to run explain plans on queries with any nonzero duration _compositeTestAgent.LocalConfiguration.transactionTracer.attributes.exclude = new List <string> { "request.uri" }; _compositeTestAgent.LocalConfiguration.transactionEvents.attributes.exclude = new List <string> { "request.uri" }; _compositeTestAgent.LocalConfiguration.errorCollector.attributes.exclude = new List <string> { "request.uri" }; _compositeTestAgent.PushConfiguration(); var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); tx.SetUri("myuri"); var segment = _agent.StartDatastoreRequestSegmentOrThrow("SELECT", DatastoreVendor.MSSQL, "Table1", "SELECT * FROM Table1"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var sqlTrace = _compositeTestAgent.SqlTraces.First(); Assert.AreEqual("myuri", sqlTrace.Uri); }
public void CustomSegment_HasCorrectMetrics_IfInputIsPrefixedWithCustom() { var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartCustomSegmentOrThrow("Custom/customName"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new[] { // The agent should de-duplicate the "Custom/" prefix that was passed in new ExpectedMetric { Name = "Custom/customName" }, new ExpectedMetric { Name = "Custom/customName", Scope = "WebTransaction/Action/name" } }; var actualMetrics = _compositeTestAgent.Metrics.ToList(); MetricAssertions.MetricsExist(expectedMetrics, actualMetrics); }
public void keytransaction_trace_created_when_configured_and_above_apdexT() { // ARRANGE var keyTransactions = new Dictionary <string, double> { { "WebTransaction/Action/name", 0.00001 } }; _compositeTestAgent.ServerConfiguration.WebTransactionsApdex = keyTransactions; _compositeTestAgent.ServerConfiguration.ApdexT = 10.0; _compositeTestAgent.ServerConfiguration.RpmConfig.TransactionTracerThreshold = 10.0; _compositeTestAgent.PushConfiguration(); // ==== ACT ==== var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); // ==== ACT ==== // ASSERT var transactionTrace = _compositeTestAgent.TransactionTraces.First(); Assert.AreEqual("WebTransaction/Action/name", transactionTrace.TransactionMetricName); }
public void SiblingSegments_AreNestedTogether() { var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartTransactionSegmentOrThrow("childSegment1"); segment.End(); segment = _agent.StartTransactionSegmentOrThrow("childSegment2"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var rootSegment = GetFirstSegmentOrThrow(); NrAssert.Multiple( () => Assert.AreEqual(2, rootSegment.Children.Count), () => Assert.AreEqual("childSegment1", rootSegment.Children[0].Name), () => Assert.AreEqual(0, rootSegment.Children[0].Children.Count), () => Assert.AreEqual("childSegment2", rootSegment.Children[1].Name), () => Assert.AreEqual(0, rootSegment.Children[1].Children.Count) ); }
public void SupportabilityMetric_Request_Accept_Success() { //Collect the different metric counts in a dictionary that we can use var conditionCounts = new Dictionary <CATSupportabilityCondition, int>(); Mock.Arrange(() => _catMetricCounters.Record(Arg.IsAny <CATSupportabilityCondition>())) .DoInstead <CATSupportabilityCondition>((cond) => { if (!conditionCounts.ContainsKey(cond)) { conditionCounts.Add(cond, 0); } conditionCounts[cond]++; }); var trx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var requestHeaders = new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>(NewRelicIdHttpHeader, _crossProcessIDEncoded), new KeyValuePair <string, string>(TransactionDataHttpHeader, _reqDataEncoded) }; _agent.CurrentTransaction.AcceptDistributedTraceHeaders(requestHeaders, HeaderFunctions.GetHeaders, TransportType.HTTP); NrAssert.Multiple ( () => TestExistenceOfConditions(conditionCounts, CATSupportabilityCondition.Request_Accept_Success), () => TestConditionValue(conditionCounts, CATSupportabilityCondition.Request_Accept_Success, 1) ); }
public void SetMessageBrokerTransactionName_UpdatesTransactionNameCorrectly() { var transaction = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); transaction.SetMessageBrokerTransactionName(MessageBrokerDestinationType.Queue, "vendor", "dest", TransactionNamePriority.Route); var segment = _agent.StartTransactionSegmentOrThrow("simpleName"); segment.End(); transaction.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new[] { new ExpectedMetric { Name = "OtherTransaction/Message/vendor/Queue/Named/dest" } }; var actualMetrics = _compositeTestAgent.Metrics.ToList(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => MetricAssertions.MetricsExist(expectedMetrics, actualMetrics), () => Assert.AreEqual("OtherTransaction/Message/vendor/Queue/Named/dest", transactionTrace.TransactionMetricName) ); }
public void CreatedTransactionIdTraceIdSpanIdShouldBeLowerCase() { EventBus <AgentConnectedEvent> .Publish(new AgentConnectedEvent()); var transaction = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: false); var segment = _agent.StartTransactionSegmentOrThrow("segment"); segment.End(); transaction.End(); _compositeTestAgent.Harvest(); foreach (var span in _compositeTestAgent.SpanEvents) { var intrinsicAttributes = span.IntrinsicAttributes(); Assert.IsTrue(IsLowerCase(intrinsicAttributes["traceId"].ToString())); Assert.IsTrue(IsLowerCase(intrinsicAttributes["transactionId"].ToString())); } foreach (TransactionEventWireModel tx in _compositeTestAgent.TransactionEvents) { Assert.IsTrue(IsLowerCase(tx.IntrinsicAttributes()["guid"].ToString())); Assert.IsTrue(IsLowerCase(tx.IntrinsicAttributes()["traceId"].ToString())); } }
public void SetWebTransactionName_NotOverriddenByLowerPriorityName() { // ARRANGE var agentWrapperApi = _compositeTestAgent.GetAgent(); // ACT var transaction = agentWrapperApi.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = agentWrapperApi.StartTransactionSegmentOrThrow("segment"); segment.End(); transaction.SetWebTransactionName(WebTransactionType.Action, "priority1", TransactionNamePriority.Uri); transaction.SetWebTransactionName(WebTransactionType.Action, "priority0", (TransactionNamePriority)(0)); transaction.End(); _compositeTestAgent.Harvest(); // ASSERT var actualMetrics = _compositeTestAgent.Metrics; var expectedMetrics = new[] { new ExpectedTimeMetric { Name = "WebTransaction/Action/priority1", CallCount = 1 } }; MetricAssertions.MetricsExist(expectedMetrics, actualMetrics); }
private ITransaction SetupTransaction(IOwinRequest request) { var path = request.Path.Value; path = "/".Equals(path) ? "ROOT" : path.Substring(1); var transaction = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Custom), transactionDisplayName: path, doNotTrackAsUnitOfWork: true); transaction.SetUri(string.IsNullOrEmpty(request.Path.Value) ? "/Unknown" : request.Path.Value); if (request.QueryString.HasValue) { var parameters = new Dictionary <string, string>(); foreach (var keyValuePair in request.Query) { parameters.Add(keyValuePair.Key, ConvertQueryStringValueToSingleValue(keyValuePair.Value)); } transaction.SetRequestParameters(parameters); } return(transaction); }
static MetricNames() { _databaseVendorAll = GetEnumerationFunc <DatastoreVendor, MetricName>(vendor => MetricName.Create(Datastore + PathSeparator + EnumNameCache <DatastoreVendor> .GetName(vendor) + PathSeparator + All)); _databaseVendorAllWeb = GetEnumerationFunc <DatastoreVendor, MetricName>(vendor => MetricName.Create(Datastore + PathSeparator + EnumNameCache <DatastoreVendor> .GetName(vendor) + PathSeparator + AllWeb)); _databaseVendorAllOther = GetEnumerationFunc <DatastoreVendor, MetricName>(vendor => MetricName.Create(Datastore + PathSeparator + EnumNameCache <DatastoreVendor> .GetName(vendor) + PathSeparator + AllOther)); var operations = new HashSet <string>(SqlParser.Operations); operations.Add(DatastoreUnknownOperationName); _databaseVendorOperations = GetEnumerationFunc <DatastoreVendor, Func <string, MetricName> >( vendor => { var dict = new Dictionary <string, MetricName>(operations.Count); var metricNamePrefix = DatastoreOperation + PathSeparator + EnumNameCache <DatastoreVendor> .GetName(vendor) + PathSeparator; foreach (var operation in operations) { dict[operation] = MetricName.Create(metricNamePrefix + operation); } return(operation => (dict.TryGetValue(operation, out var name)) ? name : MetricName.Create(DatastoreOperation, EnumNameCache <DatastoreVendor> .GetName(vendor), operation)); }); }