38 lines
1.4 KiB
C#
38 lines
1.4 KiB
C#
using System.Diagnostics;
|
|
using System.Net;
|
|
using System.Web.Http.Controllers;
|
|
using System.Web.Http.Filters;
|
|
using Prometheus;
|
|
|
|
namespace VECV_WebApi.Filters
|
|
{
|
|
public class MetricsFilterAttribute : ActionFilterAttribute
|
|
{
|
|
private static readonly Counter RequestCounter = Metrics.CreateCounter(
|
|
"app_http_requests_total", "Total HTTP requests", new[] { "method", "endpoint", "status_code" });
|
|
|
|
private static readonly Histogram ResponseTime = Metrics.CreateHistogram(
|
|
"app_http_response_duration_seconds", "API response time", new[] { "endpoint" });
|
|
|
|
private Stopwatch _timer;
|
|
|
|
public override void OnActionExecuting(HttpActionContext actionContext)
|
|
{
|
|
_timer = Stopwatch.StartNew();
|
|
}
|
|
|
|
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
|
|
{
|
|
_timer.Stop();
|
|
var request = actionExecutedContext.Request;
|
|
var response = actionExecutedContext.Response;
|
|
var endpoint = request.RequestUri.AbsolutePath;
|
|
var method = request.Method.Method;
|
|
var status = ((int)(response?.StatusCode ?? HttpStatusCode.InternalServerError)).ToString();
|
|
|
|
RequestCounter.Labels(method, endpoint, status).Inc();
|
|
ResponseTime.Labels(endpoint).Observe(_timer.Elapsed.TotalSeconds);
|
|
}
|
|
}
|
|
}
|