Example #1
0
        private void CreateEmptyPackageReport(string packageId)
        {
            Log.Info($"CreateEmptyPackageReport for {packageId}");

            // All blob names use lower case identifiers in the NuGet Gallery Azure Blob Storage

            string name = PackageReportDetailBaseName + packageId.ToLowerInvariant();

            CreateBlob(name + ".json", JsonContentType, ReportHelpers.ToStream(new JObject()));
        }
        //  for the initial release we will run New and Old reports in parallel
        //  (the difference is that new reports contain more details)
        //  then when we are happy with our new deployment we will drop the old

        private void CreatePackageReport(string packageId)
        {
            Log.Info(string.Format("CreatePackageReport for {0}", packageId));

            // All blob names use lower case identifiers in the NuGet Gallery Azure Blob Storage

            string name = PackageReportDetailBaseName + packageId.ToLowerInvariant();

            JObject report = CreateJsonContent(packageId);

            CreateBlob(name + ".json", JsonContentType, ReportHelpers.ToStream(report));
        }
Example #3
0
        public override void ExecuteCommand()
        {
            JavaScriptSerializer js = new JavaScriptSerializer();
            AlertThresholds      thresholdValues = js.Deserialize <AlertThresholds>(ReportHelpers.Load(StorageAccount, "Configuration.AlertThresholds.json", ContainerName));
            int error   = thresholdValues.DatabaseSizePercentErrorThreshold;
            int warning = thresholdValues.DatabaseSizePercentWarningThreshold;

            List <DatabaseSize> dbSizeDetails = new List <DatabaseSize>();

            // dbSizeDetails.Add(GetDataSize(PrimaryConnectionString.ConnectionString,threshold));
            dbSizeDetails.Add(GetDataSize(LegacyConnectionString.ConnectionString, error, warning));
            dbSizeDetails.Add(GetDataSize(WarehouseConnectionString.ConnectionString, error, warning));

            var json = js.Serialize(dbSizeDetails);

            ReportHelpers.CreateBlob(StorageAccount, "DBSize.json", ContainerName, "application/json", ReportHelpers.ToStream(json));
        }
        private void CreateInstanceStateReport(XmlDocument doc)
        {
            XmlNodeList roleInstanceNodes = doc.GetElementsByTagName("RoleInstance", "http://schemas.microsoft.com/windowsazure");
            int         roleInstanceCount = roleInstanceNodes.Count;
            List <Tuple <string, string> > instanceStatuses = new List <Tuple <string, string> >();

            string[]      invalidStatus         = { "RestartingRole", "CyclingRole", "FailedStartingRole", "FailedStartingVM", "UnresponsiveRole", "StoppedDeallocated", "Preparing" };
            int           unReadyInstanceCount  = 0;
            List <string> unReadyInstanceStatus = new List <string>();

            foreach (XmlNode node in roleInstanceNodes)
            {
                string instanceName   = node.ChildNodes[1].InnerText;
                string instanceStatus = node.ChildNodes[2].InnerText;
                instanceStatuses.Add(new Tuple <string, string>(instanceName, instanceStatus));
                //Loist of instance status @ http://msdn.microsoft.com/en-us/library/azure/ee460804.aspx#RoleInstanceList. Only Ready and unknown are acceptable.
                if (!instanceStatus.Equals("ReadyRole", StringComparison.OrdinalIgnoreCase))
                {
                    unReadyInstanceCount++;
                    unReadyInstanceStatus.Add(instanceName + "-" + instanceStatus);
                }
                if (invalidStatus.Contains(instanceStatus))
                {
                    string extendedStatus = node.ChildNodes[3].InnerText;
                    new SendAlertMailTask
                    {
                        AlertSubject = string.Format("Cloud service {0} not in good state", ServiceName),
                        Details      = string.Format("The status of the instance {0} in cloud service {1} is {2}. Addtional information on the instance statuses :  {3}", instanceName, ServiceName, instanceStatus, extendedStatus),
                        AlertName    = string.Format("Cloud service {0} not in good state", ServiceName), //ensure uniqueness in Alert name as that is being used incident key in pagerduty.
                        Component    = "CloudService",
                        Level        = "Error"
                    }.ExecuteCommand();
                }
            }
            if ((roleInstanceCount - unReadyInstanceCount) < 2)
            {
                string unReadyReport = string.Join(",", unReadyInstanceStatus.ToArray());
                new SendAlertMailTask
                {
                    AlertSubject = string.Format("Multiple instances in Cloud service {0} not in good state", ServiceName),
                    Details      = string.Format("Multiple instances in service '{0}' not in good state. The list of instance names and statuses are as follows : {1}", ServiceName, unReadyReport),
                    AlertName    = string.Format("Multiple instances in Cloud service {0} not in good state", ServiceName),  //ensure uniqueness in Alert name as that is being used incident key in pagerduty.
                    Component    = "CloudService " + ServiceName,
                    Level        = "Error"
                }.ExecuteCommand();
            }

            JArray reportObject = ReportHelpers.GetJson(instanceStatuses);

            ReportHelpers.CreateBlob(StorageAccount, ServiceName + "InstanceStatus.json", ContainerName, "application/json", ReportHelpers.ToStream(reportObject));
        }
        public override void ExecuteCommand()
        {
            AlertThresholds thresholds = new JavaScriptSerializer().Deserialize <AlertThresholds>(ReportHelpers.Load(StorageAccount, "Configuration.AlertThresholds.json", ContainerName));

            List <ElmahError> listOfErrors   = new List <ElmahError>();
            RefreshElmahError RefreshExecute = new RefreshElmahError(StorageAccount, ContainerName, LastNHours, ElmahAccountCredentials);

            listOfErrors = RefreshExecute.ExecuteRefresh();

            foreach (ElmahError error in listOfErrors)
            {
                if (error.Severity == 0)
                {
                    if (error.Occurecnes > thresholds.ElmahCriticalErrorPerHourAlertErrorThreshold && LastNHours == 1)
                    {
                        new SendAlertMailTask
                        {
                            AlertSubject = string.Format("Error: Elmah Error Alert activated for {0}", error.Error),
                            Details      = String.Format("Number of {0} exceeded Error threshold limit during the last hour.Threshold error count per hour : {1}, Events recorded in the last hour: {2}", error.Error, thresholds.ElmahCriticalErrorPerHourAlertErrorThreshold, error.Occurecnes.ToString()),
                            AlertName    = string.Format("Error: Elmah Error Alert for {0}", error.Error),
                            Component    = "Web Server",
                            Level        = "Error"
                        }.ExecuteCommand();
                    }
                    else if (error.Occurecnes > thresholds.ElmahCriticalErrorPerHourAlertWarningThreshold && LastNHours == 1)
                    {
                        new SendAlertMailTask
                        {
                            AlertSubject = string.Format("Warning: Elmah Error Alert activated for {0}", error.Error),
                            Details      = String.Format("Number of {0} exceeded Warning threshold limit during the last hour.Threshold error count per hour : {1}, Events recorded in the last hour: {2}", error.Error, thresholds.ElmahCriticalErrorPerHourAlertWarningThreshold, error.Occurecnes.ToString()),
                            AlertName    = string.Format("Warning: Elmah Error Alert for {0}", error.Error),
                            Component    = "Web Server",
                            Level        = "Warning"
                        }.ExecuteCommand();
                    }
                }
            }

            var json = new JavaScriptSerializer().Serialize(listOfErrors);

            ReportHelpers.CreateBlob(StorageAccount, "ElmahErrorsDetailed" + LastNHours.ToString() + "hours.json", ContainerName, "application/json", ReportHelpers.ToStream(json));
        }
