public Monitor AddMonitorStepLog(MonitorStepLog monitorStepLog) { MonitorStep.MonitorStepLogs.AddIfNotContains(monitorStepLog); return this; }
protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext) { var stopwatch = new Stopwatch(); stopwatch.Start(); Logger.LogInformation("Starting at {0}: Monitoring the website’s health...", stopwatch.Elapsed.Milliseconds); var guidGenerator = workerContext.ServiceProvider.GetRequiredService <IGuidGenerator>(); var unitOfWorkManager = workerContext.ServiceProvider.GetRequiredService <UnitOfWorkManager>(); var monitorRepository = workerContext.ServiceProvider.GetRequiredService <IMonitorRepository>(); var clientFactory = workerContext.ServiceProvider.GetRequiredService <IHttpClientFactory>(); var monitors = await monitorRepository.GetListByStepFilterAsync(MonitorStepTypes.Request); monitors = monitors .Where(x => x.LastModificationTime == null ? x.CreationTime.ToUniversalTime().AddSeconds(x.MonitorStep.Interval) < DateTime.UtcNow : x.LastModificationTime?.ToUniversalTime().AddMinutes(x.MonitorStep.Interval) < DateTime.UtcNow) .ToList(); foreach (var monitor in monitors) { if (!monitor.MonitorStep.Url.IsNullOrEmpty()) { var logInterval = monitor.MonitorStep.Interval; var monitorStepLog = new MonitorStepLog( guidGenerator.Create(), monitor.Id, DateTime.UtcNow, MonitorStepStatusTypes.Processing, logInterval); monitor.AddMonitorStepLog(monitorStepLog); monitorStepLog.Status = MonitorStepStatusTypes.Processing; await monitorRepository.UpdateAsync(monitor); await unitOfWorkManager.Current.SaveChangesAsync(); try { var client = clientFactory.CreateClient(); client.Timeout = TimeSpan.FromSeconds(15); var response = await client.GetAsync(monitor.MonitorStep.Url); monitorStepLog.Status = MonitorStepStatusTypes.Pending; if (response.IsSuccessStatusCode) { monitorStepLog.Status = MonitorStepStatusTypes.Success; } else { monitorStepLog.Status = MonitorStepStatusTypes.Fail; } } catch (HttpRequestException rex) { monitorStepLog.SetLog(rex.Message); monitorStepLog.Status = MonitorStepStatusTypes.Fail; } catch (Exception ex) { monitorStepLog.SetLog(ex.Message); monitorStepLog.Status = MonitorStepStatusTypes.Error; } finally { monitorStepLog.EndDate = DateTime.UtcNow; } switch (monitorStepLog.Status) { case MonitorStepStatusTypes.Success: monitor.MonitorStep.Status = MonitorStepStatusTypes.Success; monitor.MonitorStatus = MonitorStatusTypes.Up; break; case MonitorStepStatusTypes.Error: monitor.MonitorStep.Status = MonitorStepStatusTypes.Error; monitor.MonitorStatus = MonitorStatusTypes.Warning; break; default: monitor.MonitorStep.Status = MonitorStepStatusTypes.Fail; monitor.MonitorStatus = MonitorStatusTypes.Down; break; } } monitor.LastModificationTime = DateTime.UtcNow; await monitorRepository.UpdateAsync(monitor); await unitOfWorkManager.Current.SaveChangesAsync(); await PublishUserNotifyEvent(monitor); } stopwatch.Stop(); var stopwatchElapsed = stopwatch.Elapsed; Logger.LogInformation("Completed at {0} ms: Monitoring the website’s health...", stopwatchElapsed.TotalMilliseconds); }