80 lines
2.8 KiB
C#
80 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Web.Http;
|
|
using Umbraco.Web.Editors;
|
|
using Umbraco.Web.WebApi.Filters;
|
|
|
|
namespace Umbraco.Web.HealthCheck
|
|
{
|
|
/// <summary>
|
|
/// The API controller used to display the health check info and execute any actions
|
|
/// </summary>
|
|
[UmbracoApplicationAuthorize(Core.Constants.Applications.Developer)]
|
|
public class HealthCheckController : UmbracoAuthorizedJsonController
|
|
{
|
|
private readonly IHealthCheckResolver _healthCheckResolver;
|
|
|
|
public HealthCheckController()
|
|
{
|
|
_healthCheckResolver = HealthCheckResolver.Current;
|
|
}
|
|
|
|
public HealthCheckController(IHealthCheckResolver healthCheckResolver)
|
|
{
|
|
_healthCheckResolver = healthCheckResolver;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets a grouped list of health checks, but doesn't actively check the status of each health check.
|
|
/// </summary>
|
|
/// <returns>Returns a collection of anonymous objects representing each group.</returns>
|
|
public object GetAllHealthChecks()
|
|
{
|
|
var groups = _healthCheckResolver.HealthChecks
|
|
.GroupBy(x => x.Group)
|
|
.OrderBy(x => x.Key);
|
|
var healthCheckGroups = new List<HealthCheckGroup>();
|
|
foreach (var healthCheckGroup in groups)
|
|
{
|
|
var hcGroup = new HealthCheckGroup
|
|
{
|
|
Name = healthCheckGroup.Key,
|
|
Checks = healthCheckGroup
|
|
.OrderBy(x => x.Name)
|
|
.ToList()
|
|
};
|
|
healthCheckGroups.Add(hcGroup);
|
|
}
|
|
|
|
return healthCheckGroups;
|
|
}
|
|
|
|
[HttpGet]
|
|
public object GetStatus(Guid id)
|
|
{
|
|
var check = _healthCheckResolver.HealthChecks.FirstOrDefault(x => x.Id == id);
|
|
if (check == null) throw new InvalidOperationException("No health check found with ID " + id);
|
|
|
|
try
|
|
{
|
|
//Core.Logging.LogHelper.Debug<HealthCheckController>("Running health check: " + check.Name);
|
|
return check.GetStatus();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Core.Logging.LogHelper.Error<HealthCheckController>("Exception in health check: " + check.Name, e);
|
|
throw;
|
|
}
|
|
}
|
|
|
|
[HttpPost]
|
|
public HealthCheckStatus ExecuteAction(HealthCheckAction action)
|
|
{
|
|
var check = _healthCheckResolver.HealthChecks.FirstOrDefault(x => x.Id == action.HealthCheckId);
|
|
if (check == null) throw new InvalidOperationException("No health check found with id " + action.HealthCheckId);
|
|
|
|
return check.ExecuteAction(action);
|
|
}
|
|
}
|
|
} |