public void GetErrorEvent_InTransaction_IfStatusCodeIs404_ContainsCorrectAttributes()
        {
            var transaction          = BuildTestTransaction(statusCode: 404, uri: "http://www.newrelic.com/test?param=value", isSynthetics: false, isCAT: false, referrerUri: "http://referrer.uri");
            var immutableTransaction = transaction.ConvertToImmutableTransaction();

            var errorData             = transaction.TransactionMetadata.TransactionErrorState.ErrorData;
            var transactionMetricName = _transactionMetricNameMaker.GetTransactionMetricName(immutableTransaction.TransactionName);
            var txStats = new TransactionMetricStatsCollection(transactionMetricName);

            var attributes = _transactionAttributeMaker.GetAttributes(immutableTransaction, transactionMetricName, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(15), txStats);

            var errorEvent = _errorEventMaker.GetErrorEvent(immutableTransaction, attributes);

            var intrinsicAttributes = errorEvent.IntrinsicAttributes().Keys.ToArray();
            var agentAttributes     = errorEvent.AgentAttributes().Keys.ToArray();
            var userAttributes      = errorEvent.UserAttributes().Keys.ToArray();

            NrAssert.Multiple(
                () => Assert.AreEqual(false, errorEvent.IsSynthetics),
                () => Assert.AreEqual(7, agentAttributes.Length),
                () => Assert.AreEqual(7, intrinsicAttributes.Length),
                () => Assert.AreEqual(0, userAttributes.Length),

                () => Assert.Contains("queue_wait_time_ms", agentAttributes),
                () => Assert.Contains("response.status", agentAttributes),
                () => Assert.Contains("http.statusCode", agentAttributes),
                () => Assert.Contains("original_url", agentAttributes),
                () => Assert.Contains("request.uri", agentAttributes),
                () => Assert.Contains("request.referer", agentAttributes),
                () => Assert.Contains("host.displayName", agentAttributes),

                () => Assert.Contains("duration", intrinsicAttributes),
                () => Assert.Contains("error.class", intrinsicAttributes),
                () => Assert.Contains("error.message", intrinsicAttributes),
                () => Assert.Contains("queueDuration", intrinsicAttributes),
                () => Assert.Contains("transactionName", intrinsicAttributes),
                () => Assert.Contains("timestamp", intrinsicAttributes),
                () => Assert.Contains("type", intrinsicAttributes)
                );
        }
Exemplo n.º 2
0
        public void Test()
        {
            var expectedMetrics = new List <Assertions.ExpectedMetric>()
            {
                new Assertions.ExpectedMetric {
                    metricName = "Datastore/all", callCount = 3
                },
                new Assertions.ExpectedMetric {
                    metricName = "Datastore/Redis/all", callCount = 3
                },

                new Assertions.ExpectedMetric {
                    metricName = "Datastore/operation/Redis/" + ServiceStackRedisCommands.SaveAsync, callCount = 1
                },
                new Assertions.ExpectedMetric {
                    metricName = "Datastore/operation/Redis/" + ServiceStackRedisCommands.SaveAsync, metricScope = "WebTransaction/MVC/RedisController/Get", callCount = 1
                },

                new Assertions.ExpectedMetric {
                    metricName = "Datastore/operation/Redis/" + ServiceStackRedisCommands.Shutdown, callCount = 1
                },
                new Assertions.ExpectedMetric {
                    metricName = "Datastore/operation/Redis/" + ServiceStackRedisCommands.Shutdown, metricScope = "WebTransaction/MVC/RedisController/Get", callCount = 1
                },

                new Assertions.ExpectedMetric {
                    metricName = "Datastore/operation/Redis/" + ServiceStackRedisCommands.RewriteAppendOnlyFileAsync, callCount = 1
                },
                new Assertions.ExpectedMetric {
                    metricName = "Datastore/operation/Redis/" + ServiceStackRedisCommands.RewriteAppendOnlyFileAsync, metricScope = "WebTransaction/MVC/RedisController/Get", callCount = 1
                },
            };

            var actualMetrics = _fixture.AgentLog.GetMetrics().ToList();

            NrAssert.Multiple
            (
                () => Assertions.MetricsExist(expectedMetrics, actualMetrics)
            );
        }
