Esempio n. 1
0
        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 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));
        }
Esempio n. 3
0
        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 ReportsInfiniteTracingSupportabilityMetrics()
        {
            _agentHealthReporter.ReportInfiniteTracingSpanResponseError();
            _agentHealthReporter.ReportInfiniteTracingSpanGrpcError(EnumNameCache <StatusCode> .GetNameToUpperSnakeCase(StatusCode.Unimplemented));
            _agentHealthReporter.ReportInfiniteTracingSpanGrpcError(EnumNameCache <StatusCode> .GetNameToUpperSnakeCase(StatusCode.OutOfRange));
            _agentHealthReporter.ReportInfiniteTracingSpanGrpcTimeout();
            _agentHealthReporter.ReportInfiniteTracingSpanGrpcTimeout();
            _agentHealthReporter.ReportInfiniteTracingSpanEventsDropped(32);
            _agentHealthReporter.ReportInfiniteTracingSpanEventsSeen(1);
            _agentHealthReporter.ReportInfiniteTracingSpanEventsSent(13);
            _agentHealthReporter.ReportInfiniteTracingSpanEventsReceived(1);
            _agentHealthReporter.CollectMetrics();

            var expectedMetricNamesAndValues = new Dictionary <string, long>
            {
                { "Supportability/InfiniteTracing/Span/Response/Error", 1 },
                { "Supportability/InfiniteTracing/Span/gRPC/UNIMPLEMENTED", 1 },
                { "Supportability/InfiniteTracing/Span/gRPC/OUT_OF_RANGE", 1 },
                { "Supportability/InfiniteTracing/Span/gRPC/Timeout", 2 },
                { "Supportability/InfiniteTracing/Span/Dropped", 32 },
                { "Supportability/InfiniteTracing/Span/Seen", 1 },
                { "Supportability/InfiniteTracing/Span/Sent", 13 },
                { "Supportability/InfiniteTracing/Span/Received", 1 }
            };
            var actualMetricNamesAndValues = _publishedMetrics.Select(x => new KeyValuePair <string, long>(x.MetricName.Name, x.Data.Value0));

            CollectionAssert.IsSubsetOf(expectedMetricNamesAndValues, actualMetricNamesAndValues);
        }
Esempio n. 13
0
        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"));
        }
Esempio n. 14
0
        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);
        }
Esempio n. 15
0
        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();
        }
Esempio n. 18
0
        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);
        }
Esempio n. 20
0
        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);
        }
Esempio n. 22
0
        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);
        }
Esempio n. 24
0
        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)
            );
        }
Esempio n. 26
0
        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)
                );
        }
Esempio n. 27
0
        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()));
            }
        }
Esempio n. 28
0
        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);
        }
Esempio n. 29
0
        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);
        }
Esempio n. 30
0
        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));
        }