public void Handle(HttpMonitorChecked @event, Action <IEvent> eventCollector = null)
        {
            if (@event == null)
            {
                throw new ArgumentNullException(nameof(@event));
            }
            if (@event.HttpMonitorCheck.HttpMonitorId != Id)
            {
                throw new InvalidOperationException($"Conflicting ids. Expected {Id}, but got {@event.HttpMonitorCheck.HttpMonitorId}.");
            }

            const int maxCount = 10;

            // check if check already exists
            if (RecentHttpMonitorChecks.All(x => x.Id != @event.HttpMonitorCheck.Id))
            {
                var set = new List <HttpMonitorCheck>(RecentHttpMonitorChecks)
                {
                    @event.HttpMonitorCheck
                };

                set = set
                      .OrderByDescending(x => x.RequestTiming.StartTime)
                      .Take(maxCount)
                      .ToList();

                // did we add it...
                if (set.Contains(@event.HttpMonitorCheck))
                {
                    var newStatus = CalculateMonitorStatus(set);
                    var startTime = DateTime.UtcNow; // todo calculate start time

                    if (newStatus != Status)
                    {
                        switch (newStatus)
                        {
                        case MonitorStatus.Up:
                            eventCollector?.Invoke(new HttpMonitorUp(Id, Status, startTime, DateTime.UtcNow));
                            foreach (var alertContact in AlertContactIds)
                            {
                                eventCollector?.Invoke(new ScheduleUpAlertContact(alertContact, Id, Status, startTime, DateTime.UtcNow));
                            }
                            break;

                        case MonitorStatus.Down:
                            eventCollector?.Invoke(new HttpMonitorDown(Id, Status, startTime, DateTime.UtcNow));
                            foreach (var alertContact in AlertContactIds)
                            {
                                eventCollector?.Invoke(new ScheduleDownAlertContact(alertContact, Id, Status, startTime, DateTime.UtcNow));
                            }
                            break;
                        }

                        Status = newStatus;
                    }

                    RecentHttpMonitorChecks = set.AsReadOnly();
                }
            }
        }
Beispiel #2
0
        public async Task PublishAsync(HttpMonitorChecked @event)
        {
            if (@event == null)
            {
                throw new ArgumentNullException(nameof(@event));
            }

            // todo: can i resuse message?
            var message = _converter.Convert(@event);

            foreach (var queueName in _queueNames)
            {
                var queue = await _queueFactoryAsync(queueName);

                await queue.AddMessageAsync(message);
            }
        }