Example #6
0
        public override void ExecuteCommand()
        {
            sqlQueryForDbAge = string.Format("select create_date from sys.databases where name = '{0}'", DbName);
            thresholdValues  = new JavaScriptSerializer().Deserialize <AlertThresholds>(ReportHelpers.Load(StorageAccount, "Configuration.AlertThresholds.json", ContainerName));
            List <Tuple <string, string> > jobOutputs = new List <Tuple <string, string> >();

            jobOutputs.Add(new Tuple <string, string>("SyncPackagesToFailoverDC", CheckLagBetweenDBAndBlob()));
            jobOutputs.Add(new Tuple <string, string>("ImportCompletionStatus", CheckForInCompleteDBImport()));
            JArray reportObject = ReportHelpers.GetJson(jobOutputs);

            ReportHelpers.CreateBlob(StorageAccount, "RunBackgroundCheckForFailoverDCReport.json", ContainerName, "application/json", ReportHelpers.ToStream(reportObject));
        }
        private void CreateDepolymentIdReport(XmlDocument doc)
        {
            XmlNodeList depolymentIdNode = doc.GetElementsByTagName("PrivateID", "http://schemas.microsoft.com/windowsazure");
            string      depolyId         = depolymentIdNode[0].InnerText;
            var         json             = new JavaScriptSerializer().Serialize(depolyId);

            ReportHelpers.CreateBlob(StorageAccount, "DeploymentId_" + ServiceName + ".json", ContainerName, "application/json", ReportHelpers.ToStream(json));
        }
        private void CreatereportForSupportRequestSummary()
        {
            List <Tuple <string, string> > summary = new List <Tuple <string, string> >();

            summary.Add(new Tuple <string, string>("No. of open requests ", GetWorkItemsForLastNDays("30").ToString()));
            summary.Add(new Tuple <string, string>("No. of requests in last 7 days", GetWorkItemsForLastNDays("7").ToString()));
            summary.Add(new Tuple <string, string>("Average reslution time for last 7 days", GetResolutionRateForLastNDays("7").ToString()));
            summary.Add(new Tuple <string, string>("No. of requests in last 30 days", GetWorkItemsForLastNDays("30").ToString()));
            summary.Add(new Tuple <string, string>("Average reslution time for last 30 days", GetResolutionRateForLastNDays("30").ToString()));
            JArray reportObject = ReportHelpers.GetJson(summary);

            ReportHelpers.CreateBlob(StorageAccount, "SupportRequestSummaryReport.json", "dashboard", "application/json", ReportHelpers.ToStream(reportObject));
        }