Exemplo n.º 3
0
        public void Test()
        {
            var expectedMetrics = new List <Assertions.ExpectedMetric>
            {
                new Assertions.ExpectedMetric {
                    metricName = @"OtherTransaction/Custom/MyCustomMetricName", callCount = 1
                },
                new Assertions.ExpectedMetric {
                    metricName = @"Custom/MyCustomMetricName", callCount = 1
                },
                new Assertions.ExpectedMetric {
                    metricName = @"Custom/MyCustomMetricName", metricScope = "OtherTransaction/Custom/MyCustomMetricName", callCount = 1
                }
            };

            var expectedTransactionTraceSegments = new List <string>
            {
                @"MyCustomMetricName",
            };

            var metrics = _fixture.AgentLog.GetMetrics().ToList();

            var transactionSample = _fixture.AgentLog
                                    .GetTransactionSamples()
                                    .FirstOrDefault(sample => sample.Path == @"OtherTransaction/Custom/MyCustomMetricName");

            var transactionEvent = _fixture.AgentLog.GetTransactionEvents()
                                   .FirstOrDefault();

            NrAssert.Multiple(
                () => Assert.NotNull(transactionSample),
                () => Assert.NotNull(transactionEvent)
                );

            NrAssert.Multiple
            (
                () => Assertions.MetricsExist(expectedMetrics, metrics),
                () => Assertions.TransactionTraceSegmentsExist(expectedTransactionTraceSegments, transactionSample)
            );
        }
        public void Test()
        {
            var expectedMetrics = new List <Assertions.ExpectedMetric>
            {
                // Most application-level metrics (which come from async calls) are suppressed by the existence of the legacy asp pipeline
                new Assertions.ExpectedMetric {
                    metricName = @"DotNet/PostgresController/PostgresAsync", callCount = 1
                },
                new Assertions.ExpectedMetric {
                    metricName = @"DotNet/Npgsql.NpgsqlConnection/Open", callCount = 1
                },
                new Assertions.ExpectedMetric {
                    metricName = @"WebTransaction/MVC/PostgresController/PostgresAsync", callCount = 1
                },
            };

            var unexpectedMetrics = new List <Assertions.ExpectedMetric>
            {
                // These should be suppressed by the existence of the legacy asp pipeline
                new Assertions.ExpectedMetric {
                    metricName = @"Datastore/statement/Postgres/teammembers/select", callCount = 1
                },
                new Assertions.ExpectedMetric {
                    metricName = @"Datastore/statement/Postgres/teammembers/select", callCount = 1, metricScope = "WebTransaction/MVC/PostgresController/PostgresAsync"
                },
            };

            var metrics = _fixture.AgentLog.GetMetrics().ToList();

            NrAssert.Multiple
            (
                () => Assertions.MetricsExist(expectedMetrics, metrics),
                () => Assertions.MetricsDoNotExist(unexpectedMetrics, metrics)
            );

            var httpClientSuppressedRegex =
                @".* The method (.+) in class (.+) from assembly (.+) will not be instrumented. (.*)";

            Assert.NotNull(_fixture.AgentLog.TryGetLogLine(httpClientSuppressedRegex));
        }
        public void SimpleTransaction_CreatesDatastoreTransactionAndExplainPlan()
        {
            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(true));
            segment.End();
            tx.End();

            _compositeTestAgent.Harvest();

            var transactionTrace       = _compositeTestAgent.TransactionTraces.First();
            var sqlTrace               = _compositeTestAgent.SqlTraces.First();
            var explainPlan            = (ExplainPlanWireModel)sqlTrace.ParameterData["explain_plan"];
            var explainPlanData        = explainPlan.ExplainPlanDatas.First().ToList();
            var transactionSegments    = transactionTrace.TransactionTraceData.RootSegment.Children;
            var transactionExplainPlan = (ExplainPlanWireModel)transactionSegments.First().Children.First().Parameters.Values.First();

            NrAssert.Multiple(
                () => Assert.IsNotNull(explainPlan),
                () => Assert.AreEqual(commandText, explainPlanData[0].ToString()),
                () => Assert.AreEqual("SELECT", explainPlanData[1].ToString()),
                () => Assert.IsTrue(sqlTrace.ParameterData.ContainsKey("explain_plan")),
                () => Assert.AreEqual(sqlTrace.ParameterData.Values.First(), explainPlan),
                () => Assert.AreEqual(transactionExplainPlan.ExplainPlanDatas, explainPlan.ExplainPlanDatas),
                () => Assert.AreEqual(transactionExplainPlan.ExplainPlanHeaders, explainPlan.ExplainPlanHeaders)
                );
        }
        public void SupportabilityMetric_Request_Accept_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_Accept_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);

            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_Failure),
                () => TestConditionValue(conditionCounts, CATSupportabilityCondition.Request_Accept_Failure, 1)
            );
        }
Exemplo n.º 7
0
        public void Test()
        {
            var expectedAttributes = new List <string>()
            {
                "parent.type",
                "parent.app",
                "parent.account",
                "parent.transportType",
                "parent.transportDuration",
                "guid",
                "traceId",
                "priority",
                "sampled"
            };

            var transactionEventExpectedAttributes = new List <string>(expectedAttributes)
            {
                "parentId"
            };

            var transactionEvent  = _fixture.AgentLog.GetTransactionEvents().FirstOrDefault();
            var errorEvent        = _fixture.AgentLog.GetErrorEvents().First().Events.First();
            var errorTrace        = _fixture.AgentLog.GetErrorTraces().FirstOrDefault();
            var transactionSample = _fixture.AgentLog.GetTransactionSamples()
                                    .FirstOrDefault(sample => sample.Path == @"WebTransaction/MVC/DistributedTracingController/ReceivePayload");

            NrAssert.Multiple(
                () => Assertions.TransactionEventHasAttributes(transactionEventExpectedAttributes, TransactionEventAttributeType.Intrinsic, transactionEvent),
                () => Assertions.ErrorEventHasAttributes(expectedAttributes, EventAttributeType.Intrinsic, errorEvent),
                () => Assertions.ErrorTraceHasAttributes(expectedAttributes, ErrorTraceAttributeType.Intrinsic, errorTrace),
                () => Assertions.TransactionTraceHasAttributes(expectedAttributes, TransactionTraceAttributeType.Intrinsic, transactionSample)
                );

            var parentIdKey      = "parentId";
            var expectedParentId = "27856f70d3d314b7";

            var transactionEventParentId = transactionEvent.IntrinsicAttributes[parentIdKey];

            Assert.Equal(expectedParentId, transactionEventParentId);
        }
        public void Test()
        {
            var metrics = _fixture.AgentLog.GetMetrics().ToList();

            Assert.NotNull(metrics);

            NrAssert.Multiple(
                () => Assertions.MetricsExist(_generalMetrics, metrics),
                () => Assert.Empty(_fixture.AgentLog.GetErrorTraces()),
                () => Assert.Empty(_fixture.AgentLog.GetErrorEvents())
                );

            NrAssert.Multiple
            (
                () => Assertions.MetricsExist(_ioBoundNoSpecialAsyncMetrics, metrics),
                () => Assertions.MetricsExist(_ioBoundConfigureAwaitFalseAsyncMetrics, metrics),
                () => Assertions.MetricsExist(_cpuBoundTasksAsyncMetrics, metrics)
            );

            NrAssert.Multiple
            (
                () => Assertions.MetricsExist(_manualTaskRunBlockedMetrics, metrics),
                () => Assertions.MetricsExist(_manualTaskFactoryStartNewMetrics, metrics),
                () => Assertions.MetricsExist(_manualNewThreadStartBlocked, metrics)
            );

            var transactionSample = _fixture.AgentLog.GetTransactionSamples().FirstOrDefault(sample => sample.Path == "WebTransaction/WebAPI/AsyncAwait/CpuBoundTasksAsync");
            var expectedTransactionTraceSegments = new List <string>
            {
                @"DotNet/AsyncAwait/CpuBoundTasksAsync",
                @"TaskRunBackgroundMethod",
                @"TaskFactoryStartNewBackgroundMethod"
            };

            NrAssert.Multiple(
                () => Assert.NotNull(transactionSample),
                () => Assertions.TransactionTraceSegmentsExist(expectedTransactionTraceSegments, transactionSample)
                );
        }
Exemplo n.º 9
0
        public void Test()
        {
            var catResponseHeader = _responseHeaders.GetValues(@"X-NewRelic-App-Data")?.FirstOrDefault();

            Assert.NotNull(catResponseHeader);

            var catResponseData = HeaderEncoder.DecodeAndDeserialize <CrossApplicationResponseData>(catResponseHeader, HeaderEncoder.IntegrationTestEncodingKey);

            var transactionSample = _fixture.AgentLog.TryGetTransactionSample("WebTransaction/MVC/DefaultController/Index");
            var transactionEvent  = _fixture.AgentLog.TryGetTransactionEvent("WebTransaction/MVC/DefaultController/Index");
            var metrics           = _fixture.AgentLog.GetMetrics();

            NrAssert.Multiple
            (
                () => Assert.NotNull(transactionSample),
                () => Assert.NotNull(transactionEvent)
            );

            NrAssert.Multiple
            (
                () => Assert.Equal(_fixture.AgentLog.GetCrossProcessId(), catResponseData.CrossProcessId),
                () => Assert.Equal("WebTransaction/MVC/DefaultController/Index", catResponseData.TransactionName),
                () => Assert.True(catResponseData.QueueTimeInSeconds >= 0),
                () => Assert.True(catResponseData.ResponseTimeInSeconds >= 0),
                () => Assert.Equal(-1, catResponseData.ContentLength),
                () => Assert.NotNull(catResponseData.TransactionGuid),
                () => Assert.False(catResponseData.Unused),

                // Trace attributes
                () => Assertions.TransactionTraceHasAttributes(Expectations.ExpectedTransactionTraceIntrinsicAttributesCatEnabled, TransactionTraceAttributeType.Intrinsic, transactionSample),
                () => Assertions.TransactionTraceDoesNotHaveAttributes(Expectations.UnexpectedTransactionTraceIntrinsicAttributesCatEnabled, TransactionTraceAttributeType.Intrinsic, transactionSample),

                // Event attributes
                () => Assertions.TransactionEventHasAttributes(Expectations.ExpectedTransactionEventIntrinsicAttributesCatEnabled, TransactionEventAttributeType.Intrinsic, transactionEvent),
                () => Assertions.TransactionEventDoesNotHaveAttributes(Expectations.UnexpectedTransactionEventIntrinsicAttributesCatEnabled, TransactionEventAttributeType.Intrinsic, transactionEvent),

                () => Assertions.MetricsExist(Expectations.ExpectedMetricsCatEnabled, metrics)
            );
        }
Exemplo n.º 10
0
        public void Test()
        {
            NrAssert.Multiple(
                () => Assert.Contains("NREUM", _browserTimingHeader),
                ShouldNotAutoInstrumentAfterCallToGetBrowserTimingHeader
                );

            var browserMonitoringConfig = JavaScriptAgent.GetJavaScriptAgentConfigFromSource(_browserTimingHeader);

            NrAssert.Multiple(
                () => Assert.Contains("beacon", browserMonitoringConfig.Keys),
                () => Assert.Contains("errorBeacon", browserMonitoringConfig.Keys),
                () => Assert.Contains("licenseKey", browserMonitoringConfig.Keys),
                () => Assert.Contains("applicationID", browserMonitoringConfig.Keys),
                () => Assert.Contains("transactionName", browserMonitoringConfig.Keys),
                () => Assert.Contains("queueTime", browserMonitoringConfig.Keys),
                () => Assert.Contains("applicationTime", browserMonitoringConfig.Keys),
                () => Assert.Contains("agent", browserMonitoringConfig.Keys),
                () => Assert.Contains("atts", browserMonitoringConfig.Keys)
                );

            var attrsDict = HeaderEncoder.DecodeAndDeserialize <Dictionary <string, IDictionary <string, object> > >(browserMonitoringConfig["atts"], _fixture.TestConfiguration.LicenseKey, 13);

            Assert.Contains("a", attrsDict.Keys);
            IDictionary <string, object> agentAttrsDict = attrsDict["a"];

            Assert.Contains("nr.tripId", agentAttrsDict.Keys);

            NrAssert.Multiple(
                () => Assert.NotNull(browserMonitoringConfig["beacon"]),
                () => Assert.NotNull(browserMonitoringConfig["errorBeacon"]),
                () => Assert.NotNull(browserMonitoringConfig["licenseKey"]),
                () => Assert.NotNull(browserMonitoringConfig["applicationID"]),
                () => Assert.NotNull(browserMonitoringConfig["transactionName"]),
                () => Assert.NotNull(browserMonitoringConfig["queueTime"]),
                () => Assert.NotNull(browserMonitoringConfig["applicationTime"]),
                () => Assert.NotNull(browserMonitoringConfig["agent"])
                );
        }
Exemplo n.º 11
0
        public void CAT()
        {
            var assertions = new List <Action>();

            if (_tracingTestOption != TracingTestOption.CAT)
            {
                return;
            }

            //We do this assertion here so that we don't pass this test if transactions have not been generated
            NrAssert.Multiple(
                () => Assert.NotEmpty(LogHelpers.TrxEvents),
                () => Assert.NotEmpty(LogHelpers.TrxEvents_Client),
                () => Assert.NotEmpty(LogHelpers.TrxEvents_Service));

            var catAttributes = new[]
            {
                "nr.guid",
                "nr.tripId",
                "nr.pathHash",
                "nr.referringPathHash",
                "nr.referringTransactionGuid"
            };

            foreach (var trx in LogHelpers.TrxEvents_Service)
            {
                var svcTrx = trx;

                //Assert that the transaction has the DT attributes
                assertions.Add(() => Assertions.TransactionEventHasAttributes(catAttributes, TransactionEventAttributeType.Intrinsic, svcTrx));

                //Given the ParentID on the Svc Transcation, we should find the client transaction that matches.
                var referringTrxId = svcTrx.IntrinsicAttributes["nr.referringTransactionGuid"].ToString();

                assertions.Add(() => Assert.True(LogHelpers.TrxTripIDs_Client.Contains(referringTrxId), $"Service Transaction's referringTransactionGuid={referringTrxId}, could not find corresponding client transaction."));
            }

            NrAssert.Multiple(assertions.ToArray());
        }
Exemplo n.º 12
0
        public void Transform_FiltersAttributesBeforeSendingThemToErrorTraceMaker()
        {
            // ARRANGE
            var attribValues = new AttributeValueCollection(AttributeDestinations.TransactionEvent, AttributeDestinations.ErrorEvent, AttributeDestinations.ErrorTrace, AttributeDestinations.JavaScriptAgent);;

            _attribDefs.GetCustomAttributeForCustomEvent("CustomEventAttrib").TrySetValue(attribValues, "CustomEventValue");        //CustomEvent
            _attribDefs.GetCustomAttributeForError("ErrorEventAttrib").TrySetValue(attribValues, "ErrorEventValue");                //Error Event and Trace
            _attribDefs.GetCustomAttributeForSpan("SpanEventAttrib").TrySetValue(attribValues, "SpanEventValue");                   //Span only
            _attribDefs.GetCustomAttributeForTransaction("TrxEventAttrib").TrySetValue(attribValues, "TrxEventValue");              //All Destiantions

            var errorCustomParameters = new ReadOnlyDictionary <string, object>(new Dictionary <string, object>()
            {
                { "ErrorCustomAttrib", "ErrorCustomValue" }
            });
            var errorNoticedAt = DateTime.Now;
            var errorMsg       = "ErrorMessage";
            var errorType      = "ErrorType";
            var stackTrace     = "StackTrace";

            var errorData = new ErrorData(errorMsg, errorType, stackTrace, errorNoticedAt, errorCustomParameters, false);

            // ACT
            var errorTrace = _errorTraceMaker.GetErrorTrace(attribValues, errorData);

            //CAPTURE
            var userAttribs = errorTrace.Attributes.UserAttributes;

            //ASSERT
            NrAssert.Multiple
            (
                () => Assert.AreEqual(errorType, errorTrace.ExceptionClassName),
                () => Assert.AreEqual(errorMsg, errorTrace.Message),
                () => Assert.AreEqual(errorNoticedAt, errorTrace.TimeStamp),

                () => Assert.AreEqual(2, userAttribs.Count),
                () => Assert.AreEqual("TrxEventValue", userAttribs["TrxEventAttrib"]),
                () => Assert.AreEqual("ErrorEventValue", userAttribs["ErrorEventAttrib"])
            );
        }
Exemplo n.º 13
0
        public void Test()
        {
            var expectedAttributes = new List <string>()
            {
                "type",
                "traceId",
                "guid",
                "transactionId",
                "sampled",
                "priority",
                "timestamp",
                "duration",
                "name",
                "category"
            };

            var expectedAgentAttributes = new List <string>()
            {
                "error.class",
                "error.message"
            };

            var unexpectedAttributes = new List <string>()
            {
                "parentId"
            };

            var spanEvents       = _fixture.AgentLog.GetSpanEvents().ToList();
            var rootSpanEvent    = spanEvents.FirstOrDefault(se => se.IntrinsicAttributes.ContainsKey("nr.entryPoint"));
            var nonRootSpanEvent = spanEvents.FirstOrDefault(se => se.IntrinsicAttributes.ContainsKey("parentId"));

            NrAssert.Multiple(
                () => Assertions.SpanEventHasAttributes(expectedAttributes, SpanEventAttributeType.Intrinsic, rootSpanEvent),
                () => Assertions.SpanEventDoesNotHaveAttributes(unexpectedAttributes, SpanEventAttributeType.Intrinsic, rootSpanEvent),
                () => Assert.Empty(rootSpanEvent.GetByType(SpanEventAttributeType.User)),
                () => Assertions.SpanEventHasAttributes(expectedAgentAttributes, SpanEventAttributeType.Agent, rootSpanEvent),
                () => Assert.Equal(rootSpanEvent.IntrinsicAttributes["guid"], nonRootSpanEvent.IntrinsicAttributes["parentId"])
                );
        }
