Example #1
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)
                );
        }
Example #2
0
        public void SetCustomTransactionName_UpdatesTransactionNameCorrectly_IfNameIsPrefixedWithCustom()
        {
            var transaction = _agent.CreateTransaction(
                isWeb: false,
                category: "cat",
                transactionDisplayName: "name",
                doNotTrackAsUnitOfWork: true);

            transaction.SetCustomTransactionName("Custom/foo", TransactionNamePriority.Route);
            var segment = _agent.StartTransactionSegmentOrThrow("simpleName");

            segment.End();
            transaction.End();

            _compositeTestAgent.Harvest();

            var expectedMetrics = new[]
            {
                // The agent should de-duplicate the "Custom/" prefix that was passed in
                new ExpectedMetric {
                    Name = "OtherTransaction/Custom/foo"
                }
            };
            var actualMetrics    = _compositeTestAgent.Metrics.ToList();
            var transactionTrace = _compositeTestAgent.TransactionTraces.First();

            NrAssert.Multiple(
                () => MetricAssertions.MetricsExist(expectedMetrics, actualMetrics),
                () => Assert.AreEqual("OtherTransaction/Custom/foo", transactionTrace.TransactionMetricName)
                );
        }
Example #3
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);
        }
Example #4
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);
        }
Example #5
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)
                );
        }
Example #6
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)
                );
        }
Example #7
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);
        }
Example #8
0
        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)
                );
        }
Example #9
0
        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)
                );
        }
        private void HarvestAndValidateMetric(string expectedMetricName)
        {
            _compositeTestAgent.Harvest();

            // ASSERT
            var expectedMetrics = new List <ExpectedMetric>
            {
                new ExpectedCountMetric {
                    Name = SupportabilityMetricPrefix + expectedMetricName, CallCount = 1
                }
            };

            MetricAssertions.MetricsExist(expectedMetrics, _compositeTestAgent.Metrics);
        }
Example #11
0
        public void SetWebTransactionNameFromStatusCode_RollsUpTransactionNameCorrectly()
        {
            var count404s = 4;
            var count300s = 3;
            var count503s = 2;

            for (var x = 0; x < count404s; x++)
            {
                var transaction = _agent.CreateTransaction(true, "category", "displayName", false);
                _agent.StartTransactionSegmentOrThrow("segment").End();
                transaction.SetHttpResponseStatusCode(404);
                _agent.CurrentTransaction.End();
            }
            for (var x = 0; x < count300s; x++)
            {
                var transaction = _agent.CreateTransaction(true, "category", "displayName", false);
                _agent.StartTransactionSegmentOrThrow("segment").End();
                transaction.SetHttpResponseStatusCode(300);
                _agent.CurrentTransaction.End();
            }
            for (var x = 0; x < count503s; x++)
            {
                var transaction = _agent.CreateTransaction(true, "category", "displayName", false);
                _agent.StartTransactionSegmentOrThrow("segment").End();
                transaction.SetHttpResponseStatusCode(503);
                _agent.CurrentTransaction.End();
            }

            _compositeTestAgent.Harvest();

            var expectedMetrics = new[]
            {
                new ExpectedTimeMetric {
                    Name = "WebTransaction/StatusCode/404", CallCount = count404s
                },
                new ExpectedTimeMetric {
                    Name = "WebTransaction/StatusCode/300", CallCount = count300s
                },
                new ExpectedTimeMetric {
                    Name = "WebTransaction/StatusCode/503", CallCount = count503s
                },
            };

            var actualMetrics = _compositeTestAgent.Metrics.ToList();

            MetricAssertions.MetricsExist(expectedMetrics, actualMetrics);
        }
Example #12
0
        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)
                );
        }
Example #13
0
        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)
                );
        }
Example #14
0
        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)
                );
        }
        public void SqlParsingCacheMetricsAreGenerated()
        {
            var transaction = _agent.CreateTransaction(
                isWeb: true,
                category: EnumNameCache <WebTransactionType> .GetName(WebTransactionType.Action),
                transactionDisplayName: "name",
                doNotTrackAsUnitOfWork: true);

            _agent.StartDatastoreRequestSegmentOrThrow(DatastoreVendor.MSSQL, CommandType.Text, "SELECT * FROM Table1").End();
            _agent.StartDatastoreRequestSegmentOrThrow(DatastoreVendor.MSSQL, CommandType.Text, "SELECT * FROM Table1").End();
            _agent.StartDatastoreRequestSegmentOrThrow(DatastoreVendor.MSSQL, CommandType.Text, "SELECT * FROM Table1").End();
            _agent.StartDatastoreRequestSegmentOrThrow(DatastoreVendor.MSSQL, CommandType.Text, "SELECT * FROM Table2").End();
            _agent.StartDatastoreRequestSegmentOrThrow(DatastoreVendor.MSSQL, CommandType.Text, "SELECT * FROM Table2").End();

            _agent.StartDatastoreRequestSegmentOrThrow(DatastoreVendor.IBMDB2, CommandType.Text, "SELECT * FROM Table1").End();
            _agent.StartDatastoreRequestSegmentOrThrow(DatastoreVendor.IBMDB2, CommandType.Text, "SELECT * FROM Table1").End();

            transaction.End();

            _compositeTestAgent.Harvest();

            const int defaultCapacity = 1000;

            // ASSERT
            var expectedMetrics = new List <ExpectedMetric>
            {
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/MSSQL/Capacity", CallCount = 1, Total = defaultCapacity
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/MSSQL/Hits", CallCount = 3
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/MSSQL/Misses", CallCount = 2
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/MSSQL/Ejections", CallCount = 0
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/MSSQL/Size", CallCount = 1, Total = 2
                },

                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/IBMDB2/Capacity", CallCount = 1, Total = defaultCapacity
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/IBMDB2/Hits", CallCount = 1
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/IBMDB2/Misses", CallCount = 1
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/IBMDB2/Ejections", CallCount = 0
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/IBMDB2/Size", CallCount = 1, Total = 1
                },

                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/MSSQL/Capacity", CallCount = 1, Total = defaultCapacity
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/MSSQL/Hits", CallCount = 3
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/MSSQL/Misses", CallCount = 2
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/MSSQL/Ejections", CallCount = 0
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/MSSQL/Size", CallCount = 1, Total = 2
                },

                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/IBMDB2/Capacity", CallCount = 1, Total = defaultCapacity
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/IBMDB2/Hits", CallCount = 1
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/IBMDB2/Misses", CallCount = 1
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/IBMDB2/Ejections", CallCount = 0
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/IBMDB2/Size", CallCount = 1, Total = 1
                }
            };

            var unexpectedMetrics = new List <ExpectedMetric>
            {
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/MongoDB/Hits"
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/MongoDB/Misses"
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/MongoDB/Ejections"
                },
                new ExpectedCountMetric {
                    Name = SqlParsingCacheMetricPrefix + "/MongoDB/Size"
                },

                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/MongoDB/Hits"
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/MongoDB/Misses"
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/MongoDB/Ejections"
                },
                new ExpectedCountMetric {
                    Name = SqlObfuscationMetricPrefix + "/MongoDB/Size"
                }
            };

            MetricAssertions.MetricsExist(expectedMetrics, _compositeTestAgent.Metrics);
            MetricAssertions.MetricsDoNotExist(unexpectedMetrics, _compositeTestAgent.Metrics);
        }