public void Assert_that_disabled_queries_are_ignored()
        {
            var assembly     = Assembly.GetExecutingAssembly();
            var queryLocator = new QueryLocator(null, assembly);

            var queries = queryLocator.PrepareQueries(new[] { typeof(QueryTypeDisabled) });

            Assert.That(queries, Is.Empty);
        }
        public void Assert_resource_with_partial_resource_name_is_located()
        {
            var assembly = Assembly.GetExecutingAssembly();
            var queryLocator = new QueryLocator(null, assembly);

            var queries = queryLocator.PrepareQueries(new[] {typeof (QueryTypeWithPartialResourceName)});
            Assert.That(queries, Is.Not.Null);
            var queryNames = queries.Select(q => q.ResultTypeName).ToArray();
            Assert.That(queryNames, Is.EqualTo(new[] {typeof (QueryTypeWithPartialResourceName).Name}));
        }
        public void Assert_that_only_enabled_queries_are_found()
        {
            var assembly     = Assembly.GetExecutingAssembly();
            var queryLocator = new QueryLocator(null, assembly);

            var queries = queryLocator.PrepareQueries(new[] { typeof(QueryTypeSomeEnabled) })
                          .Select(q => q.QueryName)
                          .ToArray();

            Assert.That(queries, Is.EqualTo(new[] { "This is enabled" }));
        }
        public void Assert_multiple_query_attributes_yield_multiple_queries()
        {
            var assembly = Assembly.GetExecutingAssembly();
            var queryLocator = new QueryLocator(null, assembly);

            var queries = queryLocator.PrepareQueries(new[] {typeof (QueryTypeWithTwoQueries)});
            Assert.That(queries, Is.Not.Null);
            var queryNames = queries.Select(q => q.ResourceName).ToArray();
            var expected = new[] {"AnotherQuery.sql", "Queries.ExampleEmbeddedFile.sql"};
            Assert.That(queryNames, Is.EquivalentTo(expected));
        }
        public void Assert_funcs_are_correctly_configured()
        {
            var dapperWrapper = Substitute.For<IDapperWrapper>();

            var queries = new QueryLocator(dapperWrapper).PrepareQueries();
            foreach (var query in queries)
            {
                var results = query.Query(null, Substitute.For<ISqlEndpoint>());
                Assert.That(results, Is.EqualTo(new object[0]));
            }
        }
        public void Assert_resource_with_only_file_name_is_located()
        {
            var assembly     = Assembly.GetExecutingAssembly();
            var queryLocator = new QueryLocator(null, assembly);

            var queries = queryLocator.PrepareQueries(new[] { typeof(QueryTypeWithJustFileName) });

            Assert.That(queries, Is.Not.Null);
            var queryNames = queries.Select(q => q.ResultTypeName).ToArray();

            Assert.That(queryNames, Is.EqualTo(new[] { typeof(QueryTypeWithJustFileName).Name }));
        }
        public void Assert_funcs_are_correctly_configured()
        {
            var dapperWrapper = Substitute.For <IDapperWrapper>();

            var queries = new QueryLocator(dapperWrapper).PrepareQueries();

            foreach (var query in queries)
            {
                var results = query.Query(null, Substitute.For <ISqlEndpoint>());
                Assert.That(results, Is.EqualTo(new object[0]));
            }
        }
        public void Assert_multiple_query_attributes_yield_multiple_queries()
        {
            var assembly     = Assembly.GetExecutingAssembly();
            var queryLocator = new QueryLocator(null, assembly);

            var queries = queryLocator.PrepareQueries(new[] { typeof(QueryTypeWithTwoQueries) });

            Assert.That(queries, Is.Not.Null);
            var queryNames = queries.Select(q => q.ResourceName).ToArray();
            var expected   = new[] { "AnotherQuery.sql", "Queries.ExampleEmbeddedFile.sql" };

            Assert.That(queryNames, Is.EquivalentTo(expected));
        }
        public override void ToLog(ILog log)
        {
            base.ToLog(log);

            // Attempt to connect to the server and get basic details about the server and the databases.
            Dictionary<string, DatabaseDetails> databaseDetailsByName;
            try
            {
                var queryLocator = new QueryLocator(new DapperWrapper());
                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
                    SqlServerDetails serverDetails = serverDetailsQuery.Query<SqlServerDetails>(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
                    DatabaseDetails[] databasesDetails = databasesDetailsQuery.DatabaseMetricQuery<DatabaseDetails>(conn, this).ToArray();
                    LogVerboseSqlResults(databasesDetailsQuery, databasesDetails);
                    databaseDetailsByName = databasesDetails.ToDictionary(d => d.DatabaseName);
                }
            }
            catch (Exception e)
            {
                // Just log some details here. The subsequent queries for metrics yields more error details.
                log.ErrorFormat("        Unable to connect: {0}", e.Message);
                databaseDetailsByName = null;
            }

            bool hasExplicitIncludedDatabases = IncludedDatabaseNames.Any();
            if (hasExplicitIncludedDatabases)
            {
                // Show the user the databases we'll be working from
                foreach (Database database in IncludedDatabases)
                {
                    string message = "        Including DB: " + database.Name;

                    // When the details are reachable, show them
                    if (databaseDetailsByName != null)
                    {
                        DatabaseDetails details;
                        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);
                        }
                        else
                        {
                            // More error details are reported with metric queries
                            message += " [Unable to find database information]";
                        }
                    }

                    log.Info(message);
                }
            }
            else if (databaseDetailsByName != null)
            {
                // The user didn't specifically include any databases
                // Report details for all of the DBs we expect to gather metrics against
                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);
                }
            }

            // If there are included DB's, log the Excluded DB's as DEBUG info.
            Action<string> logger = hasExplicitIncludedDatabases ? (Action<string>) log.Debug : log.Info;
            foreach (string database in ExcludedDatabaseNames)
            {
                logger("        Excluding DB: " + database);
            }
        }
        public override void ToLog(ILog log)
        {
            base.ToLog(log);

            // Attempt to connect to the server and get basic details about the server and the databases.
            Dictionary <string, DatabaseDetails> databaseDetailsByName;

            try
            {
                var      queryLocator          = new QueryLocator(new DapperWrapper());
                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
                    SqlServerDetails serverDetails = serverDetailsQuery.Query <SqlServerDetails>(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
                    DatabaseDetails[] databasesDetails = databasesDetailsQuery.DatabaseMetricQuery <DatabaseDetails>(conn, this).ToArray();
                    LogVerboseSqlResults(databasesDetailsQuery, databasesDetails);
                    databaseDetailsByName = databasesDetails.ToDictionary(d => d.DatabaseName);
                }
            }
            catch (Exception e)
            {
                // Just log some details here. The subsequent queries for metrics yields more error details.
                log.ErrorFormat("        Unable to connect: {0}", e.Message);
                databaseDetailsByName = null;
            }

            bool hasExplicitIncludedDatabases = IncludedDatabaseNames.Any();

            if (hasExplicitIncludedDatabases)
            {
                // Show the user the databases we'll be working from
                foreach (Database database in IncludedDatabases)
                {
                    string message = "        Including DB: " + database.Name;

                    // When the details are reachable, show them
                    if (databaseDetailsByName != null)
                    {
                        DatabaseDetails details;
                        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);
                        }
                        else
                        {
                            // More error details are reported with metric queries
                            message += " [Unable to find database information]";
                        }
                    }

                    log.Info(message);
                }
            }
            else if (databaseDetailsByName != null)
            {
                // The user didn't specifically include any databases
                // Report details for all of the DBs we expect to gather metrics against
                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);
                }
            }

            // If there are included DB's, log the Excluded DB's as DEBUG info.
            Action <string> logger = hasExplicitIncludedDatabases ? (Action <string>)log.Debug : log.Info;

            foreach (string database in ExcludedDatabaseNames)
            {
                logger("        Excluding DB: " + database);
            }
        }
 /// <summary>
 ///     Runs a query against a connection to the master DB on this Azure SQL Server
 /// </summary>
 /// <param name="log"></param>
 /// <returns></returns>
 internal IEnumerable<IQueryContext> PerformThrottlingQuery(ILog log)
 {
     var queries = new QueryLocator(new DapperWrapper()).PrepareQueries(new[] {typeof (AzureServiceInterruptionEvents)}, false).ToArray();
     return ExecuteQueries(queries, _masterConnectionString, log);
 }
        public void Assert_that_queries_are_located()
        {
            var queries = new QueryLocator(new DapperWrapper(), Assembly.GetExecutingAssembly()).PrepareQueries();

            Assert.That(queries, Is.Not.Empty, "Expected some queries to be returned");
        }
 public void Assert_that_queries_are_located()
 {
     var queries = new QueryLocator(new DapperWrapper(), Assembly.GetExecutingAssembly()).PrepareQueries();
     Assert.That(queries, Is.Not.Empty, "Expected some queries to be returned");
 }
        public void Assert_that_only_enabled_queries_are_found()
        {
            var assembly = Assembly.GetExecutingAssembly();
            var queryLocator = new QueryLocator(null, assembly);

            var queries = queryLocator.PrepareQueries(new[] {typeof (QueryTypeSomeEnabled)})
                                      .Select(q => q.QueryName)
                                      .ToArray();

            Assert.That(queries, Is.EqualTo(new[] {"This is enabled"}));
        }
        public void Assert_that_disabled_queries_are_ignored()
        {
            var assembly = Assembly.GetExecutingAssembly();
            var queryLocator = new QueryLocator(null, assembly);

            var queries = queryLocator.PrepareQueries(new[] {typeof (QueryTypeDisabled)});
            Assert.That(queries, Is.Empty);
        }
        /// <summary>
        ///     Runs a query against a connection to the master DB on this Azure SQL Server
        /// </summary>
        /// <param name="log"></param>
        /// <returns></returns>
        internal IEnumerable <IQueryContext> PerformThrottlingQuery(ILog log)
        {
            var queries = new QueryLocator(new DapperWrapper()).PrepareQueries(new[] { typeof(AzureServiceInterruptionEvents) }, false).ToArray();

            return(ExecuteQueries(queries, _masterConnectionString, log));
        }