Example #9
0
        public override void ExecuteCommand()
        {
            StopWatches timer      = new StopWatches();
            DateTime    today      = DateTime.Today;
            string      day        = string.Format("{0:yyyy-MM-dd}", today);
            string      version    = string.Empty;
            string      file       = Path.Combine(Environment.CurrentDirectory, TestPackageName + ".nupkg");
            string      newPackage = GetNewPackage(file, out version);

            //upload
            Console.WriteLine("Pushing :{0}", newPackage);
            long UploadTimeElapsed = UploadPackage(timer, newPackage, Source, ApiKey);

            ReportHelpers.AppendDatatoBlob(StorageAccount, ("UploadPackageTimeElapsed" + day + ".json"), new Tuple <string, string>(string.Format("{0:HH:mm}", DateTime.Now), UploadTimeElapsed.ToString()), 48, ContainerName);
            File.Delete("backup");

            //download
            long          DownloadTimeElapsed = -1;
            Task <string> result = null;

            result = DownloadPackageFromFeed(timer, TestPackageName, version, out DownloadTimeElapsed);
            Console.WriteLine(result.Status);
            DownloadTimeElapsed = timer.DownloadTimeElapsed.ElapsedMilliseconds;
            ReportHelpers.AppendDatatoBlob(StorageAccount, ("DownloadPackageTimeElapsed" + day + ".json"), new Tuple <string, string>(string.Format("{0:HH:mm}", DateTime.Now), DownloadTimeElapsed.ToString()), 48, ContainerName);

            //search
            long SearchTimeElapsed = -1;

            //SearchPackage is called until the uploaded package is seen in the search result
            while (SearchTimeElapsed == -1)
            {
                SearchTimeElapsed = SearchPackage(timer, TestPackageName, version);
            }

            ReportHelpers.AppendDatatoBlob(StorageAccount, ("SearchPackageTimeElapsed" + day + ".json"), new Tuple <string, string>(string.Format("{0:HH:mm}", DateTime.Now), SearchTimeElapsed.ToString()), 48, ContainerName);

            //catalog lag
            JToken timeStampCatalog;
            int    CatalogLag = DBToCatalogLag(timer, TestPackageName, out timeStampCatalog);

            ReportHelpers.AppendDatatoBlob(StorageAccount, ("CatalogLag" + day + ".json"), new Tuple <string, string>(string.Format("{0:HH:mm}", DateTime.Now), CatalogLag.ToString()), 48, ContainerName);
            ReportHelpers.CreateBlob(StorageAccount, ("LastCatalogTimeStamp.json"), ContainerName, "SqlDateTime", ReportHelpers.ToStream(timeStampCatalog));

            //resolver lag
            JToken timeStampResolver;
            double ResolverLag = CatalogToResolverLag(out timeStampResolver);

            ReportHelpers.AppendDatatoBlob(StorageAccount, ("ResolverLag" + day + ".json"), new Tuple <string, string>(string.Format("{0:HH:mm}", DateTime.Now), ResolverLag.ToString()), 48, ContainerName);
            ReportHelpers.CreateBlob(StorageAccount, ("LastResolverTimeStamp.json"), ContainerName, "SqlDateTime", ReportHelpers.ToStream(timeStampResolver));
            SendAlerts(UploadTimeElapsed, DownloadTimeElapsed, SearchTimeElapsed, CatalogLag, ResolverLag);
        }
        public override void ExecuteCommand()
        {
            NetworkCredential nc      = new NetworkCredential(UserName, Password);
            WebRequest        request = WebRequest.Create("https://api.pingdom.com/api/2.0/checks");

            request.Credentials = nc;
            request.Headers.Add(AppKey);
            request.PreAuthenticate = true;
            request.Method          = "GET";
            WebResponse respose = request.GetResponse();

            using (var reader = new StreamReader(respose.GetResponseStream()))
            {
                JavaScriptSerializer js = new JavaScriptSerializer();
                var objects             = js.Deserialize <dynamic>(reader.ReadToEnd());
                foreach (var o in objects["checks"])
                {
                    List <Tuple <string, string> > summary = GetCheckSummaryAvgForSpecifiedTimeSpan(o["id"]);
                    JArray reportObject = ReportHelpers.GetJson(summary);
                    string checkAlias   = o["name"].ToString();
                    checkAlias = checkAlias.Replace(" ", ".");
                    checkAlias = checkAlias.Replace("(", "").Replace(")", "");
                    ReportHelpers.CreateBlob(StorageAccount, checkAlias + Frequency + "Report.json", ContainerName, "application/json", ReportHelpers.ToStream(reportObject));
                }
            }
        }
        public override void ExecuteCommand()
        {
            X509Certificate cert    = X509Certificate.CreateFromCertFile(CertificateName);
            HttpWebRequest  request = (HttpWebRequest)WebRequest.Create(string.Format("https://management.core.windows.net/{0}/services/WATM/profiles/{1}/definitions", SubscriptionId, ProfileName));

            request.ClientCertificates.Add(cert);
            request.Headers.Add("x-ms-version: 2014-02-01");
            request.PreAuthenticate = true;
            request.Method          = "GET";
            WebResponse respose = request.GetResponse();

            //Schema of the response would be as specified in http://msdn.microsoft.com/en-us/library/azure/hh758251.aspx
            Console.WriteLine(respose);
            using (var reader = new StreamReader(respose.GetResponseStream()))
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(reader.ReadToEnd());
                XmlNodeList parentNode = doc.GetElementsByTagName("Endpoint", "http://schemas.microsoft.com/windowsazure");
                List <Tuple <string, string> > endpointValues = new List <Tuple <string, string> >();
                foreach (XmlNode node in parentNode)
                {
                    string endpointName   = node.ChildNodes[0].InnerText;
                    string endpointStatus = node.ChildNodes[3].InnerText;
                    Console.WriteLine(string.Format("End point name {0}, status {1}", endpointName, endpointStatus));
                    endpointValues.Add(new Tuple <string, string>(endpointName, endpointStatus));
                    if (!endpointStatus.Equals("Online", StringComparison.OrdinalIgnoreCase))
                    {
                        new SendAlertMailTask
                        {
                            AlertSubject = string.Format("Error: Traffic manager endpoint alert activated for {0}", endpointName),
                            Details      = string.Format("The status of the endpoint {0} monitoring by traffic manager {1} is {2}", endpointName, ProfileName, endpointStatus),
                            AlertName    = "Error: Alert for TrafficManagerEndpoint",
                            Component    = "TrafficManager",
                            Level        = "Error"
                        }.ExecuteCommand();
                    }
                }
                JArray reportObject = ReportHelpers.GetJson(endpointValues);
                ReportHelpers.CreateBlob(StorageAccount, "TrafficManagerStatus.json", ContainerName, "application/json", ReportHelpers.ToStream(reportObject));
            }
        }
        private void CreateReportForOperationTask()
        {
            DateTime date = DateTime.UtcNow.AddDays(-LastNDays);

            string[] agentVersion = new JavaScriptSerializer().Deserialize <string[]>(ReportHelpers.Load(StorageAccount, "agentVersion.json", ContainerName));
            string[] Operation    = new JavaScriptSerializer().Deserialize <string[]>(ReportHelpers.Load(StorageAccount, "OperationType.json", ContainerName));


            using (var sqlConnection = new SqlConnection(ConnectionString.ConnectionString))
            {
                using (var dbExecutor = new SqlExecutor(sqlConnection))
                {
                    sqlConnection.Open();

                    foreach (string opt in Operation)
                    {
                        List <agentRequest> result = new List <agentRequest>();
                        foreach (string version in agentVersion)
                        {
                            string major = version[0].ToString();
                            string minor = version[2].ToString();
                            try
                            {
                                var requests = dbExecutor.Query <Int32>(string.Format(sqlQueryForOperation, major, minor, opt, date.ToString("yyyy-MM-dd"))).SingleOrDefault();
                                result.Add(new agentRequest(version, requests));
                            }

                            catch
                            {
                                result.Add(new agentRequest(version, 0));
                            }
                        }


                        var json = new JavaScriptSerializer().Serialize(result);
                        ReportHelpers.CreateBlob(StorageAccount, opt + LastNDays.ToString() + "Day.json", ContainerName, "application/json", ReportHelpers.ToStream(json));
                    }
                }
            }
        }
        private void CreateRestoreReportForVSTask()
        {
            string[] VsQuery = new JavaScriptSerializer().Deserialize <string[]>(ReportHelpers.Load(StorageAccount, "VsVersion.json", ContainerName));
            using (var sqlConnection = new SqlConnection(ConnectionString.ConnectionString))
            {
                using (var dbExecutor = new SqlExecutor(sqlConnection))
                {
                    sqlConnection.Open();
                    DateTime         date     = DateTime.UtcNow.AddDays(-LastNDays);
                    List <VsRequest> requests = new List <VsRequest>();
                    foreach (string each in VsQuery)
                    {
                        try
                        {
                            var request = dbExecutor.Query <Int32>(string.Format(sqlQueryForVSRestore, date.ToString("yyyy-MM-dd"), each)).SingleOrDefault();
                            requests.Add(new VsRequest("VS" + each, request.ToString()));
                        }

                        catch
                        {
                            requests.Add(new VsRequest("VS" + each, "0"));
                        }
                    }
                    var json = new JavaScriptSerializer().Serialize(requests);
                    ReportHelpers.CreateBlob(StorageAccount, "VsRestoreTrend" + LastNDays.ToString() + "Day.json", ContainerName, "application/json", ReportHelpers.ToStream(json));
                }
            }
        }
        private void CreateReportForDBCPUUsage()
        {
            List <Tuple <string, string> > usageDataPoints = new List <Tuple <string, string> >();
            var masterConnectionString = Util.GetMasterConnectionString(ConnectionString.ConnectionString);
            var currentDbName          = Util.GetDbName(ConnectionString.ConnectionString);

            using (var sqlConnection = new SqlConnection(masterConnectionString))
            {
                using (var dbExecutor = new SqlExecutor(sqlConnection))
                {
                    sqlConnection.Open();

                    List <DateTime> lastNTimeEntries = dbExecutor.Query <DateTime>(string.Format("select distinct Top(5) time from sys.resource_usage where database_name = '{0}' order by time desc", currentDbName.ToString())).ToList();
                    foreach (DateTime time in lastNTimeEntries)
                    {
                        Console.WriteLine("Time ..................." + time.ToString());
                        var usageSeconds = dbExecutor.Query <Int32>(string.Format("select Sum(usage_in_seconds) from sys.resource_usage where time = '{0}' AND database_name = '{1}'", time.ToString(), currentDbName)).SingleOrDefault();
                        usageDataPoints.Add(new Tuple <string, string>(String.Format("{0:HH:mm}", time.ToLocalTime()), usageSeconds.ToString()));
                    }
                }
                usageDataPoints.Reverse(); //reverse it as the array returned will have latest hour as first entry.
                JArray reportObject = ReportHelpers.GetJson(usageDataPoints);
                ReportHelpers.CreateBlob(StorageAccount, "DBCPUTime" + string.Format("{0:MMdd}", DateTime.Now) + ".json", ContainerName, "application/json", ReportHelpers.ToStream(reportObject));
            }
        }
 private void CreateReportForIndexFragmentation()
 {
     using (var sqlConnection = new SqlConnection(ConnectionString.ConnectionString))
     {
         using (var dbExecutor = new SqlExecutor(sqlConnection))
         {
             sqlConnection.Open();
             AlertThresholds thresholdValues      = new JavaScriptSerializer().Deserialize <AlertThresholds>(ReportHelpers.Load(StorageAccount, "Configuration.AlertThresholds.json", ContainerName));
             var             fragmentationDetails = dbExecutor.Query <DatabaseIndex>(string.Format(sqlQueryForIndexFragmentation, thresholdValues.DatabaseIndexFragmentationPercentErrorThreshold));
             var             json = new JavaScriptSerializer().Serialize(fragmentationDetails);
             ReportHelpers.CreateBlob(StorageAccount, "DBIndexFragmentation.json", ContainerName, "application/json", ReportHelpers.ToStream(json));
         }
     }
 }
        private void CreateReportForDataBaseEvents()
        {
            var masterConnectionString = Util.GetMasterConnectionString(ConnectionString.ConnectionString);
            var currentDbName          = Util.GetDbName(ConnectionString.ConnectionString);

            using (var sqlConnection = new SqlConnection(masterConnectionString))
            {
                using (var dbExecutor = new SqlExecutor(sqlConnection))
                {
                    sqlConnection.Open();

                    var usageSeconds = dbExecutor.Query <DatabaseEvent>(string.Format("select start_time, end_time,event_type,event_count,description from sys.event_log where start_time>='{0}' and start_time<='{1}' and database_name = '{2}' and severity = 2", DateTime.UtcNow.AddHours(-LastNHours).ToString("yyyy-MM-dd hh:mm:ss"), DateTime.UtcNow.ToString("yyyy-MM-dd hh:mm:ss"), currentDbName));
                    var json         = new JavaScriptSerializer().Serialize(usageSeconds);
                    ReportHelpers.CreateBlob(StorageAccount, "DBDetailed" + LastNHours.ToString() + "Hour.json", ContainerName, "application/json", ReportHelpers.ToStream(json));

                    var             throttlingEventCount = dbExecutor.Query <Int32>(string.Format("select count(*) from sys.event_log where start_time>='{0}' and start_time<='{1}' and database_name = '{2}' and (event_type Like 'throttling%' or event_type Like 'deadlock')", DateTime.UtcNow.AddHours(-1).ToString("yyyy-MM-dd hh:mm:ss"), DateTime.UtcNow.ToString("yyyy-MM-dd hh:mm:ss"), currentDbName)).SingleOrDefault();
                    var             additional_data      = dbExecutor.Query <string>(string.Format("select additional_data from sys.event_log where start_time>='{0}' and start_time<='{1}' and database_name = '{2}' and (event_type Like 'throttling%' or event_type Like 'deadlock')", DateTime.UtcNow.AddHours(-1).ToString("yyyy-MM-dd hh:mm:ss"), DateTime.UtcNow.ToString("yyyy-MM-dd hh:mm:ss"), currentDbName));
                    AlertThresholds thresholdValues      = new JavaScriptSerializer().Deserialize <AlertThresholds>(ReportHelpers.Load(StorageAccount, "Configuration.AlertThresholds.json", ContainerName));

                    StringBuilder sb = new StringBuilder();
                    foreach (string data in additional_data)
                    {
                        if (data != null)
                        {
                            sb.Append(data + "\n");
                        }
                    }
                    if (throttlingEventCount > thresholdValues.DatabaseThrottlingEventErrorThreshold && LastNHours == 1)
                    {
                        new SendAlertMailTask
                        {
                            AlertSubject = "Error: SQL Azure DB alert activated for throttling/deadlock event",
                            Details      = string.Format("Number of events exceeded threshold for DB throttling/deadlock events. Error Threshold count : {0}, events noticed in last hour : {1}, all additional data is {2}", thresholdValues.DatabaseThrottlingEventErrorThreshold, throttlingEventCount, sb.ToString()),
                            AlertName    = "Error: SQL Azure DB throttling/deadlock event",
                            Component    = "SQL Azure Database",
                            Level        = "Error"
                        }.ExecuteCommand();
                    }
                    else if (throttlingEventCount > thresholdValues.DatabaseThrottlingEventWarningThreshold && LastNHours == 1)
                    {
                        new SendAlertMailTask
                        {
                            AlertSubject = "Warning: SQL Azure DB alert activated for throttling/deadlock event",
                            Details      = string.Format("Number of events exceeded threshold for DB throttling/deadlock events. Warning Threshold count : {0}, events noticed in last hour : {1}, all additional data is {2}", thresholdValues.DatabaseThrottlingEventWarningThreshold, throttlingEventCount, sb.ToString()),
                            AlertName    = "Warning: SQL Azure DB throttling/deadlock event",
                            Component    = "SQL Azure Database",
                            Level        = "Warning"
                        }.ExecuteCommand();
                    }
                }
            }
        }
