[PATCH] base: add request time to footer

Mads Kiilerich mads at kiilerich.com
Tue Mar 31 17:56:17 EDT 2015


On 03/31/2015 07:46 PM, Thomas De Schampheleire wrote:
> On March 31, 2015 5:05:01 PM CEST, Mads Kiilerich <mads at kiilerich.com> wrote:
>> On 03/31/2015 05:00 PM, Thomas De Schampheleire wrote:
>>> # HG changeset patch
>>> # User Thomas De Schampheleire <thomas.de.schampheleire at gmail.com>
>>> # Date 1427813112 -7200
>>> #      Tue Mar 31 16:45:12 2015 +0200
>>> # Node ID 66accc3fb9a93d6e704177c80ea7500f1a34f02b
>>> # Parent  de5eaaad471f2c746a1b1fed0022a483284d243c
>>> base: add request time to footer
>>>
>>> Currently, the time to handle a request is only shown in the log,
>> while it is
>>> more readily useful when part of the page itself. Use a simple string
>>> substitution to replace the time before finalizing the request.
>>>
>>> diff --git a/kallithea/lib/middleware/wrapper.py
>> b/kallithea/lib/middleware/wrapper.py
>>> --- a/kallithea/lib/middleware/wrapper.py
>>> +++ b/kallithea/lib/middleware/wrapper.py
>>> @@ -40,10 +40,12 @@ class RequestWrapper(object):
>>>        def __call__(self, environ, start_response):
>>>            start = time.time()
>>>            try:
>>> -            return self.application(environ, start_response)
>>> +            response = self.application(environ, start_response)
>>>            finally:
>>>                log = logging.getLogger('kallithea.' +
>> self.__class__.__name__)
>>> +            total = time.time() - start
>>>                log.info('IP: %s Request to %s time: %.3fs' % (
>>>                    _get_ip_addr(environ),
>>> -                safe_unicode(_get_access_path(environ)), time.time()
>> - start)
>>> +                safe_unicode(_get_access_path(environ)), total)
>>>                )
>>> +            return
>> ''.join(response).replace('%##kallithea_request_time##%', '%.3fs' %
>> total)
>>
>> Response is an iterator that can stream the content without buffering
>> everything in memory. Joining it together into one string would lose
>> that nice property.
> I took that part from the existing profiling code.

The existing profile code is opt-in. This feature could perhaps be done 
the same way.

It could probably even be done with .ini filter-with and thus be 
configuration of completely independent WSGI middleware.

(Note also that some other optional middleware (static_files) also 
introduce full buffering and can have huge influence on the server 
performance.)

> What about doing the replacement on each piece individually? Could it be done with a generator?
> Do you see another solution?

I guess the templater could be tricked into inserting the current time 
when it is yielding the footer.

> What do you think about the general idea of adding the request time to the page?

I don't think it would have any value at all. It would not add any value 
to the user. If I want profiling on the client side, I would use a 
browser feature/plugin that can tell me much more and be much closer to 
the truth. If I want profiling on the server side, I already have it.

/Mads


More information about the kallithea-general mailing list