public void Trace(string message, string source = null) { try { _log.Trace(message, source); } catch (Exception ex) { try { _fallbackLog.Error("Error writing to log.", null, ex); _fallbackLog.Trace(message, source); } catch {} } }
public void Process() { if (_processingQueue) { return; } if (!_config.Enabled) { _log.Info(typeof(DefaultEventQueue), "Configuration is disabled. The queue will not be processed."); return; } _log.Trace(typeof(DefaultEventQueue), "Processing queue..."); _processingQueue = true; try { _storage.CleanupQueueFiles(_config.GetQueueName(), _config.QueueMaxAge, _config.QueueMaxAttempts); _storage.ReleaseStaleLocks(_config.GetQueueName()); DateTime maxCreatedDate = DateTime.Now; int batchSize = _config.SubmissionBatchSize; var batch = _storage.GetEventBatch(_config.GetQueueName(), _serializer, batchSize, maxCreatedDate); while (batch.Any()) { bool deleteBatch = true; try { var events = batch.Select(b => b.Item2).ToList(); var response = _client.PostEvents(events, _config, _serializer); if (response.Success) { _log.FormattedInfo(typeof(DefaultEventQueue), "Sent {0} events to \"{1}\".", batch.Count, _config.ServerUrl); } else if (response.ServiceUnavailable) { // You are currently over your rate limit or the servers are under stress. _log.Error(typeof(DefaultEventQueue), "Server returned service unavailable."); SuspendProcessing(); deleteBatch = false; } else if (response.PaymentRequired) { // If the organization over the rate limit then discard the event. _log.Info(typeof(DefaultEventQueue), "Too many events have been submitted, please upgrade your plan."); SuspendProcessing(discardFutureQueuedItems: true, clearQueue: true); } else if (response.UnableToAuthenticate) { // The api key was suspended or could not be authorized. _log.Info(typeof(DefaultEventQueue), "Unable to authenticate, please check your configuration. The event will not be submitted."); SuspendProcessing(TimeSpan.FromMinutes(15)); } else if (response.NotFound || response.BadRequest) { // The service end point could not be found. _log.FormattedError(typeof(DefaultEventQueue), "Error while trying to submit data: {0}", response.Message); SuspendProcessing(TimeSpan.FromHours(4)); } else if (response.RequestEntityTooLarge) { if (batchSize > 1) { _log.Error(typeof(DefaultEventQueue), "Event submission discarded for being too large. The event will be retried with a smaller batch size."); batchSize = Math.Max(1, (int)Math.Round(batchSize / 1.5d, 0)); deleteBatch = false; } else { _log.Error(typeof(DefaultEventQueue), "Event submission discarded for being too large. The event will not be submitted."); } } else if (!response.Success) { _log.Error(typeof(DefaultEventQueue), String.Concat("An error occurred while submitting events: ", response.Message)); SuspendProcessing(); deleteBatch = false; } OnEventsPosted(new EventsPostedEventArgs { Events = events, Response = response }); } catch (AggregateException ex) { _log.Error(typeof(DefaultEventQueue), ex, String.Concat("An error occurred while submitting events: ", ex.Flatten().Message)); SuspendProcessing(); deleteBatch = false; } catch (Exception ex) { _log.Error(typeof(DefaultEventQueue), ex, String.Concat("An error occurred while submitting events: ", ex.Message)); SuspendProcessing(); deleteBatch = false; } if (deleteBatch) { _storage.DeleteBatch(batch); } else { _storage.ReleaseBatch(batch); } if (!deleteBatch || IsQueueProcessingSuspended) { break; } batch = _storage.GetEventBatch(_config.GetQueueName(), _serializer, batchSize, maxCreatedDate); } } catch (Exception ex) { _log.Error(typeof(DefaultEventQueue), ex, String.Concat("An error occurred while processing the queue: ", ex.Message)); SuspendProcessing(); } finally { _processingQueue = false; } }
public static void FormattedTrace(this IExceptionlessLog log, Type source, string format, params object[] args) { log.Trace(String.Format(format, args), GetSourceName(source)); }
public static void Trace(this IExceptionlessLog log, Type source, string message) { log.Trace(message, GetSourceName(source)); }
public void Process() { if (_processingQueue) { return; } _log.Trace(typeof(DefaultEventQueue), "Processing queue..."); if (!_config.Enabled) { _log.Info(typeof(DefaultEventQueue), "Configuration is disabled. The queue will not be processed."); return; } _processingQueue = true; try { _storage.CleanupQueueFiles(_config.GetQueueName()); _storage.ReleaseStaleLocks(_config.GetQueueName()); DateTime maxCreatedDate = DateTime.Now; var batch = _storage.GetEventBatch(_config.GetQueueName(), _serializer, maxCreatedDate: maxCreatedDate); while (batch.Any()) { bool deleteBatch = true; try { var response = _client.PostEvents(batch.Select(b => b.Item2), _config, _serializer); if (response.Success) { _log.FormattedInfo(typeof(DefaultEventQueue), "Sent {0} events to the server.", batch.Count); } else if (response.ServiceUnavailable) { // You are currently over your rate limit or the servers are under stress. _log.Error(typeof(DefaultEventQueue), "Server returned service unavailable."); SuspendProcessing(); deleteBatch = false; } else if (response.PaymentRequired) { // If the organization over the rate limit then discard the event. _log.Info(typeof(DefaultEventQueue), "Too many events have been submitted, please upgrade your plan."); SuspendProcessing(discardFutureQueuedItems: true, clearQueue: true); } else if (response.UnableToAuthenticate) { // The api key was suspended or could not be authorized. _log.Info(typeof(DefaultEventQueue), "Unable to authenticate, please check your configuration. The event will not be submitted."); SuspendProcessing(TimeSpan.FromMinutes(15)); } else if (response.NotFound || response.BadRequest) { // The service end point could not be found. _log.FormattedError(typeof(DefaultEventQueue), "Error while trying to submit data: {0}", response.Message); SuspendProcessing(TimeSpan.FromHours(4)); } else if (!response.Success) { _log.Error(typeof(DefaultEventQueue), String.Format("An error occurred while submitting events: {0}", response.Message)); SuspendProcessing(); deleteBatch = false; } } catch (Exception ex) { _log.Error(typeof(DefaultEventQueue), ex, String.Concat("An error occurred while submitting events: ", ex.Message)); SuspendProcessing(); deleteBatch = false; } if (deleteBatch) { _storage.DeleteBatch(batch); } else { _storage.ReleaseBatch(batch); } if (!deleteBatch || IsQueueProcessingSuspended) { break; } batch = _storage.GetEventBatch(_config.GetQueueName(), _serializer, maxCreatedDate: maxCreatedDate); } } catch (Exception ex) { _log.Error(typeof(DefaultEventQueue), ex, String.Concat("An error occurred while processing the queue: ", ex.Message)); SuspendProcessing(); } finally { _processingQueue = false; } }