From 920c608ec4e225b1f0c7a2b70774f5f969793a61 Mon Sep 17 00:00:00 2001 From: Ed Chapel Date: Tue, 24 Sep 2013 21:02:15 +0200 Subject: [PATCH 1/4] vNext --- build/versions.targets | 2 +- src/Common/CommonAssemblyInfo.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/versions.targets b/build/versions.targets index d95248b..6a65dbc 100644 --- a/build/versions.targets +++ b/build/versions.targets @@ -3,7 +3,7 @@ 1 0 - 10 + 11 diff --git a/src/Common/CommonAssemblyInfo.cs b/src/Common/CommonAssemblyInfo.cs index 658dfce..4b2cf58 100644 --- a/src/Common/CommonAssemblyInfo.cs +++ b/src/Common/CommonAssemblyInfo.cs @@ -7,6 +7,6 @@ [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] -[assembly: AssemblyVersion("1.0.10")] -[assembly: AssemblyFileVersion("1.0.10")] -[assembly: AssemblyInformationalVersion("1.0.10")] +[assembly: AssemblyVersion("1.0.11")] +[assembly: AssemblyFileVersion("1.0.11")] +[assembly: AssemblyInformationalVersion("1.0.11")] From 6f1d993f47f6e3c74ff15deab1bf763834ee20a8 Mon Sep 17 00:00:00 2001 From: Ed Chapel Date: Tue, 24 Sep 2013 21:02:30 +0200 Subject: [PATCH 2/4] Icons for Plugin Central. --- build/SQL-Azure.png | Bin 0 -> 8732 bytes build/SQL-Server.png | Bin 0 -> 6727 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 build/SQL-Azure.png create mode 100644 build/SQL-Server.png diff --git a/build/SQL-Azure.png b/build/SQL-Azure.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f6ba98d9834648560bcf548dfc89db9a967c5a GIT binary patch literal 8732 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 Vwshmd{NMW;$_nc8wX&As{|7<}i_!o9 literal 0 HcmV?d00001 diff --git a/build/SQL-Server.png b/build/SQL-Server.png new file mode 100644 index 0000000000000000000000000000000000000000..8b054b4dcbfd9859f0cfef665c9a717b6ad304d5 GIT binary patch literal 6727 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 Date: Thu, 14 Nov 2013 18:16:25 -0800 Subject: [PATCH 3/4] Fixing bug identified in Ticket #60055 where metrics related to FileIO were no longer being sent as Deltas. It looks like this was mistakenly broken while trying to fix the RecompileSummary (https://github.com/newrelic-platform/newrelic_microsoft_sqlserver_plugin/commit/dd0a651ed6050cc5f27780adbfab0f1820b27b49). Added a test to make sure we don't face this regression issue again. --- ...ic.Microsoft.SqlServer.Plugin.Tests.csproj | 2 +- .../SqlMonitorQueryTests.cs | 78 +++++++++++++++++++ .../SqlMonitoryQueryTests.cs | 66 ---------------- .../MetricQuery.cs | 7 +- .../SqlQuery.cs | 2 +- .../SqlServerEndpoint.cs | 70 ++++++++++------- 6 files changed, 125 insertions(+), 100 deletions(-) create mode 100644 src/NewRelic.Microsoft.SqlServer.Plugin.Tests/SqlMonitorQueryTests.cs delete mode 100644 src/NewRelic.Microsoft.SqlServer.Plugin.Tests/SqlMonitoryQueryTests.cs diff --git a/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/NewRelic.Microsoft.SqlServer.Plugin.Tests.csproj b/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/NewRelic.Microsoft.SqlServer.Plugin.Tests.csproj index 3442e84..26cc28e 100644 --- a/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/NewRelic.Microsoft.SqlServer.Plugin.Tests.csproj +++ b/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/NewRelic.Microsoft.SqlServer.Plugin.Tests.csproj @@ -70,7 +70,7 @@ - + diff --git a/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/SqlMonitorQueryTests.cs b/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/SqlMonitorQueryTests.cs new file mode 100644 index 0000000..256aeb7 --- /dev/null +++ b/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/SqlMonitorQueryTests.cs @@ -0,0 +1,78 @@ +using System; +using System.Linq; + +using NewRelic.Microsoft.SqlServer.Plugin.Core; +using NewRelic.Microsoft.SqlServer.Plugin.QueryTypes; +using NewRelic.Platform.Binding.DotNET; + +using NSubstitute; + +using NUnit.Framework; + +namespace NewRelic.Microsoft.SqlServer.Plugin +{ + [TestFixture] + public class SqlMonitorQueryTests + { + protected class FakeQueryType + { + public long Long { get; set; } + public int Integer { get; set; } + public short Short { get; set; } + public byte Byte { get; set; } + public decimal Decimal { get; set; } + public string Comment { get; set; } + public DateTime EventTime { get; set; } + } + + [Test] + public void Assert_only_numerics_are_returned() + { + MetricMapper[] metricMappers = MetricQuery.GetMappers(typeof (FakeQueryType)); + Assert.That(metricMappers, Is.Not.Null); + + // Keep these out of order to ensure we don't depend on it + var expected = new[] {"Long", "Integer", "Short", "Decimal", "Byte"}; + string[] actual = metricMappers.Select(m => m.MetricName).ToArray(); + Assert.That(actual, Is.EquivalentTo(expected), "Properties discovered and mapped wrong"); + } + + [Test] + [TestCase(MetricTransformEnum.Delta)] + [TestCase(MetricTransformEnum.Simple)] + public void Assert_query_sets_appropriate_metric_transform(MetricTransformEnum metricTransformEnum) + { + var attribute = new SqlServerQueryAttribute("FileIO.sql", "Foo/Bar") {MetricTransformEnum = metricTransformEnum}; + var sqlQuery = new SqlQuery(typeof (FileIoView), attribute, Substitute.For(), ""); + + Assert.That(sqlQuery.MetricTransformEnum, Is.EqualTo(attribute.MetricTransformEnum), "SqlQuery did not set correct value from attribute for MetricTransformEnum"); + } + + [Test] + public void Assert_results_are_mapped_into_metrics() + { + var fakes = new[] + { + new FakeQueryType + { + Long = 42, + Integer = 27, + Short = 12, + Byte = 255, + Decimal = 407.54m, + Comment = "Utterly worthless... except for logging", + EventTime = DateTime.Now, + } + }; + + var sqlQuery = new SqlQuery(typeof (FakeQueryType), new SqlServerQueryAttribute("foo.sql", "Fake/"), Substitute.For(), ""); + + var componentData = new ComponentData(); + sqlQuery.AddMetrics(new QueryContext(sqlQuery) {ComponentData = componentData, Results = fakes,}); + + var expected = new[] {"Fake/Long", "Fake/Integer", "Fake/Short", "Fake/Decimal", "Fake/Byte"}; + string[] actual = componentData.Metrics.Keys.ToArray(); + Assert.That(actual, Is.EquivalentTo(expected), "Properties discovered and mapped wrong"); + } + } +} diff --git a/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/SqlMonitoryQueryTests.cs b/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/SqlMonitoryQueryTests.cs deleted file mode 100644 index db24f6e..0000000 --- a/src/NewRelic.Microsoft.SqlServer.Plugin.Tests/SqlMonitoryQueryTests.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Linq; - -using NSubstitute; - -using NUnit.Framework; - -using NewRelic.Microsoft.SqlServer.Plugin.Core; -using NewRelic.Platform.Binding.DotNET; - -namespace NewRelic.Microsoft.SqlServer.Plugin -{ - [TestFixture] - public class SqlMonitoryQueryTests - { - protected class FakeQueryType - { - public long Long { get; set; } - public int Integer { get; set; } - public short Short { get; set; } - public byte Byte { get; set; } - public decimal Decimal { get; set; } - public string Comment { get; set; } - public DateTime EventTime { get; set; } - } - - [Test] - public void Assert_only_numerics_are_returned() - { - var metricMappers = SqlQuery.GetMappers(typeof (FakeQueryType)); - Assert.That(metricMappers, Is.Not.Null); - - // Keep these out of order to ensure we don't depend on it - var expected = new[] {"Long", "Integer", "Short", "Decimal", "Byte"}; - var actual = metricMappers.Select(m => m.MetricName).ToArray(); - Assert.That(actual, Is.EquivalentTo(expected), "Properties discovered and mapped wrong"); - } - - [Test] - public void Assert_results_are_mapped_into_metrics() - { - var fakes = new[] - { - new FakeQueryType - { - Long = 42, - Integer = 27, - Short = 12, - Byte = 255, - Decimal = 407.54m, - Comment = "Utterly worthless... except for logging", - EventTime = DateTime.Now, - } - }; - - var sqlQuery = new SqlQuery(typeof (FakeQueryType), new SqlServerQueryAttribute("foo.sql", "Fake/"), Substitute.For(), ""); - - var componentData = new ComponentData(); - sqlQuery.AddMetrics(new QueryContext(sqlQuery) {ComponentData = componentData, Results = fakes,}); - - var expected = new[] {"Fake/Long", "Fake/Integer", "Fake/Short", "Fake/Decimal", "Fake/Byte"}; - var actual = componentData.Metrics.Keys.ToArray(); - Assert.That(actual, Is.EquivalentTo(expected), "Properties discovered and mapped wrong"); - } - } -} diff --git a/src/NewRelic.Microsoft.SqlServer.Plugin/MetricQuery.cs b/src/NewRelic.Microsoft.SqlServer.Plugin/MetricQuery.cs index aa7815b..e837be2 100644 --- a/src/NewRelic.Microsoft.SqlServer.Plugin/MetricQuery.cs +++ b/src/NewRelic.Microsoft.SqlServer.Plugin/MetricQuery.cs @@ -11,20 +11,21 @@ public class MetricQuery : IMetricQuery { private readonly MetricMapper[] _metricMappers; - public MetricQuery(Type queryType, string queryName, string resultTypeName) + public MetricQuery(Type queryType, string queryName, string resultTypeName, MetricTransformEnum metricTransformEnum = MetricTransformEnum.Simple) { QueryType = queryType; QueryName = queryName; ResultTypeName = resultTypeName; _metricMappers = GetMappers(QueryType); MetricPattern = string.Format("Component/{0}", QueryType.Name); + MetricTransformEnum = metricTransformEnum; } public Type QueryType { get; private set; } public string QueryName { get; private set; } - public MetricTransformEnum MetricTransformEnum { get; set; } + public MetricTransformEnum MetricTransformEnum { get; protected set; } public string MetricPattern { get; protected set; } @@ -52,4 +53,4 @@ internal static MetricMapper[] GetMappers(Type type) .ToArray(); } } -} \ No newline at end of file +} diff --git a/src/NewRelic.Microsoft.SqlServer.Plugin/SqlQuery.cs b/src/NewRelic.Microsoft.SqlServer.Plugin/SqlQuery.cs index c9a0f6c..9e4af16 100644 --- a/src/NewRelic.Microsoft.SqlServer.Plugin/SqlQuery.cs +++ b/src/NewRelic.Microsoft.SqlServer.Plugin/SqlQuery.cs @@ -23,7 +23,7 @@ public class SqlQuery : MetricQuery, ISqlQuery internal QueryAttribute QueryAttribute; public SqlQuery(Type queryType, QueryAttribute attribute, IDapperWrapper dapperWrapper, string commandText = null) - : base(queryType, attribute.QueryName, queryType.Name) + : base(queryType, attribute.QueryName, queryType.Name, attribute.MetricTransformEnum) { _dapperWrapper = dapperWrapper; QueryAttribute = attribute; diff --git a/src/NewRelic.Microsoft.SqlServer.Plugin/SqlServerEndpoint.cs b/src/NewRelic.Microsoft.SqlServer.Plugin/SqlServerEndpoint.cs index 292ccf6..0a5a527 100644 --- a/src/NewRelic.Microsoft.SqlServer.Plugin/SqlServerEndpoint.cs +++ b/src/NewRelic.Microsoft.SqlServer.Plugin/SqlServerEndpoint.cs @@ -3,13 +3,13 @@ using System.Data.SqlClient; using System.Linq; +using log4net; + using NewRelic.Microsoft.SqlServer.Plugin.Configuration; using NewRelic.Microsoft.SqlServer.Plugin.Core; using NewRelic.Microsoft.SqlServer.Plugin.Properties; using NewRelic.Microsoft.SqlServer.Plugin.QueryTypes; -using log4net; - namespace NewRelic.Microsoft.SqlServer.Plugin { public class SqlServerEndpoint : SqlEndpointBase @@ -35,15 +35,15 @@ public SqlServerEndpoint(string name, string connectionString, bool includeSyste if (includeSystemDatabases && includedDbs.Any()) { - var systemDbsToAdd = Constants.SystemDatabases - .Where(dbName => includedDbs.All(db => db.Name != dbName)) - .Select(dbName => new Database {Name = dbName}); + IEnumerable systemDbsToAdd = Constants.SystemDatabases + .Where(dbName => includedDbs.All(db => db.Name != dbName)) + .Select(dbName => new Database {Name = dbName}); includedDbs.AddRange(systemDbsToAdd); } else if (!includeSystemDatabases) { - var systemDbsToAdd = Constants.SystemDatabases - .Where(dbName => excludedDbs.All(db => db != dbName)); + IEnumerable systemDbsToAdd = Constants.SystemDatabases + .Where(dbName => excludedDbs.All(db => db != dbName)); excludedDbs.AddRange(systemDbsToAdd); } @@ -71,7 +71,8 @@ internal static string FormatProperties(string name, string connectionString, st } /// - /// Replaces the database name on results with the when possible. + /// Replaces the database name on results with the + /// when possible. /// /// /// @@ -82,19 +83,19 @@ internal static void ApplyDatabaseDisplayNames(IEnumerable includedDat return; } - var renameMap = includedDatabases.Where(d => !string.IsNullOrEmpty(d.DisplayName)).ToDictionary(d => d.Name.ToLower(), d => d.DisplayName); + Dictionary renameMap = includedDatabases.Where(d => !string.IsNullOrEmpty(d.DisplayName)).ToDictionary(d => d.Name.ToLower(), d => d.DisplayName); if (!renameMap.Any()) { return; } - var databaseMetrics = results.OfType().Where(d => !string.IsNullOrEmpty(d.DatabaseName)).ToArray(); + IDatabaseMetric[] databaseMetrics = results.OfType().Where(d => !string.IsNullOrEmpty(d.DatabaseName)).ToArray(); if (!databaseMetrics.Any()) { return; } - foreach (var databaseMetric in databaseMetrics) + foreach (IDatabaseMetric databaseMetric in databaseMetrics) { string displayName; if (renameMap.TryGetValue(databaseMetric.DatabaseName.ToLower(), out displayName)) @@ -118,17 +119,17 @@ public override void ToLog(ILog log) try { var queryLocator = new QueryLocator(new DapperWrapper()); - var serverDetailsQuery = queryLocator.PrepareQueries(new[] {typeof (SqlServerDetails),}, false).Single(); - var databasesDetailsQuery = queryLocator.PrepareQueries(new[] {typeof (DatabaseDetails),}, false).Single(); + SqlQuery serverDetailsQuery = queryLocator.PrepareQueries(new[] {typeof (SqlServerDetails),}, false).Single(); + SqlQuery databasesDetailsQuery = queryLocator.PrepareQueries(new[] {typeof (DatabaseDetails),}, false).Single(); using (var conn = new SqlConnection(ConnectionString)) { // Log the server details - var serverDetails = serverDetailsQuery.Query(conn, this).Single(); - LogVerboseSqlResults(serverDetailsQuery, new [] { serverDetails }); + SqlServerDetails serverDetails = serverDetailsQuery.Query(conn, this).Single(); + LogVerboseSqlResults(serverDetailsQuery, new[] {serverDetails}); log.InfoFormat(" {0} {1} {2} ({3})", serverDetails.SQLTitle, serverDetails.Edition, serverDetails.ProductLevel, serverDetails.ProductVersion); // Sotre these for reporting below - var databasesDetails = databasesDetailsQuery.DatabaseMetricQuery(conn, this).ToArray(); + DatabaseDetails[] databasesDetails = databasesDetailsQuery.DatabaseMetricQuery(conn, this).ToArray(); LogVerboseSqlResults(databasesDetailsQuery, databasesDetails); databaseDetailsByName = databasesDetails.ToDictionary(d => d.DatabaseName); } @@ -140,13 +141,13 @@ public override void ToLog(ILog log) databaseDetailsByName = null; } - var hasExplicitIncludedDatabases = IncludedDatabaseNames.Any(); + bool hasExplicitIncludedDatabases = IncludedDatabaseNames.Any(); if (hasExplicitIncludedDatabases) { // Show the user the databases we'll be working from - foreach (var database in IncludedDatabases) + foreach (Database database in IncludedDatabases) { - var message = " Including DB: " + database.Name; + string message = " Including DB: " + database.Name; // When the details are reachable, show them if (databaseDetailsByName != null) @@ -155,7 +156,12 @@ public override void ToLog(ILog log) if (databaseDetailsByName.TryGetValue(database.Name, out details)) { message += string.Format(" [CompatibilityLevel={0};State={1}({2});CreateDate={3:yyyy-MM-dd};UserAccess={4}({5})]", - details.compatibility_level, details.state_desc, details.state, details.create_date, details.user_access_desc, details.user_access); + details.compatibility_level, + details.state_desc, + details.state, + details.create_date, + details.user_access_desc, + details.user_access); } else { @@ -171,16 +177,22 @@ public override void ToLog(ILog log) { // The user didn't specifically include any databases // Report details for all of the DBs we expect to gather metrics against - foreach (var details in databaseDetailsByName.Values) + foreach (DatabaseDetails details in databaseDetailsByName.Values) { log.InfoFormat(" Including DB: {0} [CompatibilityLevel={1};State={2}({3});CreateDate={4:yyyy-MM-dd};UserAccess={5}({6})]", - details.DatabaseName, details.compatibility_level, details.state_desc, details.state, details.create_date, details.user_access_desc, details.user_access); + details.DatabaseName, + details.compatibility_level, + details.state_desc, + details.state, + details.create_date, + details.user_access_desc, + details.user_access); } } // If there are included DB's, log the Excluded DB's as DEBUG info. - var logger = hasExplicitIncludedDatabases ? (Action) log.Debug : log.Info; - foreach (var database in ExcludedDatabaseNames) + Action logger = hasExplicitIncludedDatabases ? (Action) log.Debug : log.Info; + foreach (string database in ExcludedDatabaseNames) { logger(" Excluding DB: " + database); } @@ -195,16 +207,16 @@ protected override object[] OnQueryExecuted(ISqlQuery query, object[] results, I public override IEnumerable ExecuteQueries(ILog log) { - var queries = base.ExecuteQueries(log); + IEnumerable queries = base.ExecuteQueries(log); - foreach (var query in queries) + foreach (IQueryContext query in queries) { yield return query; if (query.QueryType != typeof (RecompileSummary)) continue; // Manually add this summary metric - var max = GetMaxRecompileSummaryMetric(query.Results); + IQueryContext max = GetMaxRecompileSummaryMetric(query.Results); if (max != null) { yield return max; @@ -213,7 +225,7 @@ public override IEnumerable ExecuteQueries(ILog log) } /// - /// Reports a maximum set of values for the recompiles to support the Summary Metric on the New Relic dashboard + /// Reports a maximum set of values for the recompiles to support the Summary Metric on the New Relic dashboard /// /// /// @@ -221,7 +233,7 @@ internal IQueryContext GetMaxRecompileSummaryMetric(IEnumerable results) { if (results == null) return null; - var recompileSummaries = results.OfType().ToArray(); + RecompileSummary[] recompileSummaries = results.OfType().ToArray(); if (!recompileSummaries.Any()) return null; var max = new RecompileMaximums From fba209bc13fa4c1fef4d4aa471eab79871cf8fc7 Mon Sep 17 00:00:00 2001 From: Jesse Stromwick Date: Wed, 11 Dec 2013 21:39:39 -0800 Subject: [PATCH 4/4] Updating ReadMe to make it clearer that a single plugin can monitor multiple sql server instances. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2e13cb..267b2a4 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ A plugin for monitoring Microsoft SQL Server using the New Relic platform. 1. Run a text editor **as administrator** and open the file `INSTALLDIR\NewRelic.Microsoft.SqlServer.Plugin.exe.config`. 2. Find the setting `` and replace `YOUR_KEY_HERE` with your New Relic license key. 3. Configure one or more SQL Servers or Azure SQL Databases - * In the `` section, add a `` setting for a SQL Server. + * In the `` section, add a `` setting for _each_ SQL Server instance you wish to monitor. * `name="Production Database"` The name of your server is visible on the New Relic dashboard. * `connectionString="Server=prd.domain.com,1433;Database=master;Trusted_Connection=True;"` Any valid connection string to your database. * In the `` section, add a `` setting for _each_ Windows Azure SQL Database.