2012-02-05 06:34:36 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2012-04-30 01:24:24 +00:00
|
|
|
|
using Exceptron.Driver;
|
2012-02-05 06:34:36 +00:00
|
|
|
|
using NLog;
|
|
|
|
|
using NzbDrone.Common.Contract;
|
|
|
|
|
|
|
|
|
|
namespace NzbDrone.Common
|
|
|
|
|
{
|
|
|
|
|
public static class ReportingService
|
|
|
|
|
{
|
|
|
|
|
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
|
|
|
|
|
2012-03-01 07:03:19 +00:00
|
|
|
|
private const string SERVICE_URL = "http://services.nzbdrone.com/reporting";
|
2012-02-05 16:53:08 +00:00
|
|
|
|
private const string PARSE_URL = SERVICE_URL + "/ParseError";
|
2012-02-05 06:34:36 +00:00
|
|
|
|
|
|
|
|
|
public static RestProvider RestProvider { get; set; }
|
2012-04-30 01:24:24 +00:00
|
|
|
|
public static ExceptionClient ExceptronDriver { get; set; }
|
2012-04-22 23:14:02 +00:00
|
|
|
|
|
2012-02-05 06:34:36 +00:00
|
|
|
|
|
2012-04-22 23:14:02 +00:00
|
|
|
|
private static readonly HashSet<string> parserErrorCache = new HashSet<string>();
|
2012-02-05 06:34:36 +00:00
|
|
|
|
|
|
|
|
|
public static void ClearCache()
|
|
|
|
|
{
|
|
|
|
|
lock (parserErrorCache)
|
|
|
|
|
{
|
|
|
|
|
parserErrorCache.Clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void ReportParseError(string title)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2012-04-22 23:14:02 +00:00
|
|
|
|
VerifyDependencies();
|
2012-02-05 06:34:36 +00:00
|
|
|
|
|
|
|
|
|
lock (parserErrorCache)
|
|
|
|
|
{
|
|
|
|
|
if (parserErrorCache.Contains(title.ToLower())) return;
|
2012-04-22 23:14:02 +00:00
|
|
|
|
|
2012-02-05 06:34:36 +00:00
|
|
|
|
parserErrorCache.Add(title.ToLower());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var report = new ParseErrorReport { Title = title };
|
|
|
|
|
RestProvider.PostData(PARSE_URL, report);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
2012-03-07 02:59:43 +00:00
|
|
|
|
if (!EnvironmentProvider.IsProduction)
|
2012-02-05 06:34:36 +00:00
|
|
|
|
{
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
e.Data.Add("title", title);
|
2012-02-22 04:43:19 +00:00
|
|
|
|
logger.InfoException("Unable to report parse error", e);
|
2012-02-05 06:34:36 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-22 23:30:18 +00:00
|
|
|
|
public static string ReportException(LogEventInfo logEvent)
|
2012-02-05 06:34:36 +00:00
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2012-04-22 23:14:02 +00:00
|
|
|
|
VerifyDependencies();
|
|
|
|
|
|
|
|
|
|
var exceptionData = new ExceptionData();
|
|
|
|
|
|
|
|
|
|
exceptionData.Exception = logEvent.Exception;
|
2012-05-06 16:03:23 +00:00
|
|
|
|
exceptionData.Component = logEvent.LoggerName;
|
2012-04-23 02:35:55 +00:00
|
|
|
|
exceptionData.Message = logEvent.FormattedMessage;
|
2012-04-22 23:14:02 +00:00
|
|
|
|
exceptionData.UserId = EnvironmentProvider.UGuid.ToString().Replace("-", string.Empty);
|
|
|
|
|
|
2012-05-21 23:36:56 +00:00
|
|
|
|
if (logEvent.Level <= LogLevel.Info)
|
|
|
|
|
{
|
|
|
|
|
exceptionData.Severity = ExceptionSeverity.None;
|
|
|
|
|
}
|
|
|
|
|
else if (logEvent.Level <= LogLevel.Warn)
|
|
|
|
|
{
|
|
|
|
|
exceptionData.Severity = ExceptionSeverity.Warning;
|
|
|
|
|
}
|
|
|
|
|
else if (logEvent.Level <= LogLevel.Error)
|
|
|
|
|
{
|
|
|
|
|
exceptionData.Severity = ExceptionSeverity.Error;
|
|
|
|
|
}
|
|
|
|
|
else if (logEvent.Level <= LogLevel.Fatal)
|
|
|
|
|
{
|
|
|
|
|
exceptionData.Severity = ExceptionSeverity.Fatal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ExceptronDriver.SubmitException(exceptionData).RefId;
|
2012-02-05 06:34:36 +00:00
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
2012-03-07 02:59:43 +00:00
|
|
|
|
if (!EnvironmentProvider.IsProduction)
|
2012-02-05 06:34:36 +00:00
|
|
|
|
{
|
|
|
|
|
throw;
|
|
|
|
|
}
|
2012-04-30 02:42:49 +00:00
|
|
|
|
if (logEvent.LoggerName != logger.Name)//prevents a recursive loop.
|
|
|
|
|
{
|
|
|
|
|
logger.WarnException("Unable to report exception. ", e);
|
|
|
|
|
}
|
2012-02-05 06:34:36 +00:00
|
|
|
|
}
|
2012-04-22 23:30:18 +00:00
|
|
|
|
|
|
|
|
|
return null;
|
2012-02-05 06:34:36 +00:00
|
|
|
|
}
|
2012-03-02 01:57:36 +00:00
|
|
|
|
|
2012-04-22 23:14:02 +00:00
|
|
|
|
|
2012-04-30 01:24:24 +00:00
|
|
|
|
public static void SetupExceptronDriver()
|
2012-03-02 01:57:36 +00:00
|
|
|
|
{
|
2012-05-06 16:03:23 +00:00
|
|
|
|
ExceptronDriver = new ExceptionClient("CB230C312E5C4FF38B4FB9644B05E60G")
|
2012-05-01 06:16:54 +00:00
|
|
|
|
{
|
|
|
|
|
ApplicationVersion = new EnvironmentProvider().Version.ToString()
|
|
|
|
|
};
|
2012-04-22 23:30:18 +00:00
|
|
|
|
|
2012-04-30 01:24:24 +00:00
|
|
|
|
ExceptronDriver.ThrowsExceptions = !EnvironmentProvider.IsProduction;
|
|
|
|
|
ExceptronDriver.Enviroment = EnvironmentProvider.IsProduction ? "Prod" : "Dev";
|
2012-04-22 23:14:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void VerifyDependencies()
|
|
|
|
|
{
|
|
|
|
|
if (RestProvider == null)
|
2012-03-02 01:57:36 +00:00
|
|
|
|
{
|
2012-04-22 23:14:02 +00:00
|
|
|
|
if (EnvironmentProvider.IsProduction)
|
2012-03-02 01:57:36 +00:00
|
|
|
|
{
|
|
|
|
|
logger.Warn("Rest provider wasn't provided. creating new one!");
|
2012-03-07 02:59:43 +00:00
|
|
|
|
RestProvider = new RestProvider(new EnvironmentProvider());
|
2012-03-02 01:57:36 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException("REST Provider wasn't configured correctly.");
|
|
|
|
|
}
|
|
|
|
|
}
|
2012-04-22 23:14:02 +00:00
|
|
|
|
|
2012-04-30 01:24:24 +00:00
|
|
|
|
if (ExceptronDriver == null)
|
2012-04-22 23:14:02 +00:00
|
|
|
|
{
|
|
|
|
|
if (EnvironmentProvider.IsProduction)
|
|
|
|
|
{
|
2012-04-30 01:24:24 +00:00
|
|
|
|
logger.Warn("Exceptron Driver wasn't provided. creating new one!");
|
|
|
|
|
SetupExceptronDriver();
|
2012-04-22 23:14:02 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2012-04-30 01:24:24 +00:00
|
|
|
|
throw new InvalidOperationException("Exceptron Driver wasn't configured correctly.");
|
2012-04-22 23:14:02 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2012-03-02 01:57:36 +00:00
|
|
|
|
}
|
2012-02-05 06:34:36 +00:00
|
|
|
|
}
|
|
|
|
|
}
|