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