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 App.Metrics; using AyaNova.Models; using AyaNova.Api.ControllerHelpers; using AyaNova.Biz; namespace AyaNova.Api.Controllers { /// /// Log files controller /// [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Authorize] public class MetricsController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; private readonly ApiServerState serverState; private readonly IMetrics metrics; /// /// ctor /// /// /// /// /// public MetricsController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState, IMetrics Metrics) { ct = dbcontext; log = logger; serverState = apiServerState; metrics = Metrics; } /// /// Get metrics as text document /// /// Snapshot of metrics [HttpGet("TextSnapShot")] public async Task GetMetrics() { //Open or opsOnly and user is opsadminfull or opsadminlimited if (!serverState.IsOpenOrOpsOnly || (serverState.IsOpsOnly && !Authorized.HasAnyRole(HttpContext.Items, AuthorizationRoles.OpsAdminFull | AuthorizationRoles.OpsAdminLimited))) { return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, 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() { //Open or opsOnly and user is opsadminfull or opsadminlimited if (!serverState.IsOpenOrOpsOnly || (serverState.IsOpsOnly && !Authorized.HasAnyRole(HttpContext.Items, AuthorizationRoles.OpsAdminFull | AuthorizationRoles.OpsAdminLimited))) { return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, 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, true)); } /// /// 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; } //------------ } }