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)); } }
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)); }
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)); }