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));
                }
            }
        }
        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));
            }
        }
        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";
            var response = request.GetResponse();

            //Schema of the response would be as specified in http://msdn.microsoft.com/en-us/library/azure/hh758251.aspx
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                var responseContent = reader.ReadToEnd();
                Console.WriteLine(responseContent);

                var responseDoc = new XmlDocument();
                responseDoc.LoadXml(responseContent);
                var endpointNodes = responseDoc.GetElementsByTagName("Endpoint", "http://schemas.microsoft.com/windowsazure");
                //Endpoint Structure
                //<Endpoint >
                //    <DomainName>    Name                </DomainName>
                //    <Status>        Enabled             </Status>
                //    <Type>          CloudService        </Type>
                //    <Location>      North Central US    </Location>
                //    <MonitorStatus> Online              </MonitorStatus>
                //    <Weight>        1                   </Weight>
                //</Endpoint>

                var endpointValues = new List <Tuple <string, string> >();
                foreach (XmlNode endpointNode in endpointNodes)
                {
                    string endpointName   = endpointNode["DomainName"].InnerText;
                    string endpointStatus = endpointNode["MonitorStatus"].InnerText;
                    Console.WriteLine(string.Format("Endpoint name {0}, status {1}", endpointName, endpointStatus));
                    endpointValues.Add(Tuple.Create(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));
            }
        }
Beispiel #4
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));
        }
Beispiel #5
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 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));
        }
        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));
        }
        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));
        }
        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));
            }
        }
        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));
        }