Centralized logging resource usage for all controller actions
.NET Framework
Create a Custom Action Filter
using System; using System.Diagnostics; using System.Web.Mvc; public class ResourceUsageLoggingFilter : ActionFilterAttribute { private Stopwatch _stopwatch; private long _startMemory; private TimeSpan _startCpuTime; public override void OnActionExecuting(ActionExecutingContext filterContext) { // Start measuring CPU and memory _stopwatch = Stopwatch.StartNew(); var process = Process.GetCurrentProcess(); _startMemory = process.WorkingSet64; _startCpuTime = process.TotalProcessorTime; base.OnActionExecuting(filterContext); } public override void OnActionExecuted(ActionExecutedContext filterContext) { _stopwatch.Stop(); var process = Process.GetCurrentProcess(); var endMemory = process.WorkingSet64; var endCpuTime = process.TotalProcessorTime; // Calculate memory and CPU usage var memoryUsedMb = (endMemory - _startMemory) / (1024 * 1024); var cpuUsedMs = (endCpuTime - _startCpuTime).TotalMilliseconds; // Log if usage exceeds thresholds if (memoryUsedMb > 50 || cpuUsedMs > 100) // Example thresholds { Debug.WriteLine($"High Resource Usage: Action: {filterContext.ActionDescriptor.ActionName}, " + $"Memory: {memoryUsedMb} MB, CPU: {cpuUsedMs} ms, Duration: {_stopwatch.ElapsedMilliseconds} ms"); } base.OnActionExecuted(filterContext); } }
Register the filter in Global.asax
protected void Application_Start() { GlobalFilters.Filters.Add(new ResourceUsageLoggingFilter()); }
Decorate individual controllers or actions with the filter
[ResourceUsageLoggingFilter] public class HomeController : Controller { public ActionResult Index() { return View(); } }
.NET Core
Create Middleware
public class ResourceUsageLoggingMiddleware { private readonly RequestDelegate _next; public ResourceUsageLoggingMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var process = Process.GetCurrentProcess(); var startMemory = process.WorkingSet64; var startCpuTime = process.TotalProcessorTime; var stopwatch = Stopwatch.StartNew(); await _next(context); stopwatch.Stop(); var endMemory = process.WorkingSet64; var endCpuTime = process.TotalProcessorTime; var memoryUsedMb = (endMemory - startMemory) / (1024 * 1024); var cpuUsedMs = (endCpuTime - startCpuTime).TotalMilliseconds; if (memoryUsedMb > 50 || cpuUsedMs > 100) // Example thresholds { Console.WriteLine($"High Resource Usage: Request: {context.Request.Path}, " + $"Memory: {memoryUsedMb} MB, CPU: {cpuUsedMs} ms, Duration: {stopwatch.ElapsedMilliseconds} ms"); } } }
Register the middleware in Startup.cs
public void Configure(IApplicationBuilder app) { app.UseMiddleware<ResourceUsageLoggingMiddleware>(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }