public void Test() { Assert.Contains("NREUM", _browserTimingHeader); 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"]) ); }
public void Test() { var catResponseHeader = _responseHeaders.GetValues(@"X-NewRelic-App-Data")?.FirstOrDefault(); Assert.NotNull(catResponseHeader); var catResponseData = HeaderEncoder.DecodeAndDeserialize <CrossApplicationResponseData>(catResponseHeader, HeaderEncoder.IntegrationTestEncodingKey); var transactionEventRedirect = _fixture.AgentLog.TryGetTransactionEvent("WebTransaction/StatusCode/301"); Assert.NotNull(transactionEventRedirect); Assert.Equal("WebTransaction/StatusCode/301", catResponseData.TransactionName); }
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 transactionEventIndex = _fixture.AgentLog.TryGetTransactionEvent("WebTransaction/MVC/DefaultController/Index"); var transactionEventRedirect = _fixture.AgentLog.TryGetTransactionEvent("WebTransaction/MVC/DefaultController/DoRedirect"); var metrics = _fixture.AgentLog.GetMetrics(); NrAssert.Multiple ( () => Assert.NotNull(transactionSample), () => Assert.NotNull(transactionEventRedirect), () => Assert.NotNull(transactionEventIndex) ); 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), // transactionEventIndex attributes () => Assertions.TransactionEventHasAttributes(Expectations.ExpectedTransactionEventIntrinsicAttributesCatEnabled, TransactionEventAttributeType.Intrinsic, transactionEventIndex), () => Assertions.TransactionEventDoesNotHaveAttributes(Expectations.UnexpectedTransactionEventIntrinsicAttributesCatEnabled, TransactionEventAttributeType.Intrinsic, transactionEventIndex), // transactionEventRedirect attributes () => Assertions.TransactionEventHasAttributes(Expectations.ExpectedTransactionEventIntrinsicAttributesCatEnabled, TransactionEventAttributeType.Intrinsic, transactionEventRedirect), () => Assertions.TransactionEventDoesNotHaveAttributes(Expectations.UnexpectedTransactionEventIntrinsicAttributesCatEnabled, TransactionEventAttributeType.Intrinsic, transactionEventRedirect), () => Assertions.MetricsExist(Expectations.ExpectedMetricsCatEnabled, metrics) ); }
public void Test() { var catResponseHeader = _responseHeaders.GetValues(@"X-NewRelic-App-Data")?.FirstOrDefault(); Assert.NotNull(catResponseHeader); var catResponseData = HeaderEncoder.DecodeAndDeserialize <CrossApplicationResponseData>(catResponseHeader, HeaderEncoder.IntegrationTestEncodingKey); var metrics = _fixture.AgentLog.GetMetrics().ToList(); var calleeTransactionEvent = _fixture.AgentLog.TryGetTransactionEvent("WebTransaction/MVC/DefaultController/Index"); Assert.NotNull(calleeTransactionEvent); var callerTransactionTrace = _fixture.AgentLog.TryGetTransactionSample("WebTransaction/MVC/DefaultController/ChainedHttpClient"); Assert.NotNull(callerTransactionTrace); var crossProcessId = _fixture.AgentLog.GetCrossProcessId(); // Note: we are checking the metrics that are generated by the *Caller* as a result of receiving a CAT response. var expectedMetrics = new List <Assertions.ExpectedMetric> { new Assertions.ExpectedMetric { metricName = @"External/all", callCount = 1 }, new Assertions.ExpectedMetric { metricName = @"External/allWeb", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"External/{_fixture.RemoteApplication.DestinationServerName}/all", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"ExternalApp/{_fixture.RemoteApplication.DestinationServerName}/{crossProcessId}/all", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"ExternalTransaction/{_fixture.RemoteApplication.DestinationServerName}/{crossProcessId}/WebTransaction/MVC/DefaultController/Index", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"ExternalTransaction/{_fixture.RemoteApplication.DestinationServerName}/{crossProcessId}/WebTransaction/MVC/DefaultController/Index", metricScope = @"WebTransaction/MVC/DefaultController/ChainedHttpClient", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"External/{_fixture.RemoteApplication.DestinationServerName}/Stream/GET", callCount = 1 }, new Assertions.ExpectedMetric { metricName = @"ClientApplication/[^/]+/all", IsRegexName = true } }; var unexpectedMetrics = new List <Assertions.ExpectedMetric> { // This scoped metric should be superceded by the ExternalTransaction metric above new Assertions.ExpectedMetric { metricName = $@"External/{_fixture.RemoteApplication.DestinationServerName}/Stream/GET", metricScope = @"WebTransaction/MVC/DefaultController/ChainedHttpClient" } }; // Note: we are checking the attributes attached to the *Callee's* transaction, not the caller's transaction. The attributes attached to the caller's transaction are already fully vetted in the CatInbound tests. var expectedTransactionEventIntrinsicAttributes1 = new List <string> { "nr.guid", "nr.pathHash", "nr.referringPathHash", "nr.referringTransactionGuid" }; var expectedTransactionEventIntrinsicAttributes2 = new Dictionary <string, string> { // This value comes from what we send to the application (see parameter passed to GetWithCatHeader above) { "nr.tripId", "tripId" } }; var expectedCallerTraceSegmentParameters = new List <Assertions.ExpectedSegmentParameter> { new Assertions.ExpectedSegmentParameter { segmentName = "ExternalTransaction/[^/]+/[^/]+/WebTransaction/MVC/DefaultController/Index", IsRegexSegmentName = true, parameterName = "transaction_guid" } }; NrAssert.Multiple( () => Assert.Equal(crossProcessId, catResponseData.CrossProcessId), () => Assert.Equal("WebTransaction/MVC/DefaultController/ChainedHttpClient", 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), () => Assertions.MetricsExist(expectedMetrics, metrics), () => Assertions.MetricsDoNotExist(unexpectedMetrics, metrics), // Note: It is difficult (perhaps impossible) to ensure that a transaction trace is generate for the chained request. This is because only one transaction trace is collected per harvest, and the chained requests will both be eligible. // calleeTransactionEvent attributes () => Assertions.TransactionEventHasAttributes(expectedTransactionEventIntrinsicAttributes1, TransactionEventAttributeType.Intrinsic, calleeTransactionEvent), () => Assertions.TransactionEventHasAttributes(expectedTransactionEventIntrinsicAttributes2, TransactionEventAttributeType.Intrinsic, calleeTransactionEvent), // callerTransactionTrace segments () => Assertions.TransactionTraceSegmentParametersExist(expectedCallerTraceSegmentParameters, callerTransactionTrace) ); }
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) ); var expectedTransactionTraceIntrinsicAttributes1 = new List <string> { "client_cross_process_id", "path_hash" }; var expectedTransactionTraceIntrinsicAttributes2 = new Dictionary <string, string> { // These values come from what we send to the application (see parameter passed to GetWithCatHeader above) { "referring_transaction_guid", "guid" }, { "trip_id", "tripId" } }; var expectedTransactionEventIntrinsicAttributes1 = new List <string> { "nr.guid", "nr.pathHash" }; var expectedTransactionEventIntrinsicAttributes2 = new Dictionary <string, string> { // These values come from what we send to the application (see parameter passed to GetWithCatHeader above) { "nr.referringPathHash", "pathHash" }, { "nr.referringTransactionGuid", "guid" }, { "nr.tripId", "tripId" } }; 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(expectedTransactionTraceIntrinsicAttributes1, TransactionTraceAttributeType.Intrinsic, transactionSample), () => Assertions.TransactionTraceHasAttributes(expectedTransactionTraceIntrinsicAttributes2, TransactionTraceAttributeType.Intrinsic, transactionSample), // Event attributes () => Assertions.TransactionEventHasAttributes(expectedTransactionEventIntrinsicAttributes1, TransactionEventAttributeType.Intrinsic, transactionEvent), () => Assertions.TransactionEventHasAttributes(expectedTransactionEventIntrinsicAttributes2, TransactionEventAttributeType.Intrinsic, transactionEvent), () => Assertions.MetricsExist(Expectations.ExpectedMetricsCatEnabled, metrics) ); }
public void Test() { var catResponseHeader = _responseHeaders.GetValues(@"X-NewRelic-App-Data")?.FirstOrDefault(); Assert.NotNull(catResponseHeader); var catResponseData = HeaderEncoder.DecodeAndDeserialize <CrossApplicationResponseData>(catResponseHeader, HeaderEncoder.IntegrationTestEncodingKey); var metrics = _fixture.AgentLog.GetMetrics().ToList(); var calleeTransactionEvent = _fixture.AgentLog.TryGetTransactionEvent("WebTransaction/MVC/RestSharpController/TaskResultClient"); Assert.NotNull(calleeTransactionEvent); var myHostname = _fixture.DestinationServerName; var crossProcessId = _fixture.AgentLog.GetCrossProcessId(); // Note: we are checking the metrics that are generated by the *Caller* as a result of receiving a CAT response. var expectedMetrics = new List <Assertions.ExpectedMetric> { new Assertions.ExpectedMetric { metricName = @"External/all", callCount = 1 }, new Assertions.ExpectedMetric { metricName = @"External/allWeb", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"External/{myHostname}/all", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"ExternalApp/{myHostname}/{crossProcessId}/all", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"ExternalTransaction/{myHostname}/{crossProcessId}/WebTransaction/WebAPI/RestAPI/Get", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"ExternalTransaction/{myHostname}/{crossProcessId}/WebTransaction/WebAPI/RestAPI/Get", metricScope = @"WebTransaction/MVC/RestSharpController/TaskResultClient", callCount = 1 }, new Assertions.ExpectedMetric { metricName = $@"External/{myHostname}/Stream/GET", callCount = 1 }, new Assertions.ExpectedMetric { metricName = @"ClientApplication/[^/]+/all", IsRegexName = true } }; var unexpectedMetrics = new List <Assertions.ExpectedMetric> { // This scoped metric should be superceded by the ExternalTransaction metric above new Assertions.ExpectedMetric { metricName = $@"External/{_fixture.RemoteApplication.DestinationServerName}/Stream/GET", metricScope = @"WebTransaction/MVC/RestSharpController/TaskResultClient" } }; // Note: we are checking the attributes attached to the *Callee's* transaction, not the caller's transaction. The attributes attached to the caller's transaction are already fully vetted in the CatInbound tests. var expectedTransactionEventIntrinsicAttributes1 = new List <string> { "nr.guid", "nr.pathHash", "nr.referringPathHash", "nr.referringTransactionGuid" }; var expectedTransactionEventIntrinsicAttributes2 = new Dictionary <string, string> { // This value comes from what we send to the application (see parameter passed to GetWithCatHeader above) { "nr.tripId", "tripId" } }; var transactionSample = _fixture.AgentLog.GetTransactionSamples() .Where(sample => sample.Path == @"WebTransaction/MVC/RestSharpController/TaskResultClient" || sample.Path == @"WebTransaction/WebAPI/RestAPI/Get") .FirstOrDefault(); Assert.NotNull(transactionSample); NrAssert.Multiple( () => Assert.Equal(crossProcessId, catResponseData.CrossProcessId), () => Assert.Equal("WebTransaction/MVC/RestSharpController/TaskResultClient", 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), () => Assertions.MetricsExist(expectedMetrics, metrics), () => Assertions.MetricsDoNotExist(unexpectedMetrics, metrics), // calleeTransactionEvent attributes () => Assertions.TransactionEventHasAttributes(expectedTransactionEventIntrinsicAttributes1, TransactionEventAttributeType.Intrinsic, calleeTransactionEvent), () => Assertions.TransactionEventHasAttributes(expectedTransactionEventIntrinsicAttributes2, TransactionEventAttributeType.Intrinsic, calleeTransactionEvent) ); }