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); }
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) }); }
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); }
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); }