Meme Generation API
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Kynareth/src/Attributes/EndpointMetrics.cs

77 lines
1.6 KiB

using System.Diagnostics;
using System.Text;
using Exsersewo.Common.Extensions;
using Kynareth.Helpers;
using Kynareth.Models;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Primitives;
using StatsdClient;
namespace Kynareth.Attributes;
public class EndpointMetricsAttribute : ActionFilterAttribute
{
public string EndpointMetricName;
private Stopwatch watch = new Stopwatch();
public EndpointMetricsAttribute(string metricName)
{
EndpointMetricName = metricName;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
#if DEBUG
Debug.WriteLine("Executing");
#endif
watch.Restart();
watch.Start();
}
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
watch.Stop();
#if DEBUG
Debug.WriteLine("Executed");
#endif
string key = context.HttpContext.Request.GetToken();
if (!string.IsNullOrWhiteSpace(key))
{
using var database = context.HttpContext.RequestServices.GetRequiredService<KynarethDbContext>();
var token = database.Tokens.FirstOrDefault(x => x.Token.Equals(key));
if (token is not null)
{
token.ApiCalls.Add(new()
{
TimeStamp = DateTime.UtcNow,
Route = EndpointMetricName
});
database.SaveChanges();
}
}
string environment = new StringBuilder("environment:")
#if DEBUG
.Append("dev")
#else
.Append("production")
#endif
.ToString();
DogStatsd.Gauge(EndpointMetricName, watch.Elapsed.TotalSeconds, tags: new[] { environment });
DogStatsd.Increment(EndpointMetricName, tags: new[] { environment });
}
}