Added base health check and diagnostic system
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
||||
using Moonlight.App.Database;
|
||||
|
||||
namespace Moonlight.App.Diagnostics.HealthChecks;
|
||||
|
||||
public class DatabaseHealthCheck : IHealthCheck
|
||||
{
|
||||
private readonly DataContext DataContext;
|
||||
|
||||
public DatabaseHealthCheck(DataContext dataContext)
|
||||
{
|
||||
DataContext = dataContext;
|
||||
}
|
||||
|
||||
public async Task<HealthCheckResult> CheckHealthAsync(
|
||||
HealthCheckContext context,
|
||||
CancellationToken cancellationToken = new CancellationToken())
|
||||
{
|
||||
try
|
||||
{
|
||||
await DataContext.Database.OpenConnectionAsync(cancellationToken);
|
||||
await DataContext.Database.CloseConnectionAsync();
|
||||
|
||||
return HealthCheckResult.Healthy("Database is online");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return HealthCheckResult.Unhealthy("Database is offline", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
58
Moonlight/App/Diagnostics/HealthChecks/NodeHealthCheck.cs
Normal file
58
Moonlight/App/Diagnostics/HealthChecks/NodeHealthCheck.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
using System.Diagnostics;
|
||||
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
||||
using Moonlight.App.Database.Entities;
|
||||
using Moonlight.App.Repositories;
|
||||
using Moonlight.App.Services;
|
||||
|
||||
namespace Moonlight.App.Diagnostics.HealthChecks;
|
||||
|
||||
public class NodeHealthCheck : IHealthCheck
|
||||
{
|
||||
private readonly Repository<Node> NodeRepository;
|
||||
private readonly NodeService NodeService;
|
||||
|
||||
public NodeHealthCheck(Repository<Node> nodeRepository, NodeService nodeService)
|
||||
{
|
||||
NodeRepository = nodeRepository;
|
||||
NodeService = nodeService;
|
||||
}
|
||||
|
||||
public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = new CancellationToken())
|
||||
{
|
||||
var nodes = NodeRepository.Get().ToArray();
|
||||
|
||||
var results = new Dictionary<Node, bool>();
|
||||
var healthCheckData = new Dictionary<string, object>();
|
||||
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
try
|
||||
{
|
||||
await NodeService.GetStatus(node);
|
||||
|
||||
results.Add(node, true);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
results.Add(node, false);
|
||||
healthCheckData.Add(node.Name, e.ToStringDemystified());
|
||||
}
|
||||
}
|
||||
|
||||
var offlineNodes = results
|
||||
.Where(x => !x.Value)
|
||||
.ToArray();
|
||||
|
||||
if (offlineNodes.Length == nodes.Length)
|
||||
{
|
||||
return HealthCheckResult.Unhealthy("All nodes are offline", null, healthCheckData);
|
||||
}
|
||||
|
||||
if (offlineNodes.Length == 0)
|
||||
{
|
||||
return HealthCheckResult.Healthy("All nodes are online");
|
||||
}
|
||||
|
||||
return HealthCheckResult.Degraded($"{offlineNodes.Length} nodes are offline", null, healthCheckData);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user