// TODO: Add support for user public key token on signed assemblies public ErrorSignature(ErrorInfo error, IEnumerable<string> userNamespaces = null, IEnumerable<string> userCommonMethods = null, bool emptyNamespaceIsUserMethod = true, bool shouldFlagSignatureTarget = true) { if (error == null) throw new ArgumentNullException("error"); Error = error; _userNamespaces = userNamespaces == null ? new HashSet<string>() : new HashSet<string>(userNamespaces); _userCommonMethods = userCommonMethods == null ? new HashSet<string>() : new HashSet<string>(userCommonMethods); EmptyNamespaceIsUserMethod = emptyNamespaceIsUserMethod; SignatureInfo = new ConfigurationDictionary(); ShouldFlagSignatureTarget = shouldFlagSignatureTarget; Parse(); }
private bool CheckForDuplicateError(ErrorInfo exception) { ErrorInfo current = exception; DateTime repeatWindow = DateTime.Now.AddSeconds(-2); while (current != null) { int hashCode = current.GetHashCode(); Log.FormattedTrace(typeof(ExceptionlessClient), "Checking for duplicate exception: hash={0} type={1}", hashCode, current.Type); Log.FormattedTrace(typeof(ExceptionlessClient), "Error contents: {0}", current.ToString()); // make sure that we don't process the same error multiple times within 2 seconds. if (_recentlyProcessedErrors.Any(s => s.Item1 == hashCode && s.Item2 >= repeatWindow)) { Log.FormattedInfo(typeof(ExceptionlessClient), "Ignoring duplicate exception: type={0}", current.Type); return true; } // add this exception to our list of recent errors that we have processed. _recentlyProcessedErrors.Enqueue(Tuple.Create(hashCode, DateTime.Now)); // only keep the last 10 recent errors Tuple<int, DateTime> temp; while (_recentlyProcessedErrors.Count > 10) _recentlyProcessedErrors.TryDequeue(out temp); current = current.Inner; } return false; }
private static ErrorInfo GenerateErrorInfo(ErrorInfo target, int nestingLevel = 0, int minimiumNestingLevel = 0) { target.Message = @"Generated exception message."; target.Type = TestConstants.ExceptionTypes.Random(); if (RandomHelper.GetBool()) target.Code = RandomHelper.GetRange(-234523453, 98690899).ToString(); for (int i = 0; i < RandomHelper.GetRange(minimiumNestingLevel, minimiumNestingLevel + 5); i++) { string key = RandomHelper.GetPronouncableString(RandomHelper.GetRange(5, 15)); while (target.ExtendedData.ContainsKey(key)) key = RandomHelper.GetPronouncableString(RandomHelper.GetRange(5, 15)); target.ExtendedData.Add(key, RandomHelper.GetPronouncableString(RandomHelper.GetRange(5, 25))); } var stack = new StackFrameCollection(); for (int i = 0; i < RandomHelper.GetRange(1, 10); i++) stack.Add(GenerateStackFrame()); target.StackTrace = stack; if (minimiumNestingLevel > 0 || (nestingLevel < 5 && RandomHelper.GetBool())) target.Inner = GenerateErrorInfo(nestingLevel + 1); return target; }
private void Compare(Exception ex, ErrorInfo err, int level = 1) { Console.WriteLine("Level " + level); Assert.Equal(ex.GetType().FullName, err.Type); if (String.IsNullOrEmpty(ex.StackTrace)) Assert.Equal(0, err.StackTrace.Count); else { string[] lines = Regex.Split(ex.StackTrace, "\r\n|\r|\n"); Assert.Equal(lines.Length, err.StackTrace.Count); Assert.Equal(ex.StackTrace, err.StackTrace.ToString()); } // TODO: Fix formatting bugs with inner exception tostring if (level == 1) Assert.Equal(ex.ToString(), err.ToString()); if (ex.InnerException != null) Compare(ex.InnerException, err.Inner, level + 1); }
private void AddSpecialCaseDetails(ErrorInfo error) { if (!error.ExtendedData.ContainsKey(ExtendedDataDictionary.EXCEPTION_INFO_KEY)) return; var extraProperties = error.ExtendedData.GetValue<Dictionary<string, object>>(ExtendedDataDictionary.EXCEPTION_INFO_KEY); if (extraProperties == null) return; if (extraProperties.ContainsKey("Number")) SignatureInfo.Add("Number", extraProperties["Number"].ToString()); if (extraProperties.ContainsKey("ErrorCode")) SignatureInfo.Add("ErrorCode", extraProperties["ErrorCode"].ToString()); }