// 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;
        }
Exemple #3
0
        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());
        }