Example #17
0
        public override void ExecuteCommand()
        {
            int lastNhour = 24;
            List <WorkInstanceDetail>     jobDetail       = new List <WorkInstanceDetail>();
            List <WorkJobInstanceDetails> instanceDetails = getWorkjobInstance();

            foreach (WorkJobInstanceDetails job in instanceDetails)
            {
                int    invocationCount = 0;
                double totalRunTime    = 0;
                int    faultCount      = 0;
                int    faultRate       = 0;
                int    runtime         = 0;
                Dictionary <string, List <string> > ErrorList = new Dictionary <string, List <string> >();
                string AdminKey = WorkServiceAdminKey;

                if (job.url.Contains("api-work-1"))
                {
                    AdminKey = WorkServiceFailoverAdminKey;
                }
                NetworkCredential nc      = new NetworkCredential(WorkServiceUserName, AdminKey);
                WebRequest        request = WebRequest.Create(string.Format("{0}/instances/{1}?limit={2}", job.url, job.JobInstanceName, (lastNhour * 60) / job.FrequencyInMinutes));
                request.Credentials     = nc;
                request.PreAuthenticate = true;
                request.Method          = "GET";
                WebResponse respose = request.GetResponse();
                using (var reader = new StreamReader(respose.GetResponseStream()))
                {
                    JavaScriptSerializer js = new JavaScriptSerializer();
                    js.MaxJsonLength = Int32.MaxValue;
                    var objects = js.Deserialize <List <WorkJobInvocation> >(reader.ReadToEnd());
                    WorkJobInvocation lastJob;
                    string            lastCompleted = string.Empty;
                    if (objects.Any((item => item.status.Equals("Executed") && item.result.Equals("Completed"))))
                    {
                        lastJob = objects.Where(item => item.status.Equals("Executed") && item.result.Equals("Completed")).ToList().FirstOrDefault();
                    }
                    else
                    {
                        lastJob = objects.FirstOrDefault();
                    }

                    if (lastJob != null)
                    {
                        lastCompleted = string.Format("{0} mins ago", Convert.ToInt32(DateTime.Now.Subtract(lastJob.completedAt).TotalMinutes));
                    }
                    else
                    {
                        lastCompleted = "N/A";
                    }

                    foreach (WorkJobInvocation each in objects)
                    {
                        if (each.completedAt >= DateTime.Now.AddHours(-lastNhour))
                        {
                            invocationCount++;
                            totalRunTime += each.completedAt.Subtract(each.queuedAt).TotalSeconds;
                            if (each.result.Equals("Faulted"))
                            {
                                faultCount++;
                                string message = getResultMessage(each.resultMessage);
                                if (ErrorList.ContainsKey(message))
                                {
                                    if (ErrorList[message].Count < 5)
                                    {
                                        ErrorList[message].Add(each.logUrl);
                                    }
                                }

                                else
                                {
                                    List <string> LogUrl = new List <string>();
                                    LogUrl.Add(each.logUrl);
                                    ErrorList.Add(message, LogUrl);
                                }
                            }
                        }
                    }
                    if (invocationCount != 0)
                    {
                        faultRate = (faultCount * 100 / invocationCount);
                        runtime   = ((int)(totalRunTime / invocationCount));
                    }
                    jobDetail.Add(new WorkInstanceDetail(job.JobInstanceName, job.FrequencyInMinutes + "mins", lastCompleted, runtime.ToString() + "s", invocationCount.ToString(), faultCount.ToString(), faultRate, ErrorList));
                }
            }

            List <WorkServiceAdmin> allkey = new List <WorkServiceAdmin>();

            allkey.Add(new WorkServiceAdmin(WorkServiceUserName, WorkServiceAdminKey));
            allkey.Add(new WorkServiceAdmin(WorkServiceUserName, WorkServiceFailoverAdminKey));

            var json = new JavaScriptSerializer().Serialize(jobDetail);
            var key  = new JavaScriptSerializer().Serialize(allkey);

            ReportHelpers.CreateBlob(StorageAccount, string.Format("WorkJobDetail{0:MMdd}.json", DateTime.Now), ContainerName, "application/json", ReportHelpers.ToStream(json));
        }
        private void GetDetailedReportForCheck(string checkAlias)
        {
            DateTime startingTime = DateTime.Now.AddHours(DateTime.Now.Hour * -1).AddDays(NoOfDays * -1); //get the midnight time for today to create separate report for each day.

            for (int j = 0; j <= NoOfDays; j++)
            {
                int i = 0;
                List <Tuple <string, string> > summaryValues = new List <Tuple <string, string> >();
                while (i <= 23) //get th values for each hour. TBD : For today, there may not be values for all 24 hours and they are being filled as zero.Need to fix it.
                {
                    long fromTime = 0;
                    long toTime   = 0;

                    fromTime = UnixTimeStampUtility.GetUnixTimestampSeconds(startingTime.ToUniversalTime());
                    toTime   = UnixTimeStampUtility.GetUnixTimestampSeconds(startingTime.AddHours(1).ToUniversalTime());

                    NetworkCredential nc      = new NetworkCredential(UserName, Password);
                    WebRequest        request = WebRequest.Create(string.Format("https://api.pingdom.com/api/2.0/summary.average/{0}?from={1}&to={2}", CheckId, fromTime, toTime));
                    request.Credentials = nc;
                    request.Headers.Add(AppKey);
                    request.PreAuthenticate = true;
                    request.Method          = "GET";
                    WebResponse respose = request.GetResponse();
                    using (var reader = new StreamReader(respose.GetResponseStream()))
                    {
                        JavaScriptSerializer js = new JavaScriptSerializer();
                        var summaryObject       = js.Deserialize <dynamic>(reader.ReadToEnd());
                        foreach (var summary in summaryObject["summary"])
                        {
                            foreach (var status in summary.Value)
                            {
                                //Get the average response time and store it to the JSON object.
                                if (status.Key == "avgresponse")
                                {
                                    summaryValues.Add(new Tuple <string, string>(String.Format("{0:HH:mm}", UnixTimeStampUtility.DateTimeFromUnixTimestampSeconds(fromTime).ToLocalTime()), status.Value.ToString()));
                                }
                            }
                        }
                    }
                    i++;
                    startingTime = startingTime.AddHours(1);
                }
                JArray reportObject = ReportHelpers.GetJson(summaryValues);
                ReportHelpers.CreateBlob(StorageAccount, checkAlias + string.Format("{0:MMdd}", startingTime.AddHours(-1)) + "DetailedReport.json", ContainerName, "application/json", ReportHelpers.ToStream(reportObject));
            }
        }
