Files
Umbraco-CMS/src/Umbraco.Web/HealthCheck/HealthCheckController.cs

100 lines
3.3 KiB
C#
Raw Normal View History

2017-07-20 11:21:28 +02:00
using System;
using System.Collections.Generic;
2018-03-27 10:04:07 +02:00
using System.ComponentModel;
2017-09-08 19:39:13 +02:00
using System.Configuration;
using System.Linq;
using System.Web.Http;
2019-01-07 10:43:28 +01:00
using Umbraco.Core;
using Umbraco.Core.Composing;
2017-05-12 14:49:44 +02:00
using Umbraco.Core.Logging;
2017-09-08 19:39:13 +02:00
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.HealthChecks;
using Umbraco.Web.Editors;
2018-03-27 10:04:07 +02:00
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.Settings)]
public class HealthCheckController : UmbracoAuthorizedJsonController
{
private readonly HealthCheckCollection _checks;
2017-09-08 19:39:13 +02:00
private readonly IList<Guid> _disabledCheckIds;
2017-05-12 14:49:44 +02:00
private readonly ILogger _logger;
2017-05-12 14:49:44 +02:00
public HealthCheckController(HealthCheckCollection checks, ILogger logger)
{
2017-05-12 14:49:44 +02:00
_checks = checks ?? throw new ArgumentNullException(nameof(checks));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
2017-09-08 19:39:13 +02:00
2019-01-07 10:43:28 +01:00
var healthCheckConfig = Current.Configs.HealthChecks();
2017-09-08 19:39:13 +02:00
_disabledCheckIds = healthCheckConfig.DisabledChecks
.Select(x => x.Id)
.ToList();
}
/// <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 = _checks
2017-09-08 19:39:13 +02:00
.Where(x => _disabledCheckIds.Contains(x.Id) == false)
.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;
}
2017-05-12 14:49:44 +02:00
[HttpGet]
public object GetStatus(Guid id)
{
2017-09-08 19:39:13 +02:00
var check = GetCheckById(id);
2017-09-23 10:08:18 +02:00
2017-05-12 14:49:44 +02:00
try
{
//Core.Logging.LogHelper.Debug<HealthCheckController>("Running health check: " + check.Name);
return check.GetStatus();
}
catch (Exception ex)
2017-05-12 14:49:44 +02:00
{
_logger.Error<HealthCheckController>(ex, "Exception in health check: {HealthCheckName}", check.Name);
2017-05-12 14:49:44 +02:00
throw;
}
}
[HttpPost]
public HealthCheckStatus ExecuteAction(HealthCheckAction action)
{
2017-09-08 19:39:13 +02:00
var check = GetCheckById(action.HealthCheckId);
return check.ExecuteAction(action);
}
2017-09-08 19:39:13 +02:00
private HealthCheck GetCheckById(Guid id)
{
var check = _checks
2017-09-14 11:41:46 +02:00
.Where(x => _disabledCheckIds.Contains(x.Id) == false)
.FirstOrDefault(x => x.Id == id);
2017-09-08 19:39:13 +02:00
2017-09-14 11:41:46 +02:00
if (check == null) throw new InvalidOperationException($"No health check found with id {id}");
2017-09-08 19:39:13 +02:00
return check;
}
}
2017-07-20 11:21:28 +02:00
}