protected void CalculateComponentEventsStatus(Guid accountId, Guid eventsStatusId)
        {
            var processDate   = DateTime.Now;
            var eventService  = Context.EventService;
            var statusService = Context.BulbService;
            var request       = new AccountCacheRequest()
            {
                AccountId = accountId,
                ObjectId  = eventsStatusId
            };

            // получаем объект для записи, чтобы заблокировать доступ, но ничего не пишем
            using (var data = AllCaches.StatusDatas.Write(request))
            {
                if (data.Actual(processDate))
                {
                    // событий не было вообще
                    if (data.LastEventId == null)
                    {
                        return;
                    }

                    // проверим, что событие актуально
                    var lastEvent = eventService.GetEventCacheOrNullById(accountId, data.LastEventId.Value);
                    if (lastEvent != null)
                    {
                        bool isActual = EventImportanceHelper.Get(data.Status) == lastEvent.Importance &&
                                        lastEvent.ActualDate >= processDate;

                        if (isActual)
                        {
                            // ничего не изменилось, статус актуален
                            return;
                        }
                    }
                }

                // ищем событие, которое пересекается со статусом
                var nextEvent = eventService.GetDangerousEvent(
                    accountId,
                    data.ComponentId.Value,
                    processDate);

                if (nextEvent != null)
                {
                    var noSignalImportance = Api.EventImportance.Unknown;
                    var signal             = BulbSignal.Create(processDate, nextEvent, noSignalImportance, accountId);
                    statusService.SetSignal(data.Id, signal);
                    return;
                }

                // нет актуальных событий
                var unknownSignal = BulbSignal.CreateUnknown(accountId, processDate);
                statusService.SetSignal(eventsStatusId, unknownSignal);
            }
        }
        protected Event CreateUnitTestResultEvent(
            IUnitTestCacheReadObject unitTest,
            SendUnitTestResultRequestData data,
            DateTime processDate)
        {
            data.Message = data.Message ?? string.Empty;

            if (data.Message.Length > 255)
            {
                data.Message = data.Message.Substring(0, 255);
            }

            var importance = EventImportanceHelper.Get(data.Result ?? UnitTestResult.Unknown);

            var cache        = new AccountCache(unitTest.AccountId);
            var unittestType = cache.UnitTestTypes.Read(unitTest.TypeId);

            var actualInterval = unitTest.ActualTime                                        // сначала берем из настроек проверки в ЛК
                                 ?? TimeSpanHelper.FromSeconds(unittestType.ActualTimeSecs) // потом из настроек типа проверки в ЛК
                                 ?? TimeSpanHelper.FromSeconds(data.ActualIntervalSeconds)  // потом из сообщения
                                 ?? TimeSpan.FromMinutes(5);                                // по умолчанию 5 мин

            var actualDate = processDate + actualInterval;

            var joinKeyHash = data.ReasonCode ?? 0;

            var result = new Event()
            {
                Id             = Guid.NewGuid(),
                Count          = 1,
                JoinKeyHash    = joinKeyHash,
                Importance     = importance,
                OwnerId        = unitTest.Id,
                ActualDate     = actualDate,
                CreateDate     = DateTime.Now,
                LastUpdateDate = processDate,
                StartDate      = processDate,
                EndDate        = processDate,
                Message        = data.Message,
                EventTypeId    = SystemEventType.UnitTestResult.Id,
                Category       = EventCategory.UnitTestResult
            };

            if (data.Properties != null)
            {
                result.Properties = ApiConverter.GetEventProperties(data.Properties);
            }
            return(result);
        }
Example #3
0
 public static StatusInfo Create(Bulb bulb, Component component, DateTime now)
 {
     if (bulb == null)
     {
         throw new ArgumentNullException("bulb");
     }
     if (component == null)
     {
         throw new ArgumentNullException("component");
     }
     return(new StatusInfo()
     {
         Category = bulb.EventCategory,
         EventId = bulb.StatusEventId,
         ComponentId = bulb.ComponentId.Value,
         Component = component,
         Duration = bulb.GetDuration(now),
         Importance = EventImportanceHelper.Get(bulb.Status),
         CreateDate = bulb.StartDate,
         PreviousImportance = EventImportanceHelper.Get(bulb.PreviousStatus)
     });
 }
