public WatcherCheckResultDto(WatcherCheckResult result) { WatcherName = result.Watcher.Name; WatcherType = result.Watcher.Type.ToString().ToLowerInvariant(); Description = result.Description; IsValid = result.IsValid; }
public WatcherCheckResultMinified(WatcherCheckResult check) { n = check.WatcherName; t = check.WatcherType; d = check.Description; v = check.IsValid; }
private async Task <IList <WatcherExecutionResult> > TryExecuteWatcherCheckAndHooksAsync( WatcherConfiguration watcherConfiguration) { var startedAt = _configuration.DateTimeProvider(); var watcher = watcherConfiguration.Watcher; IWardenCheckResult wardenCheckResult = null; var results = new List <WatcherExecutionResult>(); try { await InvokeOnStartHooksAsync(watcherConfiguration, WatcherCheck.Create(watcher)); _logger.Info($"Executing Watcher: {watcher.Name}."); var watcherCheckResult = await watcher.ExecuteAsync(); _logger.Info($"Completed executing Watcher: {watcher.Name}. " + $"Is valid: {watcherCheckResult.IsValid}. " + $"Description: {watcherCheckResult.Description}"); var completedAt = _configuration.DateTimeProvider(); wardenCheckResult = WardenCheckResult.Create(watcherCheckResult, startedAt, completedAt); var watcherResults = await ExecuteWatcherCheckAsync(watcher, watcherCheckResult, wardenCheckResult, watcherConfiguration); results.AddRange(watcherResults); } catch (Exception exception) { _logger.Error($"There was an error while executing Watcher: {watcher.Name}.", exception); var completedAt = _configuration.DateTimeProvider(); wardenCheckResult = WardenCheckResult.Create(WatcherCheckResult.Create(watcher, false, exception.Message), startedAt, completedAt, exception); results.Add(new WatcherExecutionResult(watcher, WatcherResultState.Error, GetPreviousWatcherState(watcher), wardenCheckResult, exception)); await UpdateWatcherResultStateAndExecuteHooksPossibleAsync(watcher, WatcherResultState.Error, () => InvokeOnFirstErrorHooksAsync(watcherConfiguration, exception)); var wardenException = new WardenException("There was an error while executing Warden " + $"caused by watcher: '{watcher.Name}'.", exception); await InvokeOnErrorHooksAsync(watcherConfiguration, wardenException); } finally { await InvokeOnCompletedHooksAsync(watcherConfiguration, wardenCheckResult); } return(results); }
private async Task TryExecuteWatcherCheckAndHooksAsync(WatcherConfiguration watcherConfiguration, IList <WatcherExecutionResult> results) { var startedAt = _configuration.DateTimeProvider(); var watcher = watcherConfiguration.Watcher; IWardenCheckResult wardenCheckResult = null; try { await InvokeOnStartHooksAsync(watcherConfiguration, WatcherCheck.Create(watcher)); var watcherCheckResult = await watcher.ExecuteAsync(); var completedAt = _configuration.DateTimeProvider(); wardenCheckResult = WardenCheckResult.Create(watcherCheckResult, startedAt, completedAt); await ExecuteWatcherCheckAsync(watcher, watcherCheckResult, wardenCheckResult, watcherConfiguration, results); } catch (Exception exception) { var completedAt = _configuration.DateTimeProvider(); wardenCheckResult = WardenCheckResult.Create(WatcherCheckResult.Create(watcher, false), startedAt, completedAt, exception); results.Add(new WatcherExecutionResult(watcher, WatcherResultState.Error, GetPreviousWatcherState(watcher), wardenCheckResult, exception)); await UpdateWatcherResultStateAndExecuteHooksPossibleAsync(watcher, WatcherResultState.Error, () => InvokeOnFirstErrorHooksAsync(watcherConfiguration, exception)); var wardenException = new WardenException("There was an error while executing Warden " + $"caused by watcher: '{watcher.Name}'.", exception); await InvokeOnErrorHooksAsync(watcherConfiguration, wardenException); } finally { await InvokeOnCompletedHooksAsync(watcherConfiguration, wardenCheckResult); } }
public async Task <WardenIterationDto> SaveIterationAsync(WardenIterationDto iteration, Guid organizationId) { if (iteration == null) { return(null); } var wardenCheckResults = (iteration.Results ?? Enumerable.Empty <WardenCheckResultDto>()).ToList(); var watcherCheckResults = wardenCheckResults.Select(x => x.WatcherCheckResult).ToList(); watcherCheckResults.ForEach(SetWatcherTypeFromFullNamespace); var organization = await _database.Organizations().GetByIdAsync(organizationId); if (organization == null) { throw new ServiceException($"Organization has not been found for given id: '{organizationId}'."); } var warden = organization.GetWardenByName(iteration.WardenName); if (warden == null && !organization.AutoRegisterNewWarden) { throw new ServiceException($"Warden with name: '{iteration.WardenName}' has not been registered."); } var updateOrganization = false; if (warden == null) { if (organization.Wardens.Count() >= _featureSettings.MaxWardensInOrganization) { throw new ServiceException($"Limit of {_featureSettings.MaxWardensInOrganization} " + "wardens in organization has been reached."); } updateOrganization = true; organization.AddWarden(iteration.WardenName); warden = organization.GetWardenByName(iteration.WardenName); } else if (!warden.Enabled) { throw new ServiceException($"Warden with name: '{iteration.WardenName}' is disabled."); } var wardenIteration = new WardenIteration(warden.Name, organization, iteration.Ordinal, iteration.StartedAt, iteration.CompletedAt, iteration.IsValid); foreach (var result in wardenCheckResults) { WatcherType watcherType; var watcherName = result.WatcherCheckResult.WatcherName; if (!Enum.TryParse(result.WatcherCheckResult.WatcherType, true, out watcherType)) { watcherType = WatcherType.Custom; } var watcher = warden.GetWatcherByName(watcherName); if (watcher == null) { if (warden.Watchers.Count() >= _featureSettings.MaxWatchersInWarden) { throw new ServiceException($"Limit of {_featureSettings.MaxWatchersInWarden} " + "watchers in Warden has been reached."); } updateOrganization = true; warden.AddWatcher(watcherName, watcherType); watcher = warden.GetWatcherByName(watcherName); } var watcherCheckResult = result.WatcherCheckResult.IsValid ? WatcherCheckResult.Valid(watcher, result.WatcherCheckResult.Description) : WatcherCheckResult.Invalid(watcher, result.WatcherCheckResult.Description); var checkResult = result.IsValid ? WardenCheckResult.Valid(watcherCheckResult, result.StartedAt, result.CompletedAt) : WardenCheckResult.Invalid(watcherCheckResult, result.StartedAt, result.CompletedAt, CreatExceptionInfo(result.Exception)); wardenIteration.AddResult(checkResult); } if (updateOrganization) { await _database.Organizations().ReplaceOneAsync(x => x.Id == organizationId, organization); } await _database.WardenIterations().InsertOneAsync(wardenIteration); Logger.Info($"Warden iteration: '{wardenIteration.Id}' was created " + $"for organization: '{organization.Name}' with id: '{organization.Id}'."); return(new WardenIterationDto(wardenIteration)); }
/// <summary> /// Run a single iteration (cycle) that will execute all of the watchers and theirs hooks. /// </summary> /// <param name="wardenName">Name of the Warden that will execute the iteration.</param> /// <param name="ordinal">Number (ordinal) of executed iteration</param> /// <returns>Single iteration containing its ordinal and results of all executed watcher checks</returns> public async Task <IWardenIteration> ExecuteAsync(string wardenName, long ordinal) { var iterationStartedAt = _configuration.DateTimeProvider(); var results = new List <WatcherExecutionResult>(); var iterationTasks = _configuration.Watchers.Select(async watcherConfiguration => { var startedAt = _configuration.DateTimeProvider(); var watcher = watcherConfiguration.Watcher; IWardenCheckResult wardenCheckResult = null; try { await InvokeOnStartHooksAsync(watcherConfiguration, WatcherCheck.Create(watcher)); var watcherCheckResult = await watcher.ExecuteAsync(); var completedAt = _configuration.DateTimeProvider(); wardenCheckResult = WardenCheckResult.Create(watcherCheckResult, startedAt, completedAt); if (watcherCheckResult.IsValid) { var result = wardenCheckResult; results.Add(new WatcherExecutionResult(watcher, WatcherResultState.Success, GetPreviousWatcherState(watcher), result)); await UpdateWatcherResultStateAndExecuteHooksPossibleAsync(watcher, WatcherResultState.Success, () => InvokeOnFirstSuccessHooksAsync(watcherConfiguration, result), executeIfLatestStateIsNotSet: false); await InvokeOnSuccessHooksAsync(watcherConfiguration, wardenCheckResult); } else { var result = wardenCheckResult; results.Add(new WatcherExecutionResult(watcher, WatcherResultState.Failure, GetPreviousWatcherState(watcher), result)); await UpdateWatcherResultStateAndExecuteHooksPossibleAsync(watcher, WatcherResultState.Failure, () => InvokeOnFirstFailureHooksAsync(watcherConfiguration, result)); await InvokeOnFailureHooksAsync(watcherConfiguration, wardenCheckResult); } } catch (Exception exception) { var completedAt = _configuration.DateTimeProvider(); wardenCheckResult = WardenCheckResult.Create(WatcherCheckResult.Create(watcher, false), startedAt, completedAt, exception); results.Add(new WatcherExecutionResult(watcher, WatcherResultState.Error, GetPreviousWatcherState(watcher), wardenCheckResult, exception)); await UpdateWatcherResultStateAndExecuteHooksPossibleAsync(watcher, WatcherResultState.Error, () => InvokeOnFirstErrorHooksAsync(watcherConfiguration, exception)); var wardenException = new WardenException("There was an error while executing Warden " + $"caused by watcher: '{watcher.Name}'.", exception); await InvokeOnErrorHooksAsync(watcherConfiguration, wardenException); } finally { await InvokeOnCompletedHooksAsync(watcherConfiguration, wardenCheckResult); } }); await Task.WhenAll(iterationTasks); await ExecuteAggregatedHooksAsync(results); var iterationCompletedAt = _configuration.DateTimeProvider(); var iteration = WardenIteration.Create(wardenName, ordinal, results.Select(x => x.WardenCheckResult), iterationStartedAt, iterationCompletedAt); return(iteration); }