Exemplo n.º 14
0
        public void QueueSize_PartitionedCorrectly(int configQueueSize, int configPartitionCount)
        {
            Mock.Arrange(() => _currentConfiguration.InfiniteTracingPartitionCountSpans).Returns(configPartitionCount);
            Mock.Arrange(() => _currentConfiguration.InfiniteTracingQueueSizeSpans).Returns(configQueueSize);

            var streamingSvc = GetMockStreamingService(true, true);

            PartitionedBlockingCollection <Span> actualCollection = default;

            Mock.Arrange(() => streamingSvc.StartConsumingCollection(Arg.IsAny <PartitionedBlockingCollection <Span> >()))
            .DoInstead <PartitionedBlockingCollection <Span> >((c) => { actualCollection = c; });

            var aggregator = CreateAggregator(streamingSvc);

            FireAgentConnectedEvent();

            NrAssert.Multiple
            (
                () => Assert.AreEqual(configQueueSize, aggregator.Capacity),
                () => Assert.AreEqual(configQueueSize, actualCollection.Capacity)
            );
        }
Exemplo n.º 15
0
        public void AggregatorIsAvailableRespondsToStreamingService
        (
            [Values(true, false)] bool streamingSvcAvailable,
            [Values(true, false)] bool streamingSvcEnabled,
            [Values(true, false)] bool aggregatorHasValidConfig
        )
        {
            Mock.Arrange(() => _currentConfiguration.InfiniteTracingTraceObserverHost).Returns(streamingSvcEnabled ? "infiniteTracing.net" : null as string);
            Mock.Arrange(() => _currentConfiguration.InfiniteTracingQueueSizeSpans).Returns(aggregatorHasValidConfig ? 10 : -1);

            var streamingSvc = GetMockStreamingService(streamingSvcEnabled, streamingSvcAvailable);

            var aggregator = CreateAggregator(streamingSvc);

            FireAgentConnectedEvent();

            NrAssert.Multiple
            (
                () => Assert.AreEqual(aggregator.IsServiceAvailable, streamingSvcAvailable && streamingSvcEnabled && aggregatorHasValidConfig),
                () => Assert.AreEqual(aggregator.IsServiceEnabled, streamingSvcEnabled)
            );
        }
Exemplo n.º 16
0
        public void Attributes_key_size()
        {
            var filter     = new AttributeFilter(new AttributeFilter.Settings());
            var attribVals = new AttributeValueCollection(AttributeValueCollection.AllTargetModelTypes);

            var testKeys = new string[]
            {
                new string('x', 255),
                new string('a', 256),
                string.Empty,
                " ",
                null as string
            };

            var testResults = new bool[testKeys.Length];


            for (var i = 0; i < testKeys.Length; i++)
            {
                var attribDef = AttributeDefinitionBuilder
                                .CreateCustomAttribute(testKeys[i], AttributeDestinations.All)
                                .Build(filter);

                testResults[i] = attribDef.IsDefinitionValid;

                attribDef.TrySetValue(attribVals, 9);
            }



            NrAssert.Multiple(
                () => Assert.IsTrue(testResults[0]),
                () => Assert.IsFalse(testResults[1]),
                () => Assert.IsFalse(testResults[2]),
                () => Assert.IsFalse(testResults[3]),
                () => Assert.IsFalse(testResults[4]),
                () => Assert.AreEqual(1, attribVals.GetAttributeValues(AttributeClassification.UserAttributes).Count())
                );
        }
        public void slowest_traces_are_retained_if_too_many_traces()
        {
            // Arrange
            var sqlTracesPerPeriod = 5;
            var configuration      = GetDefaultConfiguration(int.MaxValue, sqlTracesPerPeriod);

            EventBus <ConfigurationUpdatedEvent> .Publish(new ConfigurationUpdatedEvent(configuration, ConfigurationUpdateSource.Local));

            var sentSqlTraces = null as IEnumerable <SqlTraceWireModel>;

            Mock.Arrange(() => _dataTransportService.Send(Arg.IsAny <IEnumerable <SqlTraceWireModel> >()))
            .DoInstead <IEnumerable <SqlTraceWireModel> >(sqlTraces => sentSqlTraces = sqlTraces);

            var sqlTracesToSend = new SqlTraceStatsCollection();

            sqlTracesToSend.Insert(GetSqlTrace(1, maxCallTime: TimeSpan.FromSeconds(10)));
            sqlTracesToSend.Insert(GetSqlTrace(2, maxCallTime: TimeSpan.FromSeconds(999)));
            sqlTracesToSend.Insert(GetSqlTrace(3, maxCallTime: TimeSpan.FromSeconds(30)));
            sqlTracesToSend.Insert(GetSqlTrace(4, maxCallTime: TimeSpan.FromSeconds(40)));
            sqlTracesToSend.Insert(GetSqlTrace(5, maxCallTime: TimeSpan.FromSeconds(50)));
            sqlTracesToSend.Insert(GetSqlTrace(6, maxCallTime: TimeSpan.FromSeconds(60)));
            sqlTracesToSend.Insert(GetSqlTrace(7, maxCallTime: TimeSpan.FromSeconds(70)));

            _sqlTraceAggregator.Collect(sqlTracesToSend);

            // Act
            _harvestAction();

            // Assert
            NrAssert.Multiple(
                () => Assert.AreEqual(sqlTracesPerPeriod, sentSqlTraces.Count()),
                () => Assert.IsTrue(sentSqlTraces.Any(trace => trace.SqlId == 2)),
                () => Assert.IsTrue(sentSqlTraces.Any(trace => trace.SqlId == 4)),
                () => Assert.IsTrue(sentSqlTraces.Any(trace => trace.SqlId == 5)),
                () => Assert.IsTrue(sentSqlTraces.Any(trace => trace.SqlId == 6)),
                () => Assert.IsTrue(sentSqlTraces.Any(trace => trace.SqlId == 7))
                );
        }
