/// <summary> /// Enqueues the data. /// </summary> /// <param name="dataObject">The data object.</param> /// <param name="level">The level.</param> /// <param name="custom">The custom.</param> /// <param name="timeout">The timeout.</param> /// <param name="signal">The signal.</param> /// <returns>PayloadBundle.</returns> internal PayloadBundle?EnqueueData( object dataObject, ErrorLevel level, IDictionary <string, object?>?custom, TimeSpan?timeout = null, SemaphoreSlim?signal = null ) { // here is the last chance to decide if we need to actually send this payload // based on the current config settings and rate-limit conditions: if (string.IsNullOrWhiteSpace(this._config.RollbarDestinationOptions.AccessToken) || !this._config.RollbarDeveloperOptions.Enabled || (level < this._config.RollbarDeveloperOptions.LogLevel) ) { // nice shortcut: return(null); } if (this._config.RollbarDeveloperOptions.RethrowExceptionsAfterReporting) { System.Exception?exception = dataObject as System.Exception; if (exception == null && dataObject is Data data && data.Body != null ) { exception = data.Body.OriginalException; } if (exception != null) { try { // Here we need to create another logger instance with similar config but configured not to re-throw. // This would prevent infinite recursive calls (in case if we used this instance or any re-throwing instance). // Because we will be re-throwing the exception after reporting, let's report it fully-synchronously. // This logic is on a heavy side. But, fortunately, RethrowExceptionsAfterReporting is intended to be // a development time option: var config = new RollbarLoggerConfig(); config.Reconfigure(this._config); config.RollbarDeveloperOptions.RethrowExceptionsAfterReporting = false; using var rollbar = RollbarFactory.CreateNew(config); rollbar.AsBlockingLogger(TimeSpan.FromSeconds(1)).Log(level, dataObject, custom); } #pragma warning disable CA1031 // Do not catch general exception types catch { // In case there was a TimeoutException (or any un-expected exception), // there is nothing we can do here. // We tried our best... } #pragma warning restore CA1031 // Do not catch general exception types finally { if (exception is AggregateException aggregateException) { exception = aggregateException.Flatten(); } ExceptionDispatchInfo.Capture(exception).Throw(); } return(null); } } PayloadBundle?payloadBundle = null; try { payloadBundle = CreatePayloadBundle(dataObject, level, custom, timeout, signal); } #pragma warning disable CA1031 // Do not catch general exception types catch (System.Exception exception) { RollbarErrorUtility.Report( this, dataObject, InternalRollbarError.BundlingError, null, exception, payloadBundle ); return(null); } #pragma warning restore CA1031 // Do not catch general exception types try { _ = this._rollbarClient.PostAsJsonAsync(payloadBundle); } #pragma warning disable CA1031 // Do not catch general exception types catch (System.Exception exception) { RollbarErrorUtility.Report( this, dataObject, InternalRollbarError.EnqueuingError, null, exception, payloadBundle ); } #pragma warning restore CA1031 // Do not catch general exception types return(payloadBundle); }
/// <summary> /// Initializes a new instance of the <see cref="RollbarInfrastructureConfig"/> class. /// </summary> /// <param name="rollbarAccessToken">The rollbar access token.</param> /// <param name="rollbarEnvironment">The rollbar environment.</param> public RollbarInfrastructureConfig(string?rollbarAccessToken, string?rollbarEnvironment = null) { this._rollbarLoggerConfig = new RollbarLoggerConfig(rollbarAccessToken, rollbarEnvironment); }