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); }
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; } }
/// <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; } }
/// <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; } }
private static int SendFaultToWatson(IFaultUtility faultUtility) { return(0); }