/// <summary> /// Execute on a set of report mastery. /// </summary> /// <returns><c>false</c> if there are no more reports to analyze.</returns> public bool Execute() { using (var transaction = _queue.BeginTransaction()) { var dto = _queue.TryReceive <ReceivedReportDTO>(transaction, TimeSpan.FromMilliseconds(500)); if (dto == null) { return(false); } try { ErrorReportException ex = null; if (dto.Exception != null) { ex = ConvertException(dto.Exception); } var contexts = dto.ContextCollections.Select(ConvertContext).ToArray(); var entity = new ErrorReportEntity(dto.ApplicationId, dto.ReportId, dto.CreatedAtUtc, ex, contexts) { RemoteAddress = dto.RemoteAddress }; _analyzer.Analyze(entity); } catch (Exception ex) { _logger.Error("Failed to analyze report ", ex); } transaction.Commit(); } return(true); }
public void Db_ErrorsReportingService_LogException_WithInner() { using (IUnityContainer childContainer = this.container.CreateChildContainer()) { IErrorsReportingService service = childContainer.Resolve <IErrorsReportingService>(); try { ExceptionGenerator.ThrowsTwo(); } catch (Exception exception) { int?id = null; Assert.That(() => { id = service.LogException(this.dataSet.ApplicationsIds.ElementAt(0), exception, "ErrorType.Specific"); }, Throws.Nothing); Assert.IsNotNull(id); ErrorReportException ex = this.exceptionsSqlHelper.Get(id.Value); ErrorReportException innerEx = this.exceptionsSqlHelper.Get(ex.IdInnerException.Value); Assert.AreEqual("Two", ex.Message); Assert.AreEqual("One", innerEx.Message); } } }
/// <summary> /// Creates a new instance of <see cref="IncidentBeingAnalyzed"/>. /// </summary> /// <param name="entity">entity</param> /// <param name="exception">exception to analyze</param> /// <exception cref="ArgumentNullException">entity; exception</exception> /// <exception cref="ArgumentException">entity.hashcode is null</exception> public IncidentBeingAnalyzed(ErrorReportEntity entity, ErrorReportException exception) { if (entity == null) { throw new ArgumentNullException("entity"); } if (exception == null) { throw new ArgumentNullException("exception"); } if (string.IsNullOrEmpty(entity.ReportHashCode)) { throw new ArgumentException("ReportHashCode must be specified to be able to identify duplicates."); } Description = exception.Message; FullName = exception.FullName; StackTrace = exception.StackTrace; AddReport(entity); ReportHashCode = entity.ReportHashCode; HashCodeIdentifier = entity.GenerateHashCodeIdentifier(); ApplicationId = entity.ApplicationId; UpdatedAtUtc = entity.CreatedAtUtc; CreatedAtUtc = entity.CreatedAtUtc; }
public void Should_remove_AT_from_stacktrace_to_avoid_multi_language_issues() { var exceptionWithAt = new ErrorReportException() { StackTrace = @"at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Coderr.Server.Infrastructure.Configuration.Database.DatabaseStore.Store(IConfigurationSection section) at Coderr.Server.Premise.App.LicenseWrapper.IncreaseReportCount() at Coderr.Server.Web.Controllers.ReportReceiverController.PremiseLicenseCheck() at Coderr.Server.Web.Controllers.ReportReceiverController.Post(String appKey, String sig) at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at System.Threading.Tasks.ValueTask`1.get_Result() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync():55 at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync():33" }; var entityWithAt = new ErrorReportEntity(1, "flldfd", DateTime.UtcNow, exceptionWithAt, new ErrorReportContextCollection[0]); var exceptionWithoutAt = new ErrorReportException() { StackTrace = @"System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName) System.Data.SqlClient.SqlCommand.ExecuteNonQuery() Coderr.Server.Infrastructure.Configuration.Database.DatabaseStore.Store(IConfigurationSection section) Coderr.Server.Premise.App.LicenseWrapper.IncreaseReportCount() Coderr.Server.Web.Controllers.ReportReceiverController.PremiseLicenseCheck() Coderr.Server.Web.Controllers.ReportReceiverController.Post(String appKey, String sig) Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) System.Threading.Tasks.ValueTask`1.get_Result() Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync():55 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync() Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync():33" }; var entityWithoutAt = new ErrorReportEntity(1, "flldfd", DateTime.UtcNow, exceptionWithoutAt, new ErrorReportContextCollection[0]); var sut = new HashCodeGenerator(new IHashCodeSubGenerator[0]); var result1 = sut.GenerateHashCode(entityWithAt); var result2 = sut.GenerateHashCode(entityWithAt); result1.HashCode.Should().Be(result2.HashCode); }
public Guid Send() { ProductManagerClient pm = HalanServices.CreateProductManager(); try { Guid id = Guid.NewGuid(); ErrorReportRequest req = new ErrorReportRequest(); req.Reference = id.ToString(); req.Message = _error.Message; if (_error.Exception != null) { Exception e = _error.Exception; ErrorReportException errorRepExcept = new ErrorReportException(); req.Exception = errorRepExcept; while (e != null) { errorRepExcept.Message = e.Message; errorRepExcept.StackTrace = e.StackTrace; errorRepExcept.Source = e.Source; errorRepExcept.Type = e.GetType().ToString(); e = e.InnerException; if (e != null) { errorRepExcept.InnerException = new ErrorReportException(); errorRepExcept = errorRepExcept.InnerException; } } } req.ProductName = _appData.Product; req.ProductVersion = _appData.Version.ToString(4); req.DotNetFrameworkVersion = Environment.Version.ToString(); req.OperatingSystem = Environment.OSVersion.VersionString; req.ReportID = Tools.EncryptSimple(_appData.Id); if (_managerState != null && _managerState.Length > 0) { req.ManagerState = Tools.EncryptSimple(_managerState.Concat(" ")); } ErrorReportResponse resp = pm.ReportError(req); if (!resp.Successful) { throw new FailedToSendErrorReportException(resp.Message); } return(id); } finally { pm.Close(); } }
/// <summary> /// Convert received report to our internal format /// </summary> /// <param name="report">client report</param> /// <param name="applicationId">application that we identified that the report belongs to</param> /// <returns>internal format</returns> public ErrorReportEntity ConvertReport(ReceivedReportDTO report, int applicationId) { ErrorReportException ex = null; if (report.Exception != null) { ex = ConvertException(report.Exception); } //var id = _idGeneratorClient.GetNextId(ErrorReportEntity.SEQUENCE); var contexts = report.ContextCollections.Select(x => new ErrorReportContext(x.Name, x.Properties)).ToArray(); var dto = new ErrorReportEntity(applicationId, report.ReportId, report.CreatedAtUtc, ex, contexts); return(dto); }
/// <summary> /// Convert exception to our internal format /// </summary> /// <param name="exception">exception</param> /// <returns>our format</returns> public ErrorReportException ConvertException(ReceivedReportException exception) { var ex = new ErrorReportException { AssemblyName = exception.AssemblyName, BaseClasses = exception.BaseClasses, Everything = exception.Everything, FullName = exception.FullName, Message = exception.Message, Name = exception.Name, Namespace = exception.Namespace, StackTrace = exception.StackTrace }; if (exception.InnerException != null) { ex.InnerException = ConvertException(exception.InnerException); } return(ex); }
private ErrorReportException ConvertException(ProcessReportExceptionDto dto) { var entity = new ErrorReportException { Message = dto.Message, FullName = dto.FullName, Name = dto.Name, AssemblyName = dto.AssemblyName, BaseClasses = dto.BaseClasses, Everything = dto.Everything, Namespace = dto.Namespace, StackTrace = dto.StackTrace }; if (dto.InnerExceptionDto != null) { entity.InnerException = ConvertException(dto.InnerExceptionDto); } return(entity); }
private ReportExeptionDTO ConvertToCoreException(ErrorReportException exception) { var ex = new ReportExeptionDTO { AssemblyName = exception.AssemblyName, BaseClasses = exception.BaseClasses, Everything = exception.Everything, FullName = exception.FullName, Message = exception.Message, Name = exception.Name, Namespace = exception.Namespace, StackTrace = exception.StackTrace }; if (ex.InnerException != null) { ex.InnerException = ConvertToCoreException(exception.InnerException); } return(ex); }
/// <summary> /// Convert exception to our internal format /// </summary> /// <param name="exceptionDto">exception</param> /// <returns>our format</returns> public ErrorReportException ConvertException(ProcessReportExceptionDto exceptionDto) { var ex = new ErrorReportException { AssemblyName = exceptionDto.AssemblyName, BaseClasses = exceptionDto.BaseClasses, Everything = exceptionDto.Everything, FullName = exceptionDto.FullName, Message = exceptionDto.Message, Name = exceptionDto.Name, Namespace = exceptionDto.Namespace, StackTrace = exceptionDto.StackTrace }; if (exceptionDto.InnerExceptionDto != null) { ex.InnerException = ConvertException(exceptionDto.InnerExceptionDto); } return(ex); }
public async Task SaveAsync() { int a = 2, b = 0; try { int c = a / b; } catch (Exception exception) { AssemblyName assemblyName = AssemblyHelper.AssemblyName; await Logging.SaveAsync(exception, assemblyName, TestErrorType.DivideByZero); ErrorReportException savedException = this.exceptionsSqlHelper.GetBy(assemblyName.Name, assemblyName.Version.ToString()); Assert.IsNotNull(savedException); this.exceptionsSqlHelper.Delete(savedException.Id); } }
public async Task HandleAsync(IMessageContext context, ProcessReport message) { try { ErrorReportException ex = null; if (message.Exception != null) { ex = ConvertException(message.Exception); } var contexts = message.ContextCollections.Select(ConvertContext).ToArray(); var entity = new ErrorReportEntity(message.ApplicationId, message.ReportId, message.CreatedAtUtc, ex, contexts) { RemoteAddress = message.RemoteAddress }; await _analyzer.Analyze(context, entity); } catch (Exception ex) { _logger.Error("Failed to analyze report ", ex); } }
public void should_match_line_numbers_and_without_line_numbers_to_reduce_the_number_of_incidents() { var ex1 = new ErrorReportException { StackTrace = @"at System.Web.Compilation.AssemblyBuilder.Compile():line 64 at System.Web.Compilation.BuildProvidersCompiler.PerformBuild():line 65 at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath):line 67" }; var ex2 = new ErrorReportException { StackTrace = @"at System.Web.Compilation.AssemblyBuilder.Compile() at System.Web.Compilation.BuildProvidersCompiler.PerformBuild() at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)" }; var report1 = new ErrorReportEntity(1, "fjkkfjjkf", DateTime.UtcNow, ex1, new List <ErrorReportContextCollection>()); var report2 = new ErrorReportEntity(1, "fjkkfjjkf", DateTime.UtcNow, ex2, new List <ErrorReportContextCollection>()); var sut = new HashCodeGenerator(new IHashCodeSubGenerator[0]); var actual1 = sut.GenerateHashCode(report1); var actual2 = sut.GenerateHashCode(report2); actual1.Should().Be(actual2); }
public void should_strip_line_numbers_to_reduce_the_number_of_incidents() { var locator = Substitute.For <IServiceLocator>(); var ex1 = new ErrorReportException { StackTrace = @" at System.Web.Compilation.AssemblyBuilder.Compile():line 64 at System.Web.Compilation.BuildProvidersCompiler.PerformBuild():line 65 at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath):line 67" }; var ex2 = new ErrorReportException { StackTrace = @" at System.Web.Compilation.AssemblyBuilder.Compile():line 12 at System.Web.Compilation.BuildProvidersCompiler.PerformBuild():line 23 at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath):line 53" }; var report1 = new ErrorReportEntity(1, "fjkkfjjkf", DateTime.UtcNow, ex1, new List <ErrorReportContext>()); var report2 = new ErrorReportEntity(1, "fjkkfjjkf", DateTime.UtcNow, ex2, new List <ErrorReportContext>()); var sut = new HashCodeGenerator(locator); var actual1 = sut.GenerateHashCode(report1); var actual2 = sut.GenerateHashCode(report2); actual1.Should().Be(actual2); }