From d5d86cd0fae8e5b3c655e6f24cc80d9d801891b3 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Mon, 25 May 2020 23:26:35 +0000 Subject: [PATCH] --- .../Controllers/ServerMetricsController.cs | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 server/AyaNova/Controllers/ServerMetricsController.cs diff --git a/server/AyaNova/Controllers/ServerMetricsController.cs b/server/AyaNova/Controllers/ServerMetricsController.cs new file mode 100644 index 00000000..88f604b8 --- /dev/null +++ b/server/AyaNova/Controllers/ServerMetricsController.cs @@ -0,0 +1,127 @@ +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json.Linq; + +using AyaNova.Models; +using AyaNova.Api.ControllerHelpers; +using AyaNova.Biz; + + +namespace AyaNova.Api.Controllers +{ + + /// + /// Server metrics + /// + [ApiController] + [ApiVersion("8.0")] + [Route("api/v{version:apiVersion}/metric")] + [Authorize] + public class ServerMetricsController : ControllerBase + { + private readonly AyContext ct; + private readonly ILogger log; + private readonly ApiServerState serverState; + + + /// + /// ctor + /// + /// + /// + /// + + public ServerMetricsController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState) + { + ct = dbcontext; + log = logger; + serverState = apiServerState; + } + + + /// + /// Get metrics as text document + /// + /// Snapshot of metrics + [HttpGet("textsnapshot")] + public async Task GetMetrics() + { + if (serverState.IsClosed) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.Metrics)) + { + return StatusCode(403, new ApiNotAuthorizedResponse()); + } + + string sResult = await GetTheMetrics("plain"); + + //Log + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.Metrics, AyaEvent.Retrieved), ct); + + return Content(sResult); + } + + + /// + /// Get metrics as json object + /// + /// Snapshot of metrics + [HttpGet("jsonsnapshot")] + public async Task GetJsonMetrics() + { + if (serverState.IsClosed) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.Metrics)) + { + return StatusCode(403, new ApiNotAuthorizedResponse()); + } + + string sResult = await GetTheMetrics("json"); + JObject json = JObject.Parse(sResult); + + //Log + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.Metrics, AyaEvent.Retrieved), ct); + + return Ok(ApiOkResponse.Response(json)); + } + + /// + /// Get the metrics snapshot + /// + /// Either "json" for json format or "plain" for plaintext format + /// + private async Task GetTheMetrics(string format) + { + var snapshot = metrics.Snapshot.Get(); + + var formatters = ((IMetricsRoot)metrics).OutputMetricsFormatters; + string sResult = $"ERROR GETTING METRICS IN {format} FORMAT"; + + foreach (var formatter in formatters) + { + if (formatter.MediaType.Format == format) + { + using (var stream = new MemoryStream()) + { + await formatter.WriteAsync(stream, snapshot); + sResult = System.Text.Encoding.UTF8.GetString(stream.ToArray()); + } + } + } + + return sResult; + } + + + //------------ + + + } +} \ No newline at end of file