예제 #1
0
 public List <NcChannel> GetChannelsToLastCycleTest(NcMonitor monitor)
 {
     return(scenarioRepository
            .GetItems(monitor.ScenarioId)
            .Where(x => x.TestCycleInterval <= monitor.LastTestCycleInterval)
            .Select(x => x.Channel).ToList());
 }
        public async Task SetLastTestCycleIntervalsAsync()
        {
            // Arrange
            var expectedTimeSpan = new TimeSpan(2, 40, 42);
            var expectedStatus   = MonitorStatus.OK;

            var monitor = new NcMonitor
            {
                LastTestCycleInterval = It.IsAny <TimeSpan>(),
                StatusId = (int)expectedStatus,
            };

            var monitorRepo = new Mock <IMonitorRepository>();

            IMonitorManager monitorManager = new MonitorManager(
                It.IsAny <IChannelRepository>(),
                monitorRepo.Object,
                It.IsAny <IRecordRepository>(),
                It.IsAny <IScenarioRepository>());

            // Act
            await monitorManager.SetLastTestCycleIntervalsAsync(
                monitor, expectedTimeSpan);// TimeSpan je struct, neni potreba vytvaret novou referenci

            // Assert
            monitorRepo.Verify(x => x.UpdateAsyncWithoutResetTestCycleInterval(monitor), Times.Once());
            Assert.Equal(expectedTimeSpan, monitor.LastTestCycleInterval);
            Assert.Equal(expectedStatus, monitor.StatusEnum());
        }
예제 #3
0
 /// <summary>
 /// Prida notifikaci o nahozeni do fronty.
 /// </summary>
 /// <param name="monitor"></param>
 /// <returns></returns>
 public async Task AddNotifyUpAsync(NcMonitor monitor)
 {
     await NotifyAsync(monitor,
                       $"[MONITORING UP] {monitor.Name}",
                       $"Monitor '{monitor.Name}' for url '{monitor.Url}' with verificaiton rule '{monitor.VerificationEnum()}={monitor.VerificationValue}' is now up.",
                       notifyUp : true);
 }
        public async Task RecordAsync(NcMonitor monitor, MonitorResult result)
        {
            var record = monitorManager.LastOpenedMonitorRecord(monitor.Id);

            if (result.IsSuccess)
            {
                if ((record != null && record.EndDate == null) || monitor.StatusEnum() != MonitorStatus.OK)
                {//ukonceni zaznamu
                    if (record != null)
                    {
                        await monitorManager.UpdateEndDateAsync(record, DateTime.Now);
                    }

                    await notificator.AddNotifyUpAsync(monitor);//poslani notifikace o tom ze web bezi, staci poslat pouze jendou.

                    await monitorManager.SetStatusAndResetLastTestCycleIntervalAsync(monitor, MonitorStatus.OK);
                }
            }
            else
            {     //nastala chyba
                if (record == null || record.EndDate != null || monitor.StatusEnum() != MonitorStatus.Error)
                { //neexistuje zadny zaznam nebo jsou vsechny uzavreny
                    await monitorManager.SetStatusAndResetLastTestCycleIntervalAsync(monitor, MonitorStatus.Error);
                    await AddNewRecordAsync(monitor, result);
                }

                //posilani notifikaci se provadi stale dokud je monitor v chybovem stavu
                await notificator.AddNotifyDownAsync(monitor);
            }
        }
        public async Task SetStatusAndResetLastTestCycleIntervalAsync(
            MonitorStatus oldStatus,
            MonitorStatus newStatus)
        {
            // Arrange
            var monitor = new NcMonitor
            {
                StatusId = (int)oldStatus,
                LastTestCycleInterval = new TimeSpan(2, 3, 4),
            };

            var monitorRepo = new Mock <IMonitorRepository>();

            IMonitorManager monitorManager = new MonitorManager(
                It.IsAny <IChannelRepository>(),
                monitorRepo.Object,
                It.IsAny <IRecordRepository>(),
                It.IsAny <IScenarioRepository>());

            // Act
            await monitorManager.SetStatusAndResetLastTestCycleIntervalAsync(
                monitor,
                newStatus);

            // Assert
            monitorRepo.Verify(x => x.UpdateAsync(monitor), Times.Once());
            Assert.Equal(new TimeSpan?(), monitor.LastTestCycleInterval);
            Assert.Equal(newStatus, monitor.StatusEnum());
        }
 private async Task AddNewRecordAsync(NcMonitor monitor, MonitorResult result)
 {
     await monitorManager.AddNewRecordAsync(new NcMonitorRecord
     {
         StartDate = DateTime.Now,
         Monitor   = monitor,
         Note      = GetLogMessage(result),
     });
 }