Example #4
0
        protected IEventCacheReadObject AddStatusEvent(Guid accountId, BulbCacheWriteObject data, Guid ownerId)
        {
            var accountDbContext = Context.GetAccountDbContext(accountId);
            var eventType        = SystemEventType.GetStatusEventType(data.EventCategory);
            var now = DateTime.Now;

            // создаем новый статус
            var newStatus = new Event()
            {
                Id                 = Guid.NewGuid(),
                Message            = data.Message,
                ActualDate         = data.ActualDate,
                Category           = data.EventCategory,
                Count              = data.Count,
                CreateDate         = now,
                LastUpdateDate     = now,
                EndDate            = data.EndDate,
                Importance         = EventImportanceHelper.Get(data.Status),
                OwnerId            = ownerId,
                StartDate          = data.StartDate,
                EventTypeId        = eventType.Id,
                PreviousImportance = EventImportanceHelper.Get(data.PreviousStatus),
                IsSpace            = data.IsSpace
            };

            if (data.FirstEventId.HasValue && data.FirstEventId != Guid.Empty)
            {
                newStatus.FirstReasonEventId = data.FirstEventId;
            }
            var eventRepository = accountDbContext.GetEventRepository();

            eventRepository.Add(newStatus);

            // обновим старый статус
            var oldStatus = eventRepository.GetByIdOrNull(data.StatusEventId);

            if (oldStatus != null)
            {
                // установим флажок, если это архивный статус
                if (oldStatus.Category == EventCategory.ComponentExternalStatus)
                {
                    var archivedStatus = new ArchivedStatus()
                    {
                        EventId = oldStatus.Id
                    };
                    var archivedStatusRepository = accountDbContext.GetArchivedStatusRepository();
                    archivedStatusRepository.Add(archivedStatus);
                }

                // старый статус завершается, когда начинается новый статус
                oldStatus.ActualDate     = newStatus.StartDate;
                oldStatus.EndDate        = newStatus.StartDate;
                oldStatus.LastUpdateDate = now;

                // убедимся, что очереди изменений нет изменений старого статуста,
                // иначе наши изменения через EF могут быть перезатёрты
                using (var oldStatusCache = AllCaches.Events.GetForWrite(oldStatus, accountId))
                {
                    oldStatusCache.WaitSaveChanges();
                    oldStatusCache.Unload();
                }
            }

            // обновим лампочку через EF, чтобы {лампочка, старый статус и новый статус} сохранились одновременно
            // изменения лампочки будут сохранены дважды, воторой раз в очереди изменений
            // сейчас не понятно как этого избежать, дело в том, что после данного метода код может изменить кэш лампочки
            // и чтобы не потерять эти изменения сохраняем дважды
            data.StatusEventId = newStatus.Id;
            var bulbEF = accountDbContext.GetStatusDataRepository().GetById(data.Id);

            bulbEF.Count           = data.Count;
            bulbEF.ActualDate      = data.ActualDate;
            bulbEF.EndDate         = data.EndDate;
            bulbEF.FirstEventId    = data.FirstEventId;
            bulbEF.HasSignal       = data.HasSignal;
            bulbEF.LastEventId     = data.LastEventId;
            bulbEF.Message         = data.Message;
            bulbEF.PreviousStatus  = data.PreviousStatus;
            bulbEF.StartDate       = data.StartDate;
            bulbEF.Status          = data.Status;
            bulbEF.StatusEventId   = data.StatusEventId;
            bulbEF.LastChildBulbId = data.LastChildBulbId;

            // убедимся что в очереди изменений нет других изменений лампочки,
            // иначе сохранённые через EF изменения могут быть потеряны
            data.WaitSaveChanges();

            // todo нужно сохранять изменения в одном контексте (транзакции),
            // чтобы лампочка не потеряла ссылку на последний статус
            accountDbContext.SaveChanges();

            var rEvent = AllCaches.Events.Find(new AccountCacheRequest()
            {
                AccountId = accountId,
                ObjectId  = newStatus.Id
            });

            return(rEvent);
        }
Example #5
0
        protected IBulbCacheReadObject SetMetricValue(
            IMetricTypeCacheReadObject metricType,
            MetricCacheWriteObject metric,
            double?value,
            DateTime processDate,
            DateTime actualDate,
            MonitoringStatus status,
            string message,
            bool hasSignal)
        {
            // Обновим текущие значения
            var equal = (value == null && metric.Value == null) || (value == metric.Value);

            if (!equal)
            {
                metric.BeginDate = processDate;
            }
            metric.ActualDate = actualDate;
            metric.Value      = value;

            // Обновим статус метрики
            var statusService      = Context.BulbService;
            var noSignalColor      = metric.NoSignalColor ?? metricType.NoSignalColor ?? ObjectColor.Red;
            var noSignalImportance = EventImportanceHelper.Get(noSignalColor);
            var signal             = new BulbSignal()
            {
                AccountId          = metric.AccountId,
                ActualDate         = metric.ActualDate,
                StartDate          = metric.BeginDate,
                IsSpace            = !hasSignal,
                EventId            = Guid.Empty,
                Message            = message,
                NoSignalImportance = noSignalImportance,
                ProcessDate        = processDate,
                Status             = status
            };

            var statusData = statusService.SetSignal(metric.StatusDataId, signal);

            // сохраним историю
            var color   = ObjectColorHelper.Get(status);
            var history = new MetricHistory()
            {
                ComponentId   = metric.ComponentId,
                MetricTypeId  = metric.MetricTypeId,
                Value         = value,
                BeginDate     = processDate,
                ActualDate    = actualDate,
                Color         = color,
                StatusEventId = statusData.StatusEventId,
                HasSignal     = hasSignal
            };

            var accountDbContext  = Context.GetAccountDbContext(metric.AccountId);
            var historyRepository = accountDbContext.GetMetricHistoryRepository();

            historyRepository.Add(history);

            Context.SaveChanges();
            return(statusData);
        }