Esempio n. 1
0
        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);
        }
Esempio n. 4
0
        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);
 }
Esempio n. 11
0
 public PageBase()
 {
     connectionFactory = new HelperConnectionFactory(ConnectionHelper.Helper());
     SqlRepo           = new SqlServerRepository(connectionFactory);
     reportingService  = new BestInServiceReportingService(SqlRepo);
 }