예제 #7
0
        public async Task SetStatusAndResetLastTestCycleIntervalAsync(NcMonitor monitor, MonitorStatus status)
        {
            if (monitor.StatusEnum() != MonitorStatus.InActive)
            {
                monitor.StatusId = (int)status;
            }

            monitor.LastTestCycleInterval = null;
            await monitorRepository.UpdateAsync(monitor);
        }
예제 #8
0
        private async Task NotifyAsync(NcMonitor monitor, string subject, string message, bool notifyUp)
        {
            TimeSpan?timeInErrorStatus = monitorManager.TimeInErrorStatus(monitor.Id);

            if (notifyUp && timeInErrorStatus != null ||    //ma se odeslat upozorneni o nahozeni, ale monitor je stale v chybovem stavu
                !notifyUp && timeInErrorStatus == null)     //ma se odeslat upozorneni o spadnuti, ale monitor neni v chybovem stavu
            {
                return;
            }

            List <NcChannel> channels;

            if (notifyUp)
            {//oznamit vsem kanalum co j*z byly upozorneni, ze web j*z bezi
                channels = monitorManager.GetChannelsToLastCycleTest(monitor);
            }
            else
            {//oznamit vsem kanalum co jeste nebyly upozorneni a maji byt upozorneni
                channels = monitorManager.GetChannelsBetweenLastErrorAndTestCycle(monitor, timeInErrorStatus ?? TimeSpan.Zero);
            }


            bool foundChannels = channels.Count > 0;

            if (foundChannels)
            {
                foreach (NcChannel channel in channels)
                {
                    ChannelType chnlType = channel.ChannelTypeEnum();
                    Func <NcChannelSubscriber, string> contactSelect;

                    switch (chnlType)
                    {
                    case ChannelType.Email:
                        contactSelect = x => x.User.Email;
                        break;

                    default:
                        logger.LogError($"Method '{nameof(NotifyAsync)}' is not implemented for  '{chnlType.GetType()}.{chnlType}' yet.");
                        continue;
                    }

                    await queue.PushAsync(QueueType.Notification, new NotifyItem
                    {
                        ChannelType = chnlType,
                        Subject     = subject,
                        Message     = message,
                        Contact     = string.Join(";", channel.NcChannelSubscriber.Select(contactSelect)),
                    });
                }

                await monitorManager.SetLastTestCycleIntervalsAsync(monitor, timeInErrorStatus);
            }
        }
예제 #9
0
 public List <NcChannel> GetChannelsBetweenLastErrorAndTestCycle(NcMonitor monitor, TimeSpan testCycle)
 {
     if (testCycle.TotalHours >= 24)
     {
         testCycle = new TimeSpan(23, 59, 59);
     }
     return(scenarioRepository
            .GetItems(monitor.ScenarioId)
            .Where(x =>
                   (monitor.LastTestCycleInterval == null || //monitor jeste nebyl testovan
                    monitor.LastTestCycleInterval < x.TestCycleInterval) &&//nebo posledni testovaci cyklus monitoru je mensi nez testovaci cyklus aktualniho kanalu
                   x.TestCycleInterval <= testCycle)//a zaroven testovaci cyklus kanalu musi byt mensi nebo roven testovacimu cyklu ve vstupnim parametru
            .Select(x => x.Channel).ToList());
 }
예제 #10
0
        /// <summary>
        /// Prida notifikaci o vypadku do fronty.
        /// </summary>
        /// <param name="monitor"></param>
        /// <returns></returns>
        public async Task AddNotifyDownAsync(NcMonitor monitor)
        {
            NcMonitorRecord monitorRecord = monitorManager.LastOpenedMonitorRecord(monitor.Id);

            if (monitorRecord == null)
            {//vsechny zaznamy jsou j*z uzavreny, uz neni error.
                return;
            }

            await NotifyAsync(monitor,
                              $"[MONITORING DOWN] {monitor.Name}",
                              $"Monitor '{monitor.Name}' for url '{monitor.Url}' with verificaiton rule '{monitor.VerificationEnum()}={monitor.VerificationValue}' is now down." +
                              $"\n\nRecord note: {monitorRecord.Note}",
                              notifyUp : false);
        }
예제 #11
0
        private MonitorResult CheckMonitor(NcMonitor monitor)
        {
            if (monitor.Enabled)
            {
                int timeout = (int)monitor.Timeout.TotalMilliseconds;
                switch (monitor.VerificationEnum())
                {
                case MonitorVerification.Keyword:
                    return(FindKeywordOnWebsite(monitor.Url, monitor.VerificationValue, timeout));

                case MonitorVerification.StatusCode:
                    return(CheckStatusCode(monitor.Url, monitor.VerificationValue, timeout));
                }

                return(MonitorResult.Failed($"{nameof(monitor.VerificationType)} '{monitor.VerificationTypeId} - {monitor.VerificationType}' not found."));
            }

            return(MonitorResult.Success);
        }