Example #19
0
        public override void ExecuteCommand()
        {
            thresholdValues = new JavaScriptSerializer().Deserialize <AlertThresholds>(ReportHelpers.Load(StorageAccount, "Configuration.AlertThresholds.json", ContainerName));
            List <Tuple <string, string> > jobOutputs = new List <Tuple <string, string> >();

            jobOutputs.Add(new Tuple <string, string>("PackageStatics", CheckoutForPackageStatics()));
            //jobOutputs.Add(new Tuple<string, string>("PurgePackageStatistics", CheckForPurgePackagStatisticsJob()));
            jobOutputs.Add(new Tuple <string, string>("HandleQueuedPackageEdits", CheckForHandleQueuedPackageEditJob()));
            // jobOutputs.Add(new Tuple<string, string>("BackupPackages", CheckForBackupPackagesJob())); commenting out this check temporarily as ListBlobs on ng-backups container is giving error.
            JArray reportObject = ReportHelpers.GetJson(jobOutputs);

            ReportHelpers.CreateBlob(StorageAccount, "RunBackGroundChecksForWorkerJobsReport.json", ContainerName, "application/json", ReportHelpers.ToStream(reportObject));
        }
        private void CreateWeeklyStatReportFor(string connectionString, string sqlQuery, string reportName)
        {
            startingTime = new DateTime(Year, UnixTimeStampUtility.GetMonthNumber(Month), 01); //initialize to day 01 of the given month.
            DateTime monthEndTime = new DateTime(Year, UnixTimeStampUtility.GetMonthNumber(Month), UnixTimeStampUtility.GetDaysInMonth(Month));
            List <Tuple <string, string> > uploadsDataPoints = new List <Tuple <string, string> >();
            int week = 1;

            using (var sqlConnection = new SqlConnection(connectionString))
            {
                using (var dbExecutor = new SqlExecutor(sqlConnection))
                {
                    sqlConnection.Open();

                    while (startingTime <= monthEndTime)
                    {
                        DateTime endTime = startingTime.AddDays(7);
                        if (endTime > monthEndTime)
                        {
                            endTime = monthEndTime;
                        }
                        try
                        {
                            var count = dbExecutor.Query <Int32>(string.Format(sqlQuery, startingTime.ToString("yyyy-MM-dd"), endTime.ToString("yyyy-MM-dd"))).SingleOrDefault();
                            uploadsDataPoints.Add(new Tuple <string, string>("Week" + week++, count.ToString()));
                        }
                        catch (NullReferenceException)
                        {
                            uploadsDataPoints.Add(new Tuple <string, string>("Week" + week++, "0"));
                        }

                        startingTime = startingTime.AddDays(7);
                    }
                }
            }
            JArray reportObject = ReportHelpers.GetJson(uploadsDataPoints);

            ReportHelpers.CreateBlob(ReportStorage, reportName + Month + "MonthlyReport.json", "dashboard", "application/json", ReportHelpers.ToStream(reportObject));
        }