Exemplo n.º 18
0
        public void Test()
        {
            var expectedMetrics = new List <Assertions.ExpectedMetric>
            {
                new Assertions.ExpectedMetric {
                    metricName = @"WebTransaction", callCount = 2
                },
                new Assertions.ExpectedMetric {
                    metricName = @"WebTransactionTotalTime", callCount = 2
                },
                new Assertions.ExpectedMetric {
                    metricName = @"WebTransaction/MVC/Values/Get", callCount = 2
                },
                new Assertions.ExpectedMetric {
                    metricName = @"DotNet/Middleware Pipeline", callCount = 2
                },
                new Assertions.ExpectedMetric {
                    metricName = @"DotNet/Middleware Pipeline", metricScope = @"WebTransaction/MVC/Values/Get", callCount = 2
                },
                new Assertions.ExpectedMetric {
                    metricName = @"DotNet/ValuesController/Get", callCount = 2
                },
                new Assertions.ExpectedMetric {
                    metricName = @"DotNet/ValuesController/Get", metricScope = @"WebTransaction/MVC/Values/Get", callCount = 2
                },
            };

            var metrics = _fixture.AgentLog.GetMetrics().ToList();
            var exceptionHandlerFeatureErrorLogLines = _fixture.AgentLog.TryGetLogLines("Inspecting errors from the IExceptionHandlerFeature is disabled");

            Assert.NotNull(metrics);

            NrAssert.Multiple
            (
                () => Assertions.MetricsExist(expectedMetrics, metrics),
                () => Assert.Single(exceptionHandlerFeatureErrorLogLines)
            );
        }
        public void Test()
        {
            var expectedMetrics = new List <Assertions.ExpectedMetric>
            {
                new Assertions.ExpectedMetric {
                    metricName = @"DotNet/default.aspx", metricScope = "WebTransaction/ASP/default.aspx", callCount = 1
                },
            };

            var expectedTransactionTraceSegments = new List <string>
            {
                @"AuthenticateRequest",
                @"AuthorizeRequest",
                @"ResolveRequestCache",
                @"MapRequestHandler",
                @"AcquireRequestState",
                @"ExecuteRequestHandler",
                @"default.aspx",
                @"ReleaseRequestState",
                @"UpdateRequestCache",
                @"EndRequest",
            };

            var metrics = _fixture.AgentLog.GetMetrics().ToList();

            var transactionSample = _fixture.AgentLog.GetTransactionSamples()
                                    .Where(sample => sample.Path == @"WebTransaction/ASP/default.aspx")
                                    .FirstOrDefault();

            Assert.NotNull(transactionSample);

            NrAssert.Multiple(
                () => Assertions.MetricsExist(expectedMetrics, metrics),
                () => Assertions.TransactionTraceSegmentsExist(expectedTransactionTraceSegments, transactionSample),
                () => Assert.Empty(_fixture.AgentLog.GetErrorTraces()),
                () => Assert.Empty(_fixture.AgentLog.GetErrorEvents())
                );
        }
        public static void MetricNamesTest_CAT()
        {
            var testDic = new Dictionary <CATSupportabilityCondition, string>
            {
                { CATSupportabilityCondition.Request_Create_Success, "Supportability/CrossApplicationTracing/Request/Create/Success" },
                { CATSupportabilityCondition.Request_Create_Failure, "Supportability/CrossApplicationTracing/Request/Create/Exception" },
                { CATSupportabilityCondition.Request_Create_Failure_XProcID, "Supportability/CrossApplicationTracing/Request/Create/Exception/CrossProcessID" },

                { CATSupportabilityCondition.Request_Accept_Success, "Supportability/CrossApplicationTracing/Request/Accept/Success" },
                { CATSupportabilityCondition.Request_Accept_Failure, "Supportability/CrossApplicationTracing/Request/Accept/Exception" },
                { CATSupportabilityCondition.Request_Accept_Failure_NotTrusted, "Supportability/CrossApplicationTracing/Request/Accept/Ignored/NotTrusted" },
                { CATSupportabilityCondition.Request_Accept_Failure_Decode, "Supportability/CrossApplicationTracing/Request/Accept/Ignored/UnableToDecode" },
                { CATSupportabilityCondition.Request_Accept_Multiple, "Supportability/CrossApplicationTracing/Request/Accept/Warning/MultipleAttempts" },

                { CATSupportabilityCondition.Response_Create_Success, "Supportability/CrossApplicationTracing/Response/Create/Success" },
                { CATSupportabilityCondition.Response_Create_Failure, "Supportability/CrossApplicationTracing/Response/Create/Exception" },
                { CATSupportabilityCondition.Response_Create_Failure_XProcID, "Supportability/CrossApplicationTracing/Response/Create/Exception/CrossProcessID" },

                { CATSupportabilityCondition.Response_Accept_Success, "Supportability/CrossApplicationTracing/Response/Accept/Success" },
                { CATSupportabilityCondition.Response_Accept_Failure, "Supportability/CrossApplicationTracing/Response/Accept/Exception" },
                { CATSupportabilityCondition.Response_Accept_MultipleResponses, "Supportability/CrossApplicationTracing/Response/Accept/Ignored/MultipleAttempts" }
            };

            var assertions = new List <Action>();

            foreach (var d in testDic)
            {
                var catCond = d;
                assertions.Add(() => Assert.AreEqual(catCond.Value, MetricNames.GetSupportabilityCATConditionMetricName(catCond.Key), $"Expected '{catCond.Value}', actual '{MetricNames.GetSupportabilityCATConditionMetricName(catCond.Key)}'"));
            }

            var countTests      = testDic.Count;
            var countEnumValues = Enum.GetValues(typeof(CATSupportabilityCondition)).Length;

            assertions.Add(() => Assert.True(countTests == countEnumValues, $"Test Coverage - there are {countEnumValues - countTests} enums missing from this test"));

            NrAssert.Multiple(assertions.ToArray());
        }
        public void ShouldResetThreadpoolThroughputStatsWhenSampled()
        {
            using (var eventSource = new TestEventSource())
                using (var threadEventListener = CreateThreadEventsListener())
                {
                    eventSource.EnqueueThread();
                    eventSource.EnqueueThread();
                    eventSource.EnqueueThread();

                    eventSource.DequeueThread();
                    eventSource.DequeueThread();

                    threadEventListener.Sample(); //This call should reset the accumulated stats

                    var sample = threadEventListener.Sample();

                    NrAssert.Multiple(
                        () => Assert.AreEqual(0, sample.CountThreadRequestsQueued),
                        () => Assert.AreEqual(0, sample.CountThreadRequestsDequeued),
                        () => Assert.AreEqual(1, sample.ThreadRequestQueueLength) //Queue length does not reset
                        );
                }
        }
        public void all_attributes_included()
        {
            _attribDefs.TransactionName.TrySetValue(_attribValues, "name");
            _attribDefs.HostDisplayName.TrySetValue(_attribValues, "host");
            _attribDefs.GetCustomAttributeForTransaction("custom1Name").TrySetValue(_attribValues, "custom1Value");

            var expectedIntrisicDictionary = new Dictionary <string, object> {
                { "name", "name" }
            };
            var expectedAgentDictionary = new Dictionary <string, object> {
                { "host.displayName", "host" }
            };
            var expectedUserDictionary = new Dictionary <string, object> {
                { "custom1Name", "custom1Value" }
            };

            NrAssert.Multiple
            (
                () => CollectionAssert.AreEquivalent(expectedIntrisicDictionary, _attribValues.ToDictionary(AttributeClassification.Intrinsics)),
                () => CollectionAssert.AreEquivalent(expectedAgentDictionary, _attribValues.ToDictionary(AttributeClassification.AgentAttributes)),
                () => CollectionAssert.AreEquivalent(expectedUserDictionary, _attribValues.ToDictionary(AttributeClassification.UserAttributes))
            );
        }
        public void Test()
        {
            var transactionSample = _fixture.AgentLog.TryGetTransactionSample("WebTransaction/MVC/DefaultController/Index");
            var transactionEvent  = _fixture.AgentLog.TryGetTransactionEvent("WebTransaction/MVC/DefaultController/Index");
            var metrics           = _fixture.AgentLog.GetMetrics();

            NrAssert.Multiple(
                () => Assert.NotNull(transactionSample),
                () => Assert.NotNull(transactionEvent)
                );

            NrAssert.Multiple(
                () => Assert.False(_responseHeaders.Contains(@"X-NewRelic-App-Data")),

                // Trace attributes
                () => Assertions.TransactionTraceDoesNotHaveAttributes(Expectations.UnexpectedTransactionTraceIntrinsicAttributesCatDisabled, TransactionTraceAttributeType.Intrinsic, transactionSample),

                // Event attributes
                () => Assertions.TransactionEventDoesNotHaveAttributes(Expectations.UnexpectedTransactionEventIntrinsicAttributesCatDisabled, TransactionEventAttributeType.Intrinsic, transactionEvent),

                () => Assertions.MetricsDoNotExist(Expectations.UnexpectedMetricsCatDisabled, metrics)
                );
        }