예제 #12
0
        public Task CheckMonitors(IServiceProvider serviceProvider, CancellationToken cancellationToken)
        {
            return(Task.Run(() =>
            {
                try
                {
                    List <NcMonitor> monitorsToCheck = monitorManager.MonitorsToCheck();

                    foreach (NcMonitor monitor in monitorsToCheck)
                    {
                        cancellationToken.ThrowIfCancellationRequested();

                        try
                        {
                            Task task = Task.Run(async() =>
                            {//kontroly jednotlivych monitoru spustime paralelne
                                try
                                {
                                    //vytvoreni noveho scope, jelikoz kazde vlakno by melo mit vlastni scope
                                    //muze se totiz stat, ze se napr. databazovi context uvolni
                                    //a vlakno se na nej bude chtit stale dotazovat
                                    using (IServiceScope scope = serviceProvider.CreateScope())
                                    {
                                        cancellationToken.ThrowIfCancellationRequested();

                                        Monitoring monitoring = scope.ServiceProvider.GetService <Monitoring>();

                                        //vyhledani monitoru v aktualnim scope (db contextu)
                                        NcMonitor tmpMonitor = monitoring.monitorManager.FindMonitor(monitor.Id);
                                        logger.LogInformation($"{tmpMonitor.Name}: Started monitor checking.");
                                        await monitoring.CheckAndRecordMonitorAsync(tmpMonitor);
                                        logger.LogInformation($"{tmpMonitor.Name}: Finished monitor checking.");

                                        cancellationToken.ThrowIfCancellationRequested();

                                        logger.LogInformation($"{tmpMonitor.Name}: Started send all notifications...");

                                        bool saved = false;
                                        while (!saved)
                                        {
                                            try
                                            {
                                                await monitoring.notificator.SendAllNotifications();
                                                saved = true;
                                            }
                                            catch (DbUpdateConcurrencyException ex) {}
                                        }
                                        logger.LogInformation($"{tmpMonitor.Name}: Finished send all notifications...");
                                    }
                                }
                                catch (Exception ex)
                                {
                                    logger.LogError(ex, $"Error while checking monitor: {monitor.Id} - {monitor.Name}.");
                                    await emailNotificator.SendEmailExceptionAsync(ex, $"Error while checking monitor: {monitor.Id} - {monitor.Name}.");
                                }
                            }, cancellationToken);
                        }
                        catch (Exception ex)
                        {
                            logger.LogError(ex, $"Error while creating and starting task to check monitor: {monitor.Id} - {monitor.Name}.");
                            emailNotificator.SendEmailExceptionAsync(ex, $"Error while creating and starting task to check monitor: {monitor.Id} - {monitor.Name}.");
                        }
                    }
                }
                catch (Exception ex)
                {
                    logger.LogError(ex, $"{nameof(CheckMonitors)}");
                    emailNotificator.SendEmailExceptionAsync(ex, $"{nameof(CheckMonitors)}");
                }
            }, cancellationToken));
        }
예제 #13
0
        private Task CheckAndRecordMonitorAsync(NcMonitor monitor)
        {
            var result = CheckMonitor(monitor);

            return(monitorRecorder.RecordAsync(monitor, result));
        }
        public void GetChannelsToLastCycleTest(long monitorLastTestCycleTicks, int expectedCount)
        {
            // Arrange
            var scenarioId = 2;

            var scenarioItems = new List <NcScenarioItem>(new NcScenarioItem[]
            {
                new NcScenarioItem {
                    ScenarioId = 1, TestCycleInterval = TimeSpan.MinValue
                },
                new NcScenarioItem {
                    ScenarioId = 1, TestCycleInterval = TimeSpan.MaxValue
                },
                new NcScenarioItem
                {
                    ScenarioId        = 2,
                    TestCycleInterval = new TimeSpan(10),
                    Channel           = new NcChannel {
                        Id = 2
                    },
                },
                new NcScenarioItem
                {
                    ScenarioId        = 2,
                    TestCycleInterval = new TimeSpan(20),
                    Channel           = new NcChannel {
                        Id = 3
                    },
                },
                new NcScenarioItem
                {
                    ScenarioId        = 2,
                    TestCycleInterval = new TimeSpan(30),
                    Channel           = new NcChannel {
                        Id = 4
                    },
                },
                new NcScenarioItem {
                    ScenarioId = 3, TestCycleInterval = TimeSpan.MinValue
                },
                new NcScenarioItem {
                    ScenarioId = 3, TestCycleInterval = TimeSpan.MinValue
                },
                new NcScenarioItem {
                    ScenarioId = 3, TestCycleInterval = TimeSpan.MaxValue
                },
            });

            var monitor = new NcMonitor
            {
                ScenarioId            = scenarioId,
                LastTestCycleInterval = new TimeSpan(monitorLastTestCycleTicks),
            };

            var expected = scenarioItems
                           .Where(x => x.ScenarioId == scenarioId &&
                                  x.TestCycleInterval <= monitor.LastTestCycleInterval)
                           .Select(x => x.Channel)
                           .ToList();

            var scenarioRepo = new Mock <IScenarioRepository>();

            scenarioRepo.Setup(x => x.GetItems(scenarioId))
            .Returns((int targetId) => scenarioItems.Where(x => x.ScenarioId == targetId).AsQueryable());

            IMonitorManager monitorManager = new MonitorManager(
                It.IsAny <IChannelRepository>(),
                It.IsAny <IMonitorRepository>(),
                It.IsAny <IRecordRepository>(),
                scenarioRepo.Object);

            // Act
            var actual = monitorManager.GetChannelsToLastCycleTest(monitor);

            // Assert
            Assert.Equal(expectedCount, actual.Count);
            expected.ToExpectedObject().ShouldEqual(actual);
        }
