77 lines
2.3 KiB
C#
77 lines
2.3 KiB
C#
using Management.Data;
|
|
using Management.Security;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using System.Text.Json;
|
|
|
|
namespace Management.Controllers;
|
|
|
|
/// <summary>
|
|
/// Monitoring endpoints for system health and stats.
|
|
/// Requires Admin session.
|
|
///
|
|
/// ENDPOINTS:
|
|
/// GET /api/monitoring/health - System health overview
|
|
/// GET /api/monitoring/stats - Detailed statistics
|
|
/// </summary>
|
|
[ApiController]
|
|
[Route("api/monitoring")]
|
|
public sealed class MonitoringController : ControllerBase
|
|
{
|
|
private readonly SqlService _sql;
|
|
private readonly ClientContext _client;
|
|
private readonly ILogger<MonitoringController> _log;
|
|
|
|
public MonitoringController(SqlService sql, ClientContext client, ILogger<MonitoringController> log)
|
|
{
|
|
_sql = sql;
|
|
_client = client;
|
|
_log = log;
|
|
}
|
|
|
|
/// <summary>
|
|
/// System health overview.
|
|
/// </summary>
|
|
[HttpGet("health")]
|
|
public async Task<IActionResult> Health(CancellationToken ct)
|
|
{
|
|
try
|
|
{
|
|
var resp = await _sql.ExecProcAsync("dbo.spMonitoring", "health", "{}", ct: ct);
|
|
|
|
if (string.IsNullOrWhiteSpace(resp))
|
|
return StatusCode(500, new { ok = false, error = "Service unavailable" });
|
|
|
|
return Content(resp, "application/json");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_log.LogError(ex, "[Monitoring] Health error");
|
|
return StatusCode(500, new { ok = false, error = "Health check failed", detail = ex.Message });
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Detailed system statistics.
|
|
/// </summary>
|
|
[HttpGet("stats")]
|
|
public async Task<IActionResult> Stats([FromQuery] int hours = 24, CancellationToken ct = default)
|
|
{
|
|
var rqst = JsonSerializer.Serialize(new { hours });
|
|
|
|
try
|
|
{
|
|
var resp = await _sql.ExecProcAsync("dbo.spMonitoring", "stats", rqst, ct: ct);
|
|
|
|
if (string.IsNullOrWhiteSpace(resp))
|
|
return StatusCode(500, new { ok = false, error = "Service unavailable" });
|
|
|
|
return Content(resp, "application/json");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_log.LogError(ex, "[Monitoring] Stats error");
|
|
return StatusCode(500, new { ok = false, error = "Stats failed", detail = ex.Message });
|
|
}
|
|
}
|
|
}
|