Esempio n. 1
0
        public async Task UpdateStatus(string tenantId, string jobId, JobStatusUpdateData change)
        {
            var filter = Builders <JobData> .Filter.And(
                Builders <JobData> .Filter.Eq(jd => jd.TenantId, tenantId),
                Builders <JobData> .Filter.Eq(jd => jd.JobId, jobId));

            var update = Builders <JobData> .Update
                         .Max(jd => jd.Status.LastIterationStartTime, change.LastIterationStartTime)
                         .Max(jd => jd.Status.LastDequeueAttemptTime, change.LastDequeueAttemptTime)
                         .Max(jd => jd.Status.LastProcessStartTime, change.LastProcessStartTime)
                         .Max(jd => jd.Status.LastProcessFinishTime, change.LastProcessFinishTime)
                         .Max(jd => jd.Status.LastHealthCheckTime, change.LastHealthCheckTime)
                         .Inc(jd => jd.Status.ItemsProcessed, change.ItemsProcessedDelta)
                         .Inc(jd => jd.Status.ItemsRequeued, change.ItemsRequeuedDelta)
                         .Inc(jd => jd.Status.ItemsGeneratedForTargetQueue, change.ItemsGeneratedForTargetQueueDelta)
                         .Inc(jd => jd.Status.ProcessingTimeTakenMillis, change.ProcessingTimeTakenMillisDelta)
                         .Inc(jd => jd.Status.ItemsFailed, change.ItemsFailedDelta);

            if (change.LastFailTime.HasValue)
            {
                update = update.Max(jd => jd.Status.LastFailTime, change.LastFailTime.Value);
            }

            if (change.LastFailures != null && change.LastFailures.Length > 0)
            {
                update = update.PushEach(jd => jd.Status.LastFailures, change.LastFailures, -NumberOfFailuresToKeep);
            }

            await Mongo.Jobs.UpdateOneAsync(filter, update);
        }
        private void FlushInternal()
        {
            Interlocked.Exchange(ref _lastFlushTicks, DateTime.UtcNow.Ticks);

            var lastFailTicks = LastFailTicks;
            var lastFailTime  = lastFailTicks == 0 ? (DateTime?)null : new DateTime(lastFailTicks, DateTimeKind.Utc);

            var change = new JobStatusUpdateData
            {
                LastIterationStartTime = new DateTime(LastIterationStartedTicks, DateTimeKind.Utc),
                LastDequeueAttemptTime = new DateTime(LastDequeueAttemptTicks, DateTimeKind.Utc),
                LastProcessStartTime   = new DateTime(LastProcessStartedTicks, DateTimeKind.Utc),
                LastProcessFinishTime  = new DateTime(LastProcessFinishedTicks, DateTimeKind.Utc),
                LastHealthCheckTime    = new DateTime(LastHealthCheckTicks, DateTimeKind.Utc),

                ItemsProcessedDelta               = Interlocked.Exchange(ref _unflushedItemsProcessed, 0L),
                ProcessingTimeTakenMillisDelta    = Interlocked.Exchange(ref _unflushedProcessingTimeTakenMillis, 0L),
                ItemsRequeuedDelta                = Interlocked.Exchange(ref _unflushedItemsRequeued, 0L),
                ItemsGeneratedForTargetQueueDelta =
                    Interlocked.Exchange(ref _unflushedItemsGeneratedForTargetQueue, 0L),

                ItemsFailedDelta = Interlocked.Exchange(ref _unflushedItemsFailed, 0L),
                LastFailTime     = lastFailTime
            };

            if (!_unflushedProcessingErrorMessages.IsEmpty)
            {
                var faults = new List <JobStatusErrorData>();
                while (_unflushedProcessingErrorMessages.TryDequeue(out var message))
                {
                    faults.Add(new JobStatusErrorData {
                        ErrorMessage = message, Timestamp = DateTime.UtcNow.Ticks
                    });
                }

                if (faults.Count > 0)
                {
                    change.LastFailures = faults.ToArray();
                }
            }

            try
            {
                _jobStore.UpdateStatus(_tenantId, _jobId, change).GetAwaiter().GetResult();
            }
            catch (Exception e)
            {
                Log.Error($"Job runner {_jobId} - Could not flush statistics due to exception", e);
            }
        }
Esempio n. 3
0
        public async Task UpdateStatus(string tenantId, string jobId, JobStatusUpdateData change)
        {
            var job = await Load(tenantId, jobId);

            job.Status.LastIterationStartTime = job.Status.LastIterationStartTime > change.LastIterationStartTime
                ? job.Status.LastIterationStartTime
                : change.LastIterationStartTime;
            job.Status.LastDequeueAttemptTime = job.Status.LastDequeueAttemptTime > change.LastDequeueAttemptTime
                ? job.Status.LastDequeueAttemptTime
                : change.LastDequeueAttemptTime;
            job.Status.LastProcessStartTime = job.Status.LastProcessStartTime > change.LastProcessStartTime
                ? job.Status.LastProcessStartTime
                : change.LastProcessStartTime;
            job.Status.LastProcessFinishTime = job.Status.LastProcessFinishTime > change.LastProcessFinishTime
                ? job.Status.LastProcessFinishTime
                : change.LastProcessFinishTime;
            job.Status.LastHealthCheckTime = job.Status.LastHealthCheckTime > change.LastHealthCheckTime
                ? job.Status.LastHealthCheckTime
                : change.LastHealthCheckTime;
            job.Status.ItemsProcessed += change.ItemsProcessedDelta;
            job.Status.ItemsRequeued  += change.ItemsRequeuedDelta;
            job.Status.ItemsGeneratedForTargetQueue += change.ItemsGeneratedForTargetQueueDelta;
            job.Status.ProcessingTimeTakenMillis    += change.ProcessingTimeTakenMillisDelta;
            job.Status.ItemsFailed += change.ItemsFailedDelta;

            if (change.LastFailTime.HasValue)
            {
                job.Status.LastFailTime = job.Status.LastFailTime > change.LastFailTime
                    ? job.Status.LastFailTime
                    : change.LastFailTime.Value;
            }

            if (change.LastFailures != null && change.LastFailures.Length > 0)
            {
                foreach (var jobStatusErrorData in change.LastFailures)
                {
                    job.Status.LastFailures.Append(jobStatusErrorData);
                }
            }
        }
Esempio n. 4
0
 public Task UpdateStatus(string tenantId, string jobId, JobStatusUpdateData change)
 {
     throw new NotImplementedException();
 }