Exemple #1
0
        public async Task <IActionResult> Post([FromBody] MTMMonitorSave value)
        {
            if (string.IsNullOrEmpty(value.Name))
            {
                return(Error("Name is required."));
            }

            var monitorCheck = await Db.Monitors.AnyAsync(m => m.MonitorId != value.Id && m.Name.Equals (value.Name) && m.UserId == UserId);

            if (monitorCheck)
            {
                return(Error("This project name is already in use. Plase choose a different name."));
            }

            MTDMonitor data = null;

            if (value.Id != Guid.Empty)
            {
                data = await Db.Monitors.FirstOrDefaultAsync(m => m.MonitorId == value.Id && m.UserId == UserId);

                if (data == null)
                {
                    return(Error("Monitor not found."));
                }

                data.UpdatedDate = DateTime.UtcNow;
                data.Name        = value.Name;
            }
            else
            {
                data = new MTDMonitor {
                    MonitorId   = Guid.NewGuid(),
                    CreatedDate = DateTime.UtcNow,
                    Name        = value.Name,
                    UserId      = UserId
                };
                Db.Monitors.Add(data);
            }

            var monitorStepData = new MTDSMonitorStepSettingsRequest {
                Url = value.Url
            };

            var step = await Db.MonitorSteps.FirstOrDefaultAsync(m => m.MonitorId == data.MonitorId);

            if (step != null)
            {
                var requestSettings = step.SettingsAsRequest() ?? new MTDSMonitorStepSettingsRequest();
                requestSettings.Url = value.Url;
                step.Settings       = JsonConvert.SerializeObject(requestSettings);
            }
            else
            {
                step = new MTDMonitorStep {
                    MonitorStepId = Guid.NewGuid(),
                    Type          = MTDMonitorStepTypes.Request,
                    MonitorId     = data.MonitorId,
                    Settings      = JsonConvert.SerializeObject(monitorStepData),
                    Interval      = 10
                };
                Db.MonitorSteps.Add(step);
            }

            var result = await Db.SaveChangesAsync();

            if (result > 0)
            {
                return(Success("Monitoring saved successfully.", new {
                    Id = data.MonitorId
                }));
            }
            else
            {
                return(Error("Something is wrong with your model."));
            }
        }
Exemple #2
0
        private async Task <object> GetMonitorClientModel(MTDMonitor monitor)
        {
            var url = String.Empty;

            var loadTime  = 0.00;
            var loadTimes = new List <double> ();

            var totalMonitoredTime = 0;

            var upTime  = 0.00;
            var upTimes = new List <double> ();

            var downTime        = 0.00;
            var downTimePercent = 0.00;

            var stepStatus = MTDMonitorStepStatusTypes.Unknown;

            var monitorStepRequest = await Db.MonitorSteps.FirstOrDefaultAsync(m => m.MonitorId == monitor.MonitorId);

            if (monitorStepRequest != null)
            {
                var requestSettings = monitorStepRequest.SettingsAsRequest();
                if (requestSettings != null)
                {
                    url = requestSettings.Url;
                }

                var week = DateTime.UtcNow.AddDays(-14);
                var logs = await Db.MonitorStepLogs
                           .Where(m => m.MonitorStepId == monitorStepRequest.MonitorStepId && m.StartDate >= week)
                           .OrderByDescending(m => m.StartDate)
                           .Take(50)
                           .ToListAsync();

                logs = logs.OrderBy(x => x.StartDate).ToList();

                if (logs.Any(m => m.Status == MTDMonitorStepStatusTypes.Success))
                {
                    loadTime = logs.Where(m => m.Status == MTDMonitorStepStatusTypes.Success)
                               .Average(m => m.EndDate.Subtract(m.StartDate).TotalMilliseconds);
                }

                foreach (var log in logs)
                {
                    totalMonitoredTime += log.Interval;
                    if (log.Status == MTDMonitorStepStatusTypes.Success)
                    {
                        loadTimes.Add(log.EndDate.Subtract(log.StartDate).TotalMilliseconds);
                    }

                    if (log.Status == MTDMonitorStepStatusTypes.Fail)
                    {
                        downTime += log.Interval;
                    }

                    var currentDowntimePercent = (downTime / totalMonitoredTime) * 100;
                    var currentUptimePercent   = 100 - currentDowntimePercent;

                    upTimes.Add(double.IsNaN(currentUptimePercent) ? 0 : currentUptimePercent);
                }

                var lastLog = logs.LastOrDefault();
                if (lastLog != null)
                {
                    stepStatus = lastLog.Status;
                }

                downTimePercent = (downTime / totalMonitoredTime) * 100;
                upTime          = 100 - downTimePercent;
            }

            if (double.IsNaN(upTime))
            {
                upTime = 0;
            }

            return(new {
                monitor.MonitorId,
                monitor.CreatedDate,
                monitor.LastCheckDate,
                monitor.MonitorStatus,
                monitor.Name,
                monitor.TestStatus,
                monitor.UpdatedDate,
                url,
                upTime,
                upTimes,
                downTime,
                downTimePercent,
                loadTime,
                loadTimes,
                totalMonitoredTime,
                stepStatus,
                stepStatustext = $"{stepStatus}"
            });
        }