Example #21
0
        public override void ExecuteCommand()
        {
            int lastNhour = 24;
            List <WorkInstanceDetail>     jobDetail       = new List <WorkInstanceDetail>();
            List <WorkJobInstanceDetails> instanceDetails = getWorkjobInstance();

            foreach (WorkJobInstanceDetails job in instanceDetails)
            {
                int    invocationCount = 0;
                double totalRunTime    = 0;
                int    faultCount      = 0;
                int    faultRate       = 0;
                int    runtime         = 0;
                Dictionary <string, List <string> > ErrorList = new Dictionary <string, List <string> >();
                string AdminKey = WorkServiceAdminKey;

                if (job.url.Contains("api-work-1"))
                {
                    AdminKey = WorkServiceFailoverAdminKey;
                }
                NetworkCredential nc = new NetworkCredential(WorkServiceUserName, AdminKey);
                //get all invocations in last 24 hours or last 10 invocations
                int no = (lastNhour * 60) / job.FrequencyInMinutes;
                if (no < 10)
                {
                    no = 10;
                }
                WebRequest request = WebRequest.Create(string.Format("{0}/instances/{1}?limit={2}", job.url, job.JobInstanceName, no));
                request.Credentials     = nc;
                request.PreAuthenticate = true;
                request.Method          = "GET";
                WebResponse respose = request.GetResponse();
                using (var reader = new StreamReader(respose.GetResponseStream()))
                {
                    JavaScriptSerializer js = new JavaScriptSerializer();
                    js.MaxJsonLength = Int32.MaxValue;
                    var objects = js.Deserialize <List <WorkJobInvocation> >(reader.ReadToEnd());
                    WorkJobInvocation lastJob;
                    bool   alert         = false;
                    string lastCompleted = string.Empty;
                    if (objects.Any((item => item.status.Equals("Executed") && item.result.Equals("Completed"))))
                    {
                        lastJob = objects.Where(item => item.status.Equals("Executed") && item.result.Equals("Completed")).ToList().FirstOrDefault();
                    }
                    else
                    {
                        lastJob = objects.FirstOrDefault();
                    }

                    if (lastJob != null)
                    {
                        lastCompleted = string.Format("{0} mins ago", Convert.ToInt32(DateTime.Now.Subtract(lastJob.completedAt).TotalMinutes));
                    }
                    else
                    {
                        lastCompleted = "N/A";
                    }

                    foreach (WorkJobInvocation each in objects)
                    {
                        if (each.result.Equals("Incomplete", StringComparison.OrdinalIgnoreCase))
                        {
                            continue;
                        }
                        if (each.completedAt >= DateTime.Now.AddHours(-1))
                        {
                            alert = true;                                                // check there is any failure happened in last one hour
                        }
                        invocationCount++;
                        totalRunTime += each.completedAt.Subtract(each.queuedAt).TotalSeconds;
                        if (each.result.Equals("Faulted"))
                        {
                            faultCount++;
                            string message = getResultMessage(each.resultMessage);
                            if (ErrorList.ContainsKey(message))
                            {
                                if (ErrorList[message].Count < 5)
                                {
                                    ErrorList[message].Add(each.logUrl);
                                }
                            }

                            else
                            {
                                List <string> LogUrl = new List <string>();
                                LogUrl.Add(each.logUrl);
                                ErrorList.Add(message, LogUrl);
                            }
                        }
                    }
                    if (invocationCount != 0)
                    {
                        faultRate = (faultCount * 100 / invocationCount);
                        runtime   = ((int)(totalRunTime / invocationCount));
                    }
                    jobDetail.Add(new WorkInstanceDetail(job.JobInstanceName, job.FrequencyInMinutes + "mins", lastCompleted, runtime.ToString() + "s", invocationCount.ToString(), faultCount.ToString(), faultRate, ErrorList));
                    AlertThresholds thresholdValues = new JavaScriptSerializer().Deserialize <AlertThresholds>(ReportHelpers.Load(StorageAccount, "Configuration.AlertThresholds.json", ContainerName));
                    string[]        Igonored        = new JavaScriptSerializer().Deserialize <string[]>(ReportHelpers.Load(StorageAccount, "Configuration.WorkerJobToBeIgnored.json", ContainerName));
                    if (Igonored.Contains(job.JobInstanceName, StringComparer.OrdinalIgnoreCase))
                    {
                        continue;
                    }
                    if (faultRate > thresholdValues.WorkJobErrorThreshold && alert)
                    {
                        new SendAlertMailTask
                        {
                            AlertSubject = string.Format("Error: Alert for Nuget Work Service : {0} failure", job.JobInstanceName),
                            Details      = string.Format("Rate of failure exceeded Error threshold for {0}. Threshold count : {1}%, failure in last 24 hour : {2}", job.JobInstanceName, thresholdValues.WorkJobErrorThreshold, faultCount),
                            AlertName    = string.Format("Error: Nuget Work Service {0}", job.JobInstanceName),
                            Component    = "Nuget Work Service",
                            Level        = "Error"
                        }.ExecuteCommand();
                    }
                    else if (faultRate > thresholdValues.WorkJobWarningThreshold && alert)
                    {
                        new SendAlertMailTask
                        {
                            AlertSubject = string.Format("Warning: Alert for Nuget Work Service: {0} failure", job.JobInstanceName),
                            Details      = string.Format("Rate of failure exceeded Warning threshold for {0}. Threshold count : {1}%, failure in last 24 hour : {2}", job.JobInstanceName, thresholdValues.WorkJobWarningThreshold, faultCount),
                            AlertName    = string.Format("Warning: Nuget Work Service {0}", job.JobInstanceName),
                            Component    = "Nuget Work Service",
                            Level        = "Warning"
                        }.ExecuteCommand();
                    }
                }
                //check to make sure that the jobs that are not queued as part of scheduler are being invoked properly
                if (invocationCount < ((lastNhour * 60 / job.FrequencyInMinutes) / 2))
                {
                    new SendAlertMailTask
                    {
                        AlertSubject = string.Format("Error: Alert for Nuget Work Service : {0} failure", job.JobInstanceName),
                        Details      = string.Format("In last 24 hours, invocation of {0} is only {1}, it's less than half of scheduled jobs", job.JobInstanceName, invocationCount),
                        AlertName    = string.Format("Error: Nuget Work Service {0}", job.JobInstanceName),
                        Component    = "Nuget Work Service",
                        Level        = "Error"
                    }.ExecuteCommand();
                }
            }

            List <WorkServiceAdmin> allkey = new List <WorkServiceAdmin>();

            allkey.Add(new WorkServiceAdmin(WorkServiceUserName, WorkServiceAdminKey));
            allkey.Add(new WorkServiceAdmin(WorkServiceUserName, WorkServiceFailoverAdminKey));
            var json = new JavaScriptSerializer().Serialize(jobDetail);
            var key  = new JavaScriptSerializer().Serialize(allkey);

            ReportHelpers.CreateBlob(StorageAccount, "WorkJobDetail.json", ContainerName, "application/json", ReportHelpers.ToStream(json));
            ReportHelpers.CreateBlob(StorageAccount, "WorkServiceAdminKey.json", ContainerName, "application/json", ReportHelpers.ToStream(key));
        }
        private void CreatereportForSupportRequestsByCategory()
        {
            List <Tuple <string, string> > summary = new List <Tuple <string, string> >();

            foreach (string category in supportRequestCategories)
            {
                summary.Add(new Tuple <string, string>(category, GetWorkItemsByTitle(category).ToString()));
            }

            JArray reportObject = ReportHelpers.GetJson(summary);

            ReportHelpers.CreateBlob(StorageAccount, "SupportRequestsByCategoryReport.json", "dashboard", "application/json", ReportHelpers.ToStream(reportObject));
        }