Exemplo n.º 24
0
        public void TransformSample_ThreadpoolThroughputStats_CreatesCorrectMetricValues()
        {
            const int countThreadRequestsQueued     = 5;
            const int countThreadRequestsDequeued   = 7;
            const int countThreadRequestQueueLength = 19;

            var generatedMetrics = new Dictionary <string, MetricDataWireModel>();

            Mock.Arrange(() => _metricAggregator
                         .Collect(Arg.IsAny <MetricWireModel>()))
            .DoInstead <MetricWireModel>(m => generatedMetrics.Add(m.MetricName.Name, m.Data));

            var sample = new ThreadpoolThroughputEventsSample(countThreadRequestsQueued, countThreadRequestsDequeued, countThreadRequestQueueLength);

            _threadStatsTransformer.Transform(sample);

            NrAssert.Multiple(
                () => Assert.AreEqual(3, generatedMetrics.Count),
                () => MetricTestHelpers.CompareMetric(generatedMetrics, MetricNames.GetThreadpoolThroughputStatsName(ThreadpoolThroughputStatsType.Requested), countThreadRequestsQueued),
                () => MetricTestHelpers.CompareMetric(generatedMetrics, MetricNames.GetThreadpoolThroughputStatsName(ThreadpoolThroughputStatsType.Started), countThreadRequestsDequeued),
                () => MetricTestHelpers.CompareMetric(generatedMetrics, MetricNames.GetThreadpoolThroughputStatsName(ThreadpoolThroughputStatsType.QueueLength), countThreadRequestQueueLength)
                );
        }
