public QualityOfServiceViewModel GetServiceQualityIndicators() { var model = BestInServiceMapper.ToQualityOfServiceReportModel(ReportingService, RequestService.GetTimezoneOffset(this.Request)); var service = new BestInServiceReportingService(SqlRepo); model.SampleRange = new LookingGlassInformation(service.GetSampleRange(RequestService.GetTimezoneOffset(this.Request))).SampleRange; return(model); }
public EmailNotificationService(ISqlServerRepository repository, ISmtpClientFactory smtpClientFactory, IPdbConfigurationService pdbConfigurationService, IConfigurationRepository configurationRepository, IConfigurationAuditRepository configurationAuditRepository) { Database = repository; ReportingService = new BestInServiceReportingService(repository); this.configurationService = pdbConfigurationService; this.smtpClientFactory = smtpClientFactory; this.configurationRepository = configurationRepository; this.configurationAuditRepository = configurationAuditRepository; }
public SystemLoadController() { // TODO - Get rid of inheritence this.requestService = new RequestService(); var connectionFactory = new HelperConnectionFactory(ConnectionHelper.Helper()); var sqlRepo = new SqlServerRepository(connectionFactory); this.reportingService = new BestInServiceReportingService(sqlRepo); }
public ServiceQualityController() { this.connectionFactory = new HelperConnectionFactory(ConnectionHelper.Helper()); this.SqlRepo = new SqlServerRepository(connectionFactory); var toggleProvider = new PdbSqlToggleProvider(connectionFactory); var reportRepositoryFactory = new RecoverabilityIntegrityReportReaderFactory(toggleProvider, this.connectionFactory); var reportRepository = reportRepositoryFactory.Get(); this.ReportingService = new BackupDbccService(SqlRepo, reportRepository); }
protected override void OnLoad(EventArgs e) { //Auto-detect formats for date pickers based on server-side culture var dt = new DateTime(1900, 10, 20, 11, 0, 0); DateFormat = dt .ToString("d", System.Globalization.CultureInfo.CurrentCulture) .Replace("1900", "Y") .Replace("20", "d") .Replace("10", "m"); TimeFormat = dt .ToString("t", System.Globalization.CultureInfo.CurrentCulture) .Replace("11:00 AM", "g A") .Replace("11:00", "H:i"); if (!IsPostBack) { //Display an error if EDDSPerformance is missing if (!SqlRepo.PerformanceExists()) { Response.Redirect(string.Format(ErrorPageUrlFormatString, ErrorMode.General)); } //Redirect if elevated permissions are needed for script updates if (!SqlRepo.AdminScriptsInstalled()) { Response.Redirect("~/AdministrationInstall.aspx"); } // Set Timezone offset SetTimeZoneOffset(); } //Initialize the reporting service var service = new BestInServiceReportingService(SqlRepo); //If the page requires QoS data, perform additional checks if (LookingGlassDependency) { //Redirect if LookingGlass hasn't created all the data tables or hasn't run successfully if (!service.LookingGlassHasRun() && !IsPostBack) { Response.Redirect(string.Format(ErrorPageUrlFormatString, ErrorMode.ReportDataPending)); } } //Sample range information should be available for pages that don't depend on QoS data (e.g. backfill page) var range = service.GetSampleRange(RequestService.GetTimezoneOffset(this.Request)); GlassInfo = new LookingGlassInformation(range); //Invoke base method base.OnLoad(e); }
public async Task <BackfillStatus> GetBackfillStatus() { var service = new BestInServiceReportingService(this._sqlRepo); var lastLogEntryTask = _sqlRepo.LogRepository.ReadLastAsync(); var lastEventTask = _sqlRepo.EventRepository.ReadLastAsync(); var pendingEventsCountTask = _sqlRepo.EventRepository.ReadCountByStatusAsync(new List <EventStatus> { EventStatus.Pending, EventStatus.PendingHangfire }); var errorEventsCountTask = _sqlRepo.EventRepository.ReadCountByStatusAsync(EventStatus.Error); var eventSystemStateTask = _sqlRepo.EventRepository.ReadEventSystemStateAsync(); var hoursAwaitingAnalysisTask = _sqlRepo.BackfillRepository.ReadHoursAwaitingAnalysis(); var hoursAwaitingDiscoveryTask = _sqlRepo.BackfillRepository.ReadHoursAwaitingDiscovery(); var hoursAwaitingScoringTask = _sqlRepo.BackfillRepository.ReadHoursAwaitingScoring(); var hoursCompletedScoringTask = _sqlRepo.BackfillRepository.ReadHoursCompletedScoring(); await Task.WhenAll( lastLogEntryTask, lastEventTask, pendingEventsCountTask, errorEventsCountTask, eventSystemStateTask, hoursAwaitingAnalysisTask, hoursAwaitingDiscoveryTask, hoursAwaitingScoringTask, hoursCompletedScoringTask).ConfigureAwait(false); var lastLogEntry = await lastLogEntryTask; var status = new BackfillStatus() { LastMessage = string.IsNullOrEmpty(lastLogEntry?.TaskCompleted) ? "N/A" : lastLogEntry.TaskCompleted.Truncate(200), LastEventExecuted = (await lastEventTask)?.LastUpdated.ToString("s") ?? "N/A", PendingEvents = await pendingEventsCountTask, ErrorEvents = await errorEventsCountTask, SystemState = System.Enum.GetName(typeof(EventSystemState), await eventSystemStateTask), SampleRange = new LookingGlassInformation(service.GetSampleRange(RequestService.GetTimezoneOffset(this.Request))).SampleRange, HoursAwaitingAnalysis = await hoursAwaitingAnalysisTask, HoursAwaitingDiscovery = await hoursAwaitingDiscoveryTask, HoursAwaitingScoring = await hoursAwaitingScoringTask, HoursCompleted = await hoursCompletedScoringTask }; return(status); }
public static QualityOfServiceViewModel ToQualityOfServiceReportModel(BestInServiceReportingService service, int timezoneOffset) { //Retrieve header information var partner = service.GetPartnerName(); var instance = service.GetInstanceName(); //Retrieve scores var scores = service.GetQualityOfServiceScores(); //Take the lowest score for each category var userExperienceScore = scores.Min(x => x.UserExperienceScore).GetValueOrDefault(100); var weeklyUserExperienceScore = scores.Min(x => x.WeeklyUserExperienceScore).GetValueOrDefault(100); var systemLoadScore = scores.Min(x => x.SystemLoadScore).GetValueOrDefault(100); var weeklySystemLoadScore = scores.Min(x => x.WeeklySystemLoadScore).GetValueOrDefault(100); var integrityScore = scores.Min(x => x.IntegrityScore).GetValueOrDefault(100); var weeklyIntegrityScore = scores.Min(x => x.WeeklyIntegrityScore).GetValueOrDefault(100); var uptimeScore = scores.Min(x => x.UptimeScore).GetValueOrDefault(100); var weeklyUptimeScore = scores.Min(x => x.WeeklyUptimeScore).GetValueOrDefault(100); //Average the lowest category scores var overallWeeklyScore = (weeklyUserExperienceScore + weeklySystemLoadScore + weeklyIntegrityScore + weeklyUptimeScore) / 4; var overallQuarterlyScore = (userExperienceScore + systemLoadScore + integrityScore + uptimeScore) / 4; //Retrieve grid data var monitoringInfo = service.SummarizeBackupIntegrityInfo(); var worstUptime = service.ListWorstUptimeDays(timezoneOffset); var uptimePercentages = service.CalculateUptimePercentages(); //Check DBCC monitoring configuration var dbccEnabled = service.IsDBCCMonitoringEnabled(); //Construct view model var model = new QualityOfServiceViewModel { OverallScore = (int)overallQuarterlyScore, WeeklyScore = (int)overallWeeklyScore, PartnerName = partner, InstanceName = instance, BackupWindow = BackupDBCCWindow, UserExperience = new ServerDetailCategory { QuarterlyScore = (int)userExperienceScore, WeeklyScore = (int)weeklyUserExperienceScore, Servers = (from server in scores.OrderBy(x => x.UserExperienceScore).Take(10) select new ServerScore { ArtifactId = server.ServerArtifactId, Name = server.ServerName.Truncate(30), QuarterlyScore = (int)server.UserExperienceScore.GetValueOrDefault(100), WeeklyScore = (int)server.WeeklyUserExperienceScore.GetValueOrDefault(100), ServerUrl = UrlHelper.GetPageUrl(service, Names.Tab.UserExperience, "UserExperienceServer", $"Server={server.ServerArtifactId}") }) .ToList(), PageUrl = UrlHelper.GetPageUrl(service, Names.Tab.UserExperience, "UserExperienceServer") }, SystemLoad = new ServerDetailCategory { QuarterlyScore = (int)systemLoadScore, WeeklyScore = (int)weeklySystemLoadScore, Servers = (from server in scores.OrderBy(x => x.SystemLoadScore).Take(10) select new ServerScore { ArtifactId = server.ServerArtifactId, Name = server.ServerName.Truncate(30), QuarterlyScore = (int)server.SystemLoadScore.GetValueOrDefault(100), WeeklyScore = (int)server.WeeklySystemLoadScore.GetValueOrDefault(100), ServerUrl = UrlHelper.GetPageUrl(service, Names.Tab.InfrastructurePerformance, "SystemLoadServer", $"Server={server.ServerArtifactId}") }).ToList(), PageUrl = UrlHelper.GetPageUrl(service, Names.Tab.InfrastructurePerformance, "SystemLoadServer") }, Backup = new MaintenanceCategory { Score = (int)integrityScore, WeeklyScore = (int)weeklyIntegrityScore, BackupFrequencyScore = monitoringInfo.BackupFrequencyScore, DbccFrequencyScore = monitoringInfo.DbccFrequencyScore, BackupCoverageScore = monitoringInfo.BackupCoverageScore, DbccCoverageScore = monitoringInfo.DbccCoverageScore, MissedBackups = monitoringInfo.MissedBackups, MissedIntegrityChecks = monitoringInfo.MissedIntegrityChecks, RPOScore = monitoringInfo.RPOScore, RTOScore = monitoringInfo.RTOScore, MaxDataLossMinutes = monitoringInfo.MaxDataLossMinutes, TimeToRecoverHours = monitoringInfo.TimeToRecoverHours, FailedDatabases = monitoringInfo.FailedDatabases, FailedServers = monitoringInfo.FailedServers, DBCCMonitoringEnabled = dbccEnabled, PageUrl = UrlHelper.GetPageUrl(service, Names.Tab.RecoverabilityIntegrity, "Backup") }, Uptime = new AvailabilityCategory { Score = (int)uptimeScore, WeeklyScore = (int)weeklyUptimeScore, UptimePercentage = uptimePercentages.QuarterlyUptimePercent, WeeklyUptimePercentage = uptimePercentages.WeeklyUptimePercent, DatesToReview = (from day in worstUptime.OrderBy(x => x.ScoreDate).GroupBy(x => x.ScoreDate.Month) select new DateToReview { Date = day.First().ScoreDate.ToString("MMMM yyyy"), HoursDown = day.Sum(x => x.HoursDown) }).ToList(), PageUrl = UrlHelper.GetPageUrl(service, Names.Tab.Uptime, "Uptime") }, }; return(model); }
public static string GetPageUrl(BestInServiceReportingService reportingService, string tabName, string pageName, string additionalParamerters = null) { return(GetPageUrl(reportingService.GetTabArtifactId(tabName), pageName, additionalParamerters)); }
public HttpResponseMessage Scores() { var connectionFactory = new HelperConnectionFactory(ConnectionHelper.Helper()); var sqlRepo = new SqlServerRepository(connectionFactory); var svc = new BestInServiceReportingService(sqlRepo); var queryParams = this.requestService.GetQueryParamsDecoded(Request); var conditions = PopulateCommonGridConditions(queryParams); var scores = svc.GetScoreHistory(conditions.StartDate.GetValueOrDefault(), conditions.EndDate.GetValueOrDefault(), conditions.SelectedServers); var hours = scores.OrderBy(x => x.SummaryDayHour) .Select(x => x.SummaryDayHour) .Distinct(); var model = new ScoreChartViewModel { Labels = hours.Select(x => x.AddMinutes(conditions.TimezoneOffset).ToString("g")) }; var dataSets = (from score in scores group score by score.ServerArtifactId into serverScores orderby serverScores.Key select new ScoreChartDataSet { label = "Quarterly Uptime Score", data = from hour in hours select(int?) (serverScores.FirstOrDefault(x => x.SummaryDayHour.Equals(hour)) ?? new ScoreChartModel()).UptimeScore, sample = from hour in hours select(bool?) false }).ToArray(); int max = 0, min = 100; for (var i = 0; i < dataSets.Count(); i++) { var localMin = dataSets[i].data.Min(x => x.GetValueOrDefault(100)); if (localMin < min) { min = localMin; } var localMax = dataSets[i].data.Max(x => x.GetValueOrDefault(100)); if (localMax > max) { max = localMax; } var color = ChartColorExtensions.ChartColorHex(i); dataSets[i].pointColor = color; dataSets[i].strokeColor = color; } if (min > max) { min = max; } model.DataSets = dataSets.Take(1); model.MinValue = min; model.MaxValue = max; //Serialize response var json = model.ToJson(); var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"); return(response); }
public MaintenanceWindows() { _svc = new BestInServiceReportingService(this.SqlRepo); }
public PageBase() { connectionFactory = new HelperConnectionFactory(ConnectionHelper.Helper()); SqlRepo = new SqlServerRepository(connectionFactory); reportingService = new BestInServiceReportingService(SqlRepo); }