private static int ReportDetailInfo(IFaultUtility faultUtility)
        {
            // 0 means send watson, otherwise, cancel watson
            // we always send watson since dump itself can have valuable data
            var exitCode = 0;

            try
            {
                var logPath = Path.Combine(Path.GetTempPath(), "servicehub", "logs");
                if (!Directory.Exists(logPath))
                {
                    return(exitCode);
                }

                // attach all log files that are modified less than 1 day before.
                var now    = DateTime.UtcNow;
                var oneDay = TimeSpan.FromDays(1);

                foreach (var file in Directory.EnumerateFiles(logPath, "*.log"))
                {
                    var lastWrite = File.GetLastWriteTimeUtc(file);
                    if (now - lastWrite > oneDay)
                    {
                        continue;
                    }

                    faultUtility.AddFile(file);
                }
            }
            catch (Exception ex) when(ReportNonIOException(ex))
            {
            }

            return(exitCode);
        }
Exemplo n.º 2
0
        public static void SetExtraParameters(
            this IFaultUtility fault,
            Exception exception,
            bool emptyCallstack
            )
        {
            if (emptyCallstack)
            {
                // if exception we got started with empty callstack, put hash of runtime
                // callstack in one of reserved slot for better bucketting.
                // we put hash since NFW just takes certain length of callstack which
                // makes the callstack useless
                fault.SetBucketParameter(
                    Reserved3,
                    $"{Environment.StackTrace?.GetHashCode() ?? 0}"
                    );
            }

            switch (exception)
            {
            case RemoteInvocationException remote:
                fault.SetBucketParameter(Reserved1, remote.GetParameterString());
                return;

            case AggregateException aggregate:
                if (aggregate.InnerException == null)
                {
                    return;
                }
                else if (aggregate.InnerExceptions.Count == 1)
                {
                    fault.SetBucketParameter(Reserved1, aggregate.GetParameterString());
                    return;
                }
                else
                {
                    var flatten = aggregate.Flatten();

                    fault.SetBucketParameter(
                        Reserved1,
                        flatten.InnerException.GetParameterString()
                        );
                    fault.SetBucketParameter(Reserved2, flatten.CalculateHash());

                    return;
                }

            default:
                if (exception.InnerException == null)
                {
                    return;
                }

                fault.SetBucketParameter(
                    Reserved1,
                    exception.InnerException.GetParameterString()
                    );
                return;
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// This sets extra watson bucket parameters to make bucketting better
        /// in non fatal watson report
        /// </summary>
        public static void SetExtraParameters(this IFaultUtility fault, Exception exception, bool emptyCallstack)
        {
            if (emptyCallstack)
            {
                // if exception we got started with empty callstack, put runtime
                // callstack in one of reserved slot for better bucketting
                fault.SetBucketParameter(Reserved3, Environment.StackTrace);
            }

            switch (exception)
            {
            case RemoteInvocationException remote:
                fault.SetBucketParameter(Reserved1, remote.GetParameterString());
                return;

            case AggregateException aggregate:
                if (aggregate.InnerException == null)
                {
                    return;
                }
                else if (aggregate.InnerExceptions.Count == 1)
                {
                    fault.SetBucketParameter(Reserved1, aggregate.GetParameterString());
                    return;
                }
                else
                {
                    var flatten = aggregate.Flatten();

                    fault.SetBucketParameter(Reserved1, flatten.InnerException.GetParameterString());
                    fault.SetBucketParameter(Reserved2, flatten.CalculateHash());

                    return;
                }

            default:
                if (exception.InnerException == null)
                {
                    return;
                }

                fault.SetBucketParameter(Reserved1, exception.InnerException.GetParameterString());
                return;
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// This sets extra watson bucket parameters to make bucketting better
        /// in non fatal watson report
        /// </summary>
        public static void SetExtraParameters(this IFaultUtility fault, Exception exception)
        {
            switch (exception)
            {
            case RemoteInvocationException remote:
                fault.SetBucketParameter(Reserved1, remote.GetParameterString());
                return;

            case AggregateException aggregate:
                if (aggregate.InnerException == null)
                {
                    return;
                }
                else if (aggregate.InnerExceptions.Count == 1)
                {
                    fault.SetBucketParameter(Reserved1, aggregate.GetParameterString());
                    return;
                }
                else
                {
                    var flatten = aggregate.Flatten();

                    fault.SetBucketParameter(Reserved1, flatten.InnerException.GetParameterString());
                    fault.SetBucketParameter(Reserved2, flatten.CalculateHash());

                    return;
                }

            default:
                if (exception.InnerException == null)
                {
                    return;
                }

                fault.SetBucketParameter(Reserved1, exception.InnerException.GetParameterString());
                return;
            }
        }
Exemplo n.º 5
0
 private static int SendFaultToWatson(IFaultUtility faultUtility)
 {
     return(0);
 }