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); } } }