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 DatastoreSegment_HasCorrectTraceNameAndMetrics_WhenNullModelAndOperation() { var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartDatastoreRequestSegmentOrThrow(null, DatastoreVendor.MSSQL, null); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new[] { new ExpectedMetric { Name = "Datastore/all" }, new ExpectedMetric { Name = "Datastore/allWeb" }, new ExpectedMetric { Name = "Datastore/MSSQL/all" }, new ExpectedMetric { Name = "Datastore/MSSQL/allWeb" }, new ExpectedMetric { Name = "Datastore/operation/MSSQL/other", Scope = "WebTransaction/Action/name" }, new ExpectedMetric { Name = "Datastore/operation/MSSQL/other" } }; var unexpectedMetrics = new[] { new ExpectedMetric { Name = "Datastore/allOther" } }; var expectedSegments = new[] { "Datastore/operation/MSSQL/other" }; var actualMetrics = _compositeTestAgent.Metrics.ToList(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => TransactionTraceAssertions.SegmentsExist(expectedSegments, transactionTrace), () => MetricAssertions.MetricsExist(expectedMetrics, actualMetrics), () => MetricAssertions.MetricsDoNotExist(unexpectedMetrics, actualMetrics) ); }
public void ExternalSegment_HasCorrectTraceNameAndMetrics() { var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartExternalRequestSegmentOrThrow(new Uri("http://www.newrelic.com/test"), "POST"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new[] { new ExpectedMetric { Name = "External/all" }, new ExpectedMetric { Name = "External/allWeb" }, new ExpectedMetric { Name = "External/www.newrelic.com/all" }, new ExpectedMetric { Name = "External/www.newrelic.com/Stream/POST" }, new ExpectedMetric { Name = "External/www.newrelic.com/Stream/POST", Scope = "WebTransaction/Action/name" } }; var unexpectedMetrics = new[] { new ExpectedMetric { Name = "External/allOther" } }; var expectedSegments = new[] { "External/www.newrelic.com/Stream/POST" }; var actualMetrics = _compositeTestAgent.Metrics.ToList(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => TransactionTraceAssertions.SegmentsExist(expectedSegments, transactionTrace), () => MetricAssertions.MetricsExist(expectedMetrics, actualMetrics), () => MetricAssertions.MetricsDoNotExist(unexpectedMetrics, actualMetrics) ); }
public void synthetics_attributes_when_no_header_is_present() { // ARRANGE var encodingKey = "foo"; _compositeTestAgent.ServerConfiguration.TrustedIds = new long[] { 123 }; _compositeTestAgent.ServerConfiguration.EncodingKey = encodingKey; _compositeTestAgent.PushConfiguration(); // ==== ACT ==== var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); _agent.CurrentTransaction.AcceptDistributedTraceHeaders(new KeyValuePair <string, string> [0], HeaderFunctions.GetHeaders, TransportType.HTTP); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); // ASSERT var unexpectedEventAttributes = new List <string> { "nr.guid", "nr.syntheticsResourceId", "nr.syntheticsJobId", "nr.syntheticsMonitorId" }; var unexpectedTraceAttributes = new List <string> { "synthetics_resource_id", "synthetics_job_id", "synthetics_monitor_id" }; var transactionEvent = _compositeTestAgent.TransactionEvents.First(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => TransactionEventAssertions.DoesNotHaveAttributes(unexpectedEventAttributes, AttributeClassification.Intrinsics, transactionEvent), () => TransactionTraceAssertions.DoesNotHaveAttributes(unexpectedTraceAttributes, AttributeClassification.Intrinsics, transactionTrace) ); }
public void cat_attributes_when_no_headers_are_provided() { // ARRANGE var encodingKey = "foo"; _compositeTestAgent.ServerConfiguration.TrustedIds = new long[] { 123 }; _compositeTestAgent.ServerConfiguration.EncodingKey = encodingKey; _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(); // ASSERT var unexpectedEventAttributes = new List <string> { "nr.referringPathHash", "nr.referringTransactionGuid", "nr.alternatePathHashes", "nr.guid", "nr.pathHash" }; var unexpectedTraceAttributes = new List <string> { "client_cross_process_id", "referring_transaction_guid", "path_hash" }; var transactionEvent = _compositeTestAgent.TransactionEvents.First(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => TransactionEventAssertions.DoesNotHaveAttributes(unexpectedEventAttributes, AttributeClassification.Intrinsics, transactionEvent), () => TransactionTraceAssertions.DoesNotHaveAttributes(unexpectedTraceAttributes, AttributeClassification.Intrinsics, transactionTrace) ); }
public void MessageBrokerSegment_HasCorrectTraceNameAndMetrics() { var tx = _agent.CreateTransaction( destinationType: MessageBrokerDestinationType.Queue, brokerVendorName: "vendor1", destination: "queueA"); var segment = _agent.StartMessageBrokerSegmentOrThrow("vendor1", MessageBrokerDestinationType.Queue, "queueA", MessageBrokerAction.Consume); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new[] { new ExpectedMetric { Name = "MessageBroker/vendor1/Queue/Consume/Named/queueA" }, new ExpectedMetric { Name = "OtherTransaction/Message/vendor1/Queue/Named/queueA" }, new ExpectedMetric { Name = "OtherTransactionTotalTime/Message/vendor1/Queue/Named/queueA" }, new ExpectedMetric { Name = "MessageBroker/vendor1/Queue/Consume/Named/queueA", Scope = "OtherTransaction/Message/vendor1/Queue/Named/queueA" } }; var expectedSegments = new[] { "MessageBroker/vendor1/Queue/Consume/Named/queueA" }; var actualMetrics = _compositeTestAgent.Metrics.ToList(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => TransactionTraceAssertions.SegmentsExist(expectedSegments, transactionTrace), () => MetricAssertions.MetricsExist(expectedMetrics, actualMetrics) ); }
public void synthetics_attributes_when_header_is_present() { // ARRANGE var encodingKey = "foo"; var version = 1; var clientAccountId = 123; var resourceId = "resourceId"; var jobId = "jobId"; var monitorId = "monitorId"; _compositeTestAgent.ServerConfiguration.TrustedIds = new long[] { clientAccountId }; _compositeTestAgent.ServerConfiguration.EncodingKey = encodingKey; _compositeTestAgent.PushConfiguration(); var syntheticsHeaderValue = Strings.Base64Encode( string.Format(@"[{0}, {1}, ""{2}"", ""{3}"", ""{4}""]", version, clientAccountId, resourceId, jobId, monitorId), encodingKey); var requestHeaders = new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>(SyntheticsHeaderKey, syntheticsHeaderValue) }; // ==== ACT ==== var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); tx.AcceptDistributedTraceHeaders(requestHeaders, HeaderFunctions.GetHeaders, TransportType.HTTP); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); // ASSERT var unexpectedEventAttributes = new List <string> { "nr.alternatePathHashes" }; var expectedEventAttributes = new List <ExpectedAttribute> { new ExpectedAttribute { Key = "nr.guid" }, new ExpectedAttribute { Key = "nr.syntheticsResourceId", Value = resourceId }, new ExpectedAttribute { Key = "nr.syntheticsJobId", Value = jobId }, new ExpectedAttribute { Key = "nr.syntheticsMonitorId", Value = monitorId } }; var expectedTraceAttributes = new List <ExpectedAttribute> { new ExpectedAttribute { Key = "synthetics_resource_id", Value = resourceId }, new ExpectedAttribute { Key = "synthetics_job_id", Value = jobId }, new ExpectedAttribute { Key = "synthetics_monitor_id", Value = monitorId } }; var transactionEvent = _compositeTestAgent.TransactionEvents.First(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => TransactionEventAssertions.HasAttributes(expectedEventAttributes, AttributeClassification.Intrinsics, transactionEvent), () => TransactionEventAssertions.DoesNotHaveAttributes(unexpectedEventAttributes, AttributeClassification.Intrinsics, transactionEvent), () => TransactionTraceAssertions.HasAttributes(expectedTraceAttributes, AttributeClassification.Intrinsics, transactionTrace) ); }
public void cat_attributes_when_header_is_present() { // ARRANGE var encodingKey = "foo"; var clientAccountId = 123; var crossProcessId = $"{clientAccountId}#456"; var clientTransactionGuid = "transaction guid"; var clientTripId = "trip id"; var clientPathHash = "path hash"; _compositeTestAgent.ServerConfiguration.TrustedIds = new long[] { clientAccountId }; _compositeTestAgent.ServerConfiguration.EncodingKey = encodingKey; _compositeTestAgent.PushConfiguration(); var newRelicIdHeader = new KeyValuePair <string, string>("X-NewRelic-ID", Strings.Base64Encode(crossProcessId, encodingKey)); var newRelicTransactionHeader = new KeyValuePair <string, string>("X-NewRelic-Transaction", Strings.Base64Encode($@"[""{clientTransactionGuid}"", ""{false}"", ""{clientTripId}"", ""{clientPathHash}""]", encodingKey)); var requestHeaders = new[] { newRelicIdHeader, newRelicTransactionHeader }; // ==== ACT ==== var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); _agent.CurrentTransaction.AcceptDistributedTraceHeaders(requestHeaders, HeaderFunctions.GetHeaders, TransportType.HTTP); var segment = _agent.StartTransactionSegmentOrThrow("segmentName"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); // ASSERT var unexpectedEventAttributes = new List <string> { "nr.alternatePathHashes" }; var expectedEventAttributes = new List <ExpectedAttribute> { new ExpectedAttribute { Key = "nr.guid" }, new ExpectedAttribute { Key = "nr.tripId", Value = clientTripId }, new ExpectedAttribute { Key = "nr.pathHash", Value = "b5880367" }, new ExpectedAttribute { Key = "nr.referringTransactionGuid", Value = clientTransactionGuid }, new ExpectedAttribute { Key = "nr.referringPathHash", Value = "path hash" } }; var expectedTraceAttributes = new List <ExpectedAttribute> { new ExpectedAttribute { Key = "client_cross_process_id", Value = crossProcessId }, new ExpectedAttribute { Key = "trip_id", Value = clientTripId }, new ExpectedAttribute { Key = "path_hash", Value = "b5880367" }, new ExpectedAttribute { Key = "referring_transaction_guid", Value = clientTransactionGuid }, }; var transactionEvent = _compositeTestAgent.TransactionEvents.First(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple ( () => TransactionEventAssertions.HasAttributes(expectedEventAttributes, AttributeClassification.Intrinsics, transactionEvent), () => TransactionEventAssertions.DoesNotHaveAttributes(unexpectedEventAttributes, AttributeClassification.Intrinsics, transactionEvent), () => TransactionTraceAssertions.HasAttributes(expectedTraceAttributes, AttributeClassification.Intrinsics, transactionTrace) ); }
public void DatastoreSegment_HasNoInstanceMetric_WhenInstanceReportingIsDisabled() { _compositeTestAgent.LocalConfiguration.datastoreTracer.instanceReporting.enabled = false; var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartDatastoreRequestSegmentOrThrow("INSERT", DatastoreVendor.MSSQL, "MyAwesomeTable", null, null, "HostName", "1433", "MyDatabase"); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new[] { new ExpectedMetric { Name = "Datastore/all" }, new ExpectedMetric { Name = "Datastore/allWeb" }, new ExpectedMetric { Name = "Datastore/MSSQL/all" }, new ExpectedMetric { Name = "Datastore/MSSQL/allWeb" }, new ExpectedMetric { Name = "Datastore/statement/MSSQL/MyAwesomeTable/INSERT" }, new ExpectedMetric { Name = "Datastore/statement/MSSQL/MyAwesomeTable/INSERT", Scope = "WebTransaction/Action/name" }, new ExpectedMetric { Name = "Datastore/operation/MSSQL/INSERT" } }; var unexpectedMetrics = new[] { new ExpectedMetric { Name = "Datastore/allOther" }, new ExpectedMetric { Name = "Datastore/instance/MSSQL/HostName/1433" } }; var expectedSegments = new[] { "Datastore/statement/MSSQL/MyAwesomeTable/INSERT" }; var actualMetrics = _compositeTestAgent.Metrics.ToList(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => TransactionTraceAssertions.SegmentsExist(expectedSegments, transactionTrace), () => MetricAssertions.MetricsExist(expectedMetrics, actualMetrics), () => MetricAssertions.MetricsDoNotExist(unexpectedMetrics, actualMetrics) ); }
public void ExternalSegment_HasCorrectTraceNameAndMetrics_IfCatResponseReceived() { const string encodingKey = "foo"; _compositeTestAgent.ServerConfiguration.EncodingKey = encodingKey; _compositeTestAgent.PushConfiguration(); var tx = _agent.CreateTransaction( isWeb: true, category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action), transactionDisplayName: "name", doNotTrackAsUnitOfWork: true); var segment = _agent.StartExternalRequestSegmentOrThrow(new Uri("http://www.newrelic.com/test"), "POST"); var catResponseData = new CrossApplicationResponseData("123#456", "transactionName", 1.1f, 2.2f, 3, "guid"); var responseHeaders = new Dictionary <string, string> { { "X-NewRelic-App-Data", HeaderEncoder.EncodeSerializedData(JsonConvert.SerializeObject(catResponseData), encodingKey) } }; tx.ProcessInboundResponse(responseHeaders, segment); segment.End(); tx.End(); _compositeTestAgent.Harvest(); var expectedMetrics = new[] { new ExpectedMetric { Name = "External/all" }, new ExpectedMetric { Name = "External/allWeb" }, new ExpectedMetric { Name = "External/www.newrelic.com/all" }, new ExpectedMetric { Name = "External/www.newrelic.com/Stream/POST" }, new ExpectedMetric { Name = "ExternalApp/www.newrelic.com/123#456/all" }, new ExpectedMetric { Name = "ExternalTransaction/www.newrelic.com/123#456/transactionName" }, new ExpectedMetric { Name = "ExternalTransaction/www.newrelic.com/123#456/transactionName", Scope = "WebTransaction/Action/name" } }; var unexpectedMetrics = new[] { new ExpectedMetric { Name = "External/allOther" }, new ExpectedMetric { Name = "External/www.newrelic.com/Stream/POST", Scope = "WebTransaction/Action/name" } }; var unexpectedSegments = new[] { "External/www.newrelic.com/Stream/POST" }; var expectedSegments = new[] { "ExternalTransaction/www.newrelic.com/123#456/transactionName" }; var actualMetrics = _compositeTestAgent.Metrics.ToList(); var transactionTrace = _compositeTestAgent.TransactionTraces.First(); NrAssert.Multiple( () => TransactionTraceAssertions.SegmentsExist(expectedSegments, transactionTrace), () => TransactionTraceAssertions.SegmentsDoNotExist(unexpectedSegments, transactionTrace), () => MetricAssertions.MetricsExist(expectedMetrics, actualMetrics), () => MetricAssertions.MetricsDoNotExist(unexpectedMetrics, actualMetrics) ); }