Amitabh
Amitabh

Reputation: 61167

How to get the request processing time in Asp.net mvc?

I want to log the request processing time for Asp.Net MVC application. I can get 'time-taken' from IIS logs but this time includes the network time taken to send the response back to client browser. I am only interested in the time taken to preocess the request by asp.net worker process.

I have an option of writting a HttpModule but I can not control the order of running of HttpModules.

Update - 1:

I need to log the processing-time for all the requests. The requests are slow only for some users which I am not able to reproduce when I request the page. 'MiniProfiler' and 'Glimpse' will not give me the 'procssing-time' for all the requests by different users.

Update - 2:

Filters will give me 'time-taken' only by Controller. It will not cover the 'time-taken' by various 'HttpModules' pluged in into the Asp.Net app

Upvotes: 2

Views: 3342

Answers (2)

Donald
Donald

Reputation: 542

You can create a filter to intercept action execution time.

 public class ActionTiming :ActionFilterAttribute {
    private static readonly ILog Logger = LogManager.GetLogger("TimingLogger");
    private string controllerName = string.Empty;
    private string actionName = string.Empty;

    private Stopwatch intertime = Stopwatch.StartNew();
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        intertime.Restart();
        controllerName = filterContext.RouteData.Values["controller"].ToString();
        actionName = filterContext.RouteData.Values["action"].ToString();
        var message = string.Format("{0} controller: {1} action: {2}", "OnActionExecuting", controllerName, actionName);
        Logger.Info(message);

    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {

        var message = string.Format("{0} controller: {1} action: {2}, time (ms): {3}", "OnResultExecuted", controllerName, actionName, intertime.ElapsedMilliseconds);
        Logger.Info(message);
    }


}

Then, you can register this filter globally in Application_Start or use it as attribute.

Upvotes: 1

Chris Pratt
Chris Pratt

Reputation: 239250

One simple option would be to use something like Miniprofiler. There's documentation that shows you how to tie it into MVC properly.

However, if this type of metric is truly meaningful to track long term, I'd suggest looking into something like New Relic, or any other APM (application performance monitoring) solution.

You can also check out Glimpse. It doesn't so much log as just show you all the pertinent statistics as you browse around. It's also more suited to development than running on a production server, though you can potentially run it in production if you choose.

Upvotes: 1

Related Questions