예제 #15
0
 public async Task SetLastTestCycleIntervalsAsync(NcMonitor monitor, TimeSpan?timeSpan)
 {
     monitor.LastTestCycleInterval = timeSpan;
     await monitorRepository.UpdateAsyncWithoutResetTestCycleInterval(monitor);
 }
 public static MonitorVerification VerificationEnum(this NcMonitor monitor)
 {
     return((MonitorVerification)monitor.VerificationTypeId);
 }
 public static MonitorStatus StatusEnum(this NcMonitor monitor)
 {
     return((MonitorStatus)monitor.StatusId);
 }
        public async Task RecordAsync(MonitorStatus oldStatus, MonitorStatus monitorResult, bool existLastRecord, bool lastRecordIsOpen)
        {
            // Arrange
            var monitorResultSuccess = monitorResult != MonitorStatus.Error;
            var lastRecordEndDate    = existLastRecord && !lastRecordIsOpen
                ? new DateTime?(DateTime.MinValue)
                : new DateTime?();

            var monitor = new NcMonitor
            {
                Id       = Guid.NewGuid(),
                StatusId = (int)oldStatus,
            };
            var mRecord = new NcMonitorRecord
            {
                EndDate = lastRecordEndDate
            };
            var mResult = new MonitorResult
            {
                IsSuccess = monitorResultSuccess
            };

            var monitorManager = new Mock <IMonitorManager>();

            monitorManager.Setup(x => x.LastOpenedMonitorRecord(monitor.Id))
            .Returns(() =>
            {
                if (!existLastRecord || !lastRecordIsOpen)
                {
                    return(null);
                }

                return(mRecord);
            }).Verifiable();

            monitorManager.Setup(x => x.UpdateEndDateAsync(mRecord, It.IsAny <DateTime>()))
            .Returns(Task.CompletedTask);

            monitorManager.Setup(x =>
                                 x.SetStatusAndResetLastTestCycleIntervalAsync(monitor, monitorResult))
            .Returns(Task.CompletedTask);

            var notificator = new Mock <INotificator>();

            notificator.Setup(x => x.AddNotifyUpAsync(monitor)).Returns(Task.CompletedTask);
            notificator.Setup(x => x.AddNotifyDownAsync(monitor)).Returns(Task.CompletedTask);

            var monitorRecorder = new MonitorRecorder(
                It.IsAny <ILogger <MonitorRecorder> >(),
                monitorManager.Object,
                notificator.Object);

            // Act
            await monitorRecorder.RecordAsync(monitor, mResult);

            // Assert
            monitorManager.Verify();

            if (monitorResultSuccess)
            {
                if ((existLastRecord && lastRecordIsOpen) || oldStatus != MonitorStatus.OK)
                {//ukonceni zaznamu
                    if (existLastRecord && lastRecordIsOpen)
                    {
                        monitorManager.Verify(x => x.UpdateEndDateAsync(mRecord, It.IsAny <DateTime>()));
                    }

                    notificator.Verify(x => x.AddNotifyUpAsync(monitor));
                    monitorManager.Verify(x => x.SetStatusAndResetLastTestCycleIntervalAsync(monitor, MonitorStatus.OK));
                }
            }
            else
            {
                if (!existLastRecord || !lastRecordIsOpen || oldStatus != MonitorStatus.Error)
                {//neexistuje zadny zaznam nebo jsou vsechny uzavreny nebo aktualni status monitoru neni v chybovem stavu
                    monitorManager.Verify(x => x.SetStatusAndResetLastTestCycleIntervalAsync(monitor, MonitorStatus.Error));
                }
                notificator.Verify(x => x.AddNotifyDownAsync(monitor));
            }
        }