Sonarr/NzbDrone/Providers/MonitoringProvider.cs

123 lines
4.0 KiB
C#
Raw Normal View History

2011-10-07 06:36:04 +00:00
using System;
using System.Diagnostics;
using System.Runtime.Remoting;
using System.Timers;
2011-11-13 04:22:13 +00:00
using Exceptioneer.WindowsFormsClient;
2011-10-07 06:36:04 +00:00
using NLog;
using Ninject;
using NzbDrone.Common;
2011-10-07 06:36:04 +00:00
namespace NzbDrone.Providers
{
public class MonitoringProvider
{
2011-10-07 06:43:35 +00:00
private static readonly Logger Logger = LogManager.GetLogger("Host.MonitoringProvider");
2011-10-07 06:36:04 +00:00
private readonly IISProvider _iisProvider;
private readonly ProcessProvider _processProvider;
2011-10-07 06:57:43 +00:00
private readonly WebClientProvider _webClientProvider;
2011-10-07 06:36:04 +00:00
private int _pingFailCounter;
private Timer _pingTimer;
[Inject]
2011-10-07 06:57:43 +00:00
public MonitoringProvider(ProcessProvider processProvider, IISProvider iisProvider,
WebClientProvider webClientProvider)
2011-10-07 06:36:04 +00:00
{
_processProvider = processProvider;
_iisProvider = iisProvider;
2011-10-07 06:57:43 +00:00
_webClientProvider = webClientProvider;
}
public MonitoringProvider()
{
2011-10-07 06:36:04 +00:00
}
public void Start()
{
AppDomain.CurrentDomain.UnhandledException += ((s, e) => AppDomainException(e.ExceptionObject as Exception));
2011-10-07 06:36:04 +00:00
AppDomain.CurrentDomain.ProcessExit += ProgramExited;
AppDomain.CurrentDomain.DomainUnload += ProgramExited;
var prioCheckTimer = new Timer(5000);
prioCheckTimer.Elapsed += EnsurePriority;
prioCheckTimer.Enabled = true;
_pingTimer = new Timer(60000) { AutoReset = true };
2011-10-07 06:36:04 +00:00
_pingTimer.Elapsed += (PingServer);
_pingTimer.Start();
}
public virtual void EnsurePriority(object sender, ElapsedEventArgs e)
{
var currentProcess = _processProvider.GetCurrentProcess();
if (currentProcess.Priority != ProcessPriorityClass.Normal)
{
_processProvider.SetPriority(currentProcess.Id, ProcessPriorityClass.Normal);
}
var iisProcess = _processProvider.GetProcessById(_iisProvider.IISProcessId);
if (iisProcess != null && iisProcess.Priority != ProcessPriorityClass.Normal &&
iisProcess.Priority != ProcessPriorityClass.AboveNormal)
{
_processProvider.SetPriority(iisProcess.Id, ProcessPriorityClass.Normal);
}
}
public virtual void PingServer(object sender, ElapsedEventArgs e)
{
if (!_iisProvider.ServerStarted) return;
try
{
2011-10-07 06:57:43 +00:00
string response = _webClientProvider.DownloadString(_iisProvider.AppUrl + "/health");
2011-10-07 06:36:04 +00:00
if (!response.Contains("OK"))
{
throw new ServerException("Health services responded with an invalid response.");
}
2011-10-07 06:57:43 +00:00
2011-10-07 06:36:04 +00:00
if (_pingFailCounter > 0)
{
Logger.Info("Application pool has been successfully recovered.");
}
2011-10-07 06:57:43 +00:00
2011-10-07 06:36:04 +00:00
_pingFailCounter = 0;
}
catch (Exception ex)
{
_pingFailCounter++;
Logger.ErrorException("Application pool is not responding. Count " + _pingFailCounter, ex);
if (_pingFailCounter > 2)
{
_iisProvider.RestartServer();
}
}
}
private void ProgramExited(object sender, EventArgs e)
{
_iisProvider.StopServer();
}
public static void AppDomainException(Exception excepion)
2011-10-07 06:36:04 +00:00
{
Console.WriteLine("EPIC FAIL: {0}", excepion);
2011-10-07 06:36:04 +00:00
2011-11-13 04:22:13 +00:00
if (EnviromentProvider.IsProduction)
2011-10-07 06:36:04 +00:00
{
2011-11-13 04:22:13 +00:00
new Client
{
ApiKey = "43BBF60A-EB2A-4C1C-B09E-422ADF637265",
ApplicationName = "NzbDrone",
CurrentException = excepion as Exception
}.Submit();
}
Logger.FatalException("EPIC FAIL: {0}", excepion);
2011-10-07 06:36:04 +00:00
}
}
}