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);
            }
        }