Class for New Relic-compatible XML output of the exactMethodMatcher element.
        public void GetHashCode_ReturnsSameValue_ForEquivalentObjects()
        {
            var first = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" });
            var second = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" });

            Assert.AreEqual(first.GetHashCode(), second.GetHashCode());
        }
        public void Equals_ReturnsFalse_IfParameterTypesDoNotMatch()
        {
            var first = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" });
            var second = new ExactMethodMatcher("Method 1", new[] { "Parameter 3", "Parameter 2" });

            Assert.IsFalse(first.Equals(second));
        }
        public void Equals_ReturnsTrue_ForEquivalentObjects()
        {
            var first = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" });
            var second = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" });

            Assert.IsTrue(first.Equals(second));
        }
Example #4
0
        /// <summary>
        /// Creates an XML-renderable Extension object that represents the instrumentation settings
        /// specified by the supplied list of targets.
        /// </summary>
        /// <param name="targets">The set of targets to be instrumented.</param>
        /// <returns>An Extension object representing the in-memory New Relic custom
        /// instrumentation configuration XML document.</returns>
        public static Extension Render(IEnumerable <InstrumentationTarget> targets)
        {
            Instrumentation toReturn = new Instrumentation();

            // Group the targets by metric name...
            var byMetricName = targets.GroupBy(x => x.MetricName ?? string.Empty);

            foreach (var groupedByMetricName in byMetricName.OrderBy(x => x.Key))
            {
                // Then by name
                var byName = groupedByMetricName.GroupBy(x => x.Name ?? string.Empty);
                foreach (var groupedByName in byName.OrderBy(x => x.Key))
                {
                    // Then by priority
                    var byPriority = groupedByName.GroupBy(x => x.TransactionNamingPriority ?? string.Empty);
                    foreach (var groupedByPriority in byPriority.OrderBy(x => x.Key))
                    {
                        // Then group by metric
                        var byMetric = groupedByPriority.GroupBy(x => x.Metric);
                        foreach (var groupedByMetric in byMetric.OrderBy(x => x.Key))
                        {
                            string metricName = groupedByMetricName.Key == string.Empty ? null : groupedByMetricName.Key;
                            string name       = groupedByName.Key == string.Empty ? null : groupedByName.Key;
                            string priority   = groupedByPriority.Key == string.Empty ? null : groupedByPriority.Key;

                            TracerFactory tracerFactory = new TracerFactory(metricName, name, priority, groupedByMetric.Key);

                            var byType = groupedByMetric.GroupBy(x => x.Target.DeclaringType);
                            foreach (var groupedByType in byType.OrderBy(x => x.Key.Assembly.FullName).ThenBy(x => x.Key.FullName))
                            {
                                Match match = GetMatchFromType(groupedByType.Key);

                                // Each item in the groupedByType enumerable is a method to be instrumented
                                foreach (var toInstrument in groupedByType.OrderBy(x => x.Target.Name))
                                {
                                    ExactMethodMatcher methodMatcher = GetMatcherFromTarget(toInstrument);
                                    match.Matches.Add(methodMatcher);
                                }

                                // De-dupe the method matchers, in case we have some parameterless
                                // entries and some with - as the parameterless ones will take precedence
                                // anyway, there's no point keeping the others
                                HashSet <ExactMethodMatcher> toDelete = new HashSet <ExactMethodMatcher>();
                                foreach (var matcher in match.Matches.Where(x => string.IsNullOrWhiteSpace(x.ParameterTypes)))
                                {
                                    toDelete.UnionWith(match.Matches.Where(x => x.MethodName == matcher.MethodName && !string.IsNullOrWhiteSpace(x.ParameterTypes)));
                                }

                                match.Matches.RemoveAll(x => toDelete.Contains(x));

                                tracerFactory.MatchDefinitions.Add(match);
                            }

                            toReturn.TracerFactories.Add(tracerFactory);
                        }
                    }
                }
            }

            return(new Extension()
            {
                Instrumentation = toReturn
            });
        }