Exemplo n.º 25
0
        public void SingleAddedSegment_IsNestedBelowRootSegment()
        {
            var tx = _agent.CreateTransaction(
                isWeb: true,
                category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action),
                transactionDisplayName: "name",
                doNotTrackAsUnitOfWork: true);
            var segment = _agent.StartTransactionSegmentOrThrow("childSegment");

            segment.End();
            tx.End();

            _compositeTestAgent.Harvest();

            var rootSegment = GetFirstSegmentOrThrow();

            NrAssert.Multiple(
                () => Assert.AreEqual(1, rootSegment.Children.Count),

                () => Assert.AreEqual("childSegment", rootSegment.Children[0].Name),
                () => Assert.AreEqual(0, rootSegment.Children[0].Children.Count)
                );
        }
        public void DuplicateAttibuteKeepsLastValue()
        {
            _attribDefs.OriginalUrl.TrySetValue(_attribValues, "banana1");
            _attribDefs.OriginalUrl.TrySetValue(_attribValues, "banana2");
            _attribDefs.GetCustomAttributeForTransaction("pie").TrySetValue(_attribValues, "cake1");
            _attribDefs.GetCustomAttributeForTransaction("pie").TrySetValue(_attribValues, "cake2");

            var agentAttribsDic = _attribValues.GetAttributeValuesDic(AttributeClassification.AgentAttributes);
            var userAttribsDic  = _attribValues.GetAttributeValuesDic(AttributeClassification.UserAttributes);
            var allAttribs      = _attribValues.GetAttributeValues(AttributeClassification.Intrinsics)
                                  .Union(_attribValues.GetAttributeValues(AttributeClassification.AgentAttributes))
                                  .Union(_attribValues.GetAttributeValues(AttributeClassification.UserAttributes))
                                  .ToList();

            NrAssert.Multiple
            (
                () => Assert.AreEqual(2, allAttribs.Count),
                () => Assert.AreEqual(1, agentAttribsDic.Count()),
                () => Assert.AreEqual("banana2", agentAttribsDic["original_url"]),
                () => Assert.AreEqual(1, userAttribsDic.Count()),
                () => Assert.AreEqual("cake2", userAttribsDic["pie"])
            );
        }
Exemplo n.º 27
0
        public void Merge_MergesThreeMetricsCorrectly_WhenMergedProgressively()
        {
            var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope",
                                                      MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(1)));
            var metric2 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope",
                                                      MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(7), TimeSpan.FromSeconds(5)));
            var metric3 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope",
                                                      MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(13), TimeSpan.FromSeconds(11)));

            var mergedMetric = MetricWireModel.Merge(new[] { metric1, metric2 });

            mergedMetric = MetricWireModel.Merge(new[] { mergedMetric, metric3 });

            NrAssert.Multiple(
                () => Assert.AreEqual("DotNet/name", mergedMetric.MetricName.Name),
                () => Assert.AreEqual(3, mergedMetric.Data.Value0),
                () => Assert.AreEqual(23, mergedMetric.Data.Value1),
                () => Assert.AreEqual(17, mergedMetric.Data.Value2),
                () => Assert.AreEqual(3, mergedMetric.Data.Value3),
                () => Assert.AreEqual(13, mergedMetric.Data.Value4),
                () => Assert.AreEqual(227, mergedMetric.Data.Value5)
                );
        }
        public void only_agent_and_custom_attributes_should_be_filtered_when_all_attributes_excluded()
        {
            _compositeTestAgent.LocalConfiguration.attributes.exclude = new List <string> {
                "*"
            };
            _compositeTestAgent.PushConfiguration();

            _attribDefs.TransactionName.TrySetValue(_attribValues, "name");
            _attribDefs.HostDisplayName.TrySetValue(_attribValues, "host");
            _attribDefs.GetCustomAttributeForTransaction("custom1Name").TrySetValue(_attribValues, "custom1Value");


            var expectedIntrisicDictionary = new Dictionary <string, object> {
                { "name", "name" }
            };

            NrAssert.Multiple
            (
                () => CollectionAssert.AreEquivalent(expectedIntrisicDictionary, _attribValues.ToDictionary(AttributeClassification.Intrinsics)),
                () => CollectionAssert.IsEmpty(_attribValues.ToDictionary(AttributeClassification.AgentAttributes), "Agent attributes were not empty."),
                () => CollectionAssert.IsEmpty(_attribValues.ToDictionary(AttributeClassification.UserAttributes), "Custom attributes were not empty.")
            );
        }
        public void Test()
        {
            var expectedTransactionTraceAttributes = new Dictionary <string, string>
            {
                { "foo", "bar" }
            };
            var unexpectedTransactionTraceAttributes = new List <string>
            {
                "key"
            };

            var transactionSample = _fixture.AgentLog.GetTransactionSamples().FirstOrDefault();

            Assert.NotNull(transactionSample);
            var maybeDeprecationMessage = _fixture.AgentLog.TryGetLogLine(AgentLogBase.WarnLogLinePrefixRegex + @"Deprecated configuration property 'parameterGroups.customParameters.ignore'.  Use 'attributes.exclude'.  See http://docs.newrelic.com for details.");

            NrAssert.Multiple
            (
                () => Assertions.TransactionTraceHasAttributes(expectedTransactionTraceAttributes, TransactionTraceAttributeType.User, transactionSample),
                () => Assertions.TransactionTraceDoesNotHaveAttributes(unexpectedTransactionTraceAttributes, TransactionTraceAttributeType.User, transactionSample),
                () => Assert.NotNull(maybeDeprecationMessage)
            );
        }
        public void RequestUriInTransactionTrace()
        {
            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.AreEqual("myuri", transactionTrace.GetAttributes(AttributeClassification.AgentAttributes)["request.uri"]),
                () => Assert.AreEqual("myuri", transactionTrace.Uri)
                );
        }