public void OutdatedGray()
        {
            // создадим метрику без правил
            var account   = TestHelper.GetTestAccount();
            var component = account.CreateRandomComponentControl();

            component.SendMetric("x", 100, TimeSpan.FromHours(1));

            // все серое, т.к. нет правил метрики
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Unknown);
            TestHelper.CheckMetricaStatus(account.Id, component, "x", MonitoringStatus.Unknown);

            // сделаем так, чтобы метрика протухла
            component.SendMetric("x", 100, TimeSpan.FromSeconds(1));
            Thread.Sleep(2000);

            // обновим статус метрики
            var metricProcessor = new OutdatedMetricsProcessor(LogManager.GetCurrentClassLogger(), new CancellationToken());

            metricProcessor.ProcessAccount(account.Id);

            // метрика должна стать красной
            TestHelper.CheckMetricaStatus(account.Id, component, "x", MonitoringStatus.Alarm);
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Alarm);

            // сделаем метрику серой
            component.SendMetric("x", 100, TimeSpan.FromHours(1));
            TestHelper.CheckMetricaStatus(account.Id, component, "x", MonitoringStatus.Unknown);
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Unknown);

            // у каждой колбаски должно быть только 1 актуальное событие
            TestHelper.CheckActualStatusEventsCount(account, component.Info.Id);
        }
        public void Outdated()
        {
            // получим компонент
            var account       = TestHelper.GetTestAccount();
            var component     = account.CreateRandomComponentControl();
            var cpuMetricType = TestHelper.CreateCpuMetricType(account.Id);
            var hddMetricType = TestHelper.CreateHddMetricType(account.Id);

            // данных нет, компонент серый
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Unknown);

            // отправим CPU = 50 % = Success
            var response = component.SendMetric(cpuMetricType.SystemName, 50, TimeSpan.FromHours(1));

            Assert.Equal(response.Data.Status, Zidium.Api.MonitoringStatus.Success);
            account.SaveAllCaches();
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Success);

            // отправим HDD = 5 Gb = Warning
            response = component.SendMetric(hddMetricType.SystemName, 5, TimeSpan.FromHours(1));
            Assert.Equal(response.Data.Status, Zidium.Api.MonitoringStatus.Warning);
            account.SaveAllCaches();
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Warning);

            // отправим CPU = 100 % = Alarm
            response = component.SendMetric(cpuMetricType.SystemName, 100, TimeSpan.FromHours(1));
            Assert.Equal(response.Data.Status, Zidium.Api.MonitoringStatus.Alarm);
            account.SaveAllCaches();
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Alarm);

            // отправим CPU = 10 % = Success
            response = component.SendMetric(cpuMetricType.SystemName, 10, TimeSpan.FromHours(1));
            Assert.Equal(response.Data.Status, Zidium.Api.MonitoringStatus.Success);
            account.SaveAllCaches();
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Warning);// Warning из-за HDD

            // сделаем так, чтобы метрики протухли
            component.SendMetric(cpuMetricType.SystemName, 10, TimeSpan.FromSeconds(1));
            component.SendMetric(hddMetricType.SystemName, 5, TimeSpan.FromSeconds(1));
            Thread.Sleep(1000);
            account.SaveAllCaches();

            // обновим статус метрик
            var metricProcessor = new OutdatedMetricsProcessor(LogManager.GetCurrentClassLogger(), new CancellationToken());

            metricProcessor.ProcessAccount(account.Id);
            account.SaveAllCaches();

            // проверим, что в БД статус протух
            using (var accountDbContext = account.CreateAccountDbContext())
            {
                var componentDb = accountDbContext.Components.Find(component.Info.Id);

                var hddMetricDb = componentDb.Metrics.Single(x => x.MetricTypeId == hddMetricType.Id);
                Assert.Null(hddMetricDb.Value);
                Assert.False(hddMetricDb.Bulb.HasSignal);
                Assert.Equal("Нет сигнала", hddMetricDb.Bulb.Message);
                Assert.Equal(hddMetricDb.Bulb.Status, MonitoringStatus.Alarm);

                var cpuMetricDb = componentDb.Metrics.Single(x => x.MetricTypeId == cpuMetricType.Id);
                Assert.Null(cpuMetricDb.Value);
                Assert.False(cpuMetricDb.Bulb.HasSignal);
                Assert.Equal("Нет сигнала", cpuMetricDb.Bulb.Message);
                Assert.Equal(cpuMetricDb.Bulb.Status, MonitoringStatus.Alarm);
            }

            // метрики должны стать красными, т.к. протухли
            TestHelper.CheckMetricaStatus(account.Id, component, cpuMetricType.SystemName, MonitoringStatus.Alarm);
            TestHelper.CheckMetricaStatus(account.Id, component, hddMetricType.SystemName, MonitoringStatus.Alarm);
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Alarm);

            // сделаем метрику CPU зеленой
            response = component.SendMetric(cpuMetricType.SystemName, 10, TimeSpan.FromHours(1));
            Assert.Equal(response.Data.Status, Zidium.Api.MonitoringStatus.Success);
            account.SaveAllCaches();
            TestHelper.CheckMetricaStatus(account.Id, component, cpuMetricType.SystemName, MonitoringStatus.Success);
            TestHelper.CheckMetricaStatus(account.Id, component, hddMetricType.SystemName, MonitoringStatus.Alarm);
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Alarm);

            // сделаем метрику HDD зеленой
            response = component.SendMetric(hddMetricType.SystemName, 100, TimeSpan.FromHours(1));
            Assert.Equal(response.Data.Status, Zidium.Api.MonitoringStatus.Success);
            account.SaveAllCaches();
            TestHelper.CheckMetricaStatus(account.Id, component, cpuMetricType.SystemName, MonitoringStatus.Success);
            TestHelper.CheckMetricaStatus(account.Id, component, hddMetricType.SystemName, MonitoringStatus.Success);
            TestHelper.CheckExternalStatus(account.Id, component, MonitoringStatus.Success);

            // у каждой колбаски должно быть только 1 актуальное событие
            TestHelper.CheckActualStatusEventsCount(account, component.Info.Id);
        }