public virtual async Task <JobResult> RunAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            string snapshotName = SystemClock.UtcNow.ToString("'" + Repository + "-'yyyy-MM-dd-HH-mm");

            _logger.Info($"Starting {Repository} snapshot {snapshotName}...");

            await _lockProvider.TryUsingAsync("es-snapshot", async t => {
                var sw     = Stopwatch.StartNew();
                var result = await Run.WithRetriesAsync(async() => {
                    var response = await _client.SnapshotAsync(
                        Repository,
                        snapshotName,
                        d => d
                        .Indices(IncludedIndexes.Count > 0 ? IncludedIndexes.ToArray() : new[] { "*" })
                        .IgnoreUnavailable()
                        .IncludeGlobalState(false)
                        .WaitForCompletion()
                        .RequestConfiguration(r => r.RequestTimeout(60 * 60 * 1000))).AnyContext();

                    if (response.IsValid == false)
                    {
                        _logger.Trace($"Invalid response attempting to create snapshot, checking to see if snapshot {snapshotName} already exists.");
                        var snapshotExistsResponse = await _client.GetSnapshotAsync(Repository, snapshotName).AnyContext();
                        if (snapshotExistsResponse.IsValid == false || snapshotExistsResponse.Snapshots.Count() == 0)
                        {
                            throw new ApplicationException($"Snapshot failed: {response.GetErrorMessage()}", response.ConnectionStatus.OriginalException);
                        }

                        return(true);
                    }

                    return(true);
                },
                                                        maxAttempts: 5,
                                                        retryInterval: TimeSpan.FromSeconds(10),
                                                        cancellationToken: cancellationToken,
                                                        logger: _logger).AnyContext();
                sw.Stop();

                if (result)
                {
                    await OnSuccess(snapshotName, sw.Elapsed).AnyContext();
                }
                else
                {
                    await OnFailure(snapshotName).AnyContext();
                }
            }, TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(30)).AnyContext();

            return(JobResult.Success);
        }
        public OrganizationSnapshotJob(ExceptionlessElasticConfiguration configuration, ILockProvider lockProvider, ILoggerFactory loggerFactory) : base(configuration.Client, lockProvider, loggerFactory)
        {
            _configuration = configuration;
            Repository     = configuration.Options.ScopePrefix + "organizations";
            foreach (var index in configuration.Indexes)
            {
                if (index == configuration.Events || index == configuration.Stacks)
                {
                    continue;
                }

                IncludedIndexes.Add(index.Name + "*");
            }
        }
Exemplo n.º 3
0
 public EventSnapshotJob(ExceptionlessElasticConfiguration configuration, ILockProvider lockProvider, ILoggerFactory loggerFactory) : base(configuration.Client, lockProvider, loggerFactory)
 {
     _configuration = configuration;
     Repository     = configuration.Options.ScopePrefix + "events";
     IncludedIndexes.Add(configuration.Events.Name + "*");
 }
Exemplo n.º 4
0
 public StackSnapshotJob(ExceptionlessElasticConfiguration configuration, ILockProvider lockProvider, ILoggerFactory loggerFactory) : base(configuration.Client, lockProvider, loggerFactory)
 {
     _configuration = configuration;
     Repository     = configuration.Options.ScopePrefix + "ex_stacks";
     IncludedIndexes.Add("stacks*");
 }
Exemplo n.º 5
0
 public OrganizationSnapshotJob(ExceptionlessElasticConfiguration configuration, ILockProvider lockProvider, ILoggerFactory loggerFactory) : base(configuration.Client, lockProvider, loggerFactory)
 {
     Repository = Settings.Current.AppScopePrefix + "ex_organizations";
     IncludedIndexes.Add("organizations*");
 }