

Chronic - Python Instrumentation - dcraw
https://github.com/davidcrawford/chronic

======
JeffJenkins
This is cool. I implemented an extremely similar system for my last job. The
data was dumped into mongo and then we visualized it with stacked bar graphs.

One thing to consider since you're using a count+total model is that the most
interesting timings will often be the 90th or 99th percentile, so by
calculating averages you might be missing useful information.

I ran into some issues with the implementation after switching to using an
async framework since the code was no longer a series of nested function
calls. Since the current best practice is coroutines where this will still
work I think it's okay, but you should consider how someone using callbacks
might time their code. In my case I was in a hurry so I manually called the
equivalent of your __enter__ and __exit__, but it was pretty ugly and left a
lot of room for bugs.

~~~
dcraw
You're totally right on the averages. I'll add the percentiles but maybe I can
also make it extensible somehow.

I haven't thought about callback code at all... if you have any ideas or
sample code to share, it would be great if you could create a github issue for
it.

Thanks!

------
smilliken
See also:
[http://pycounters.readthedocs.org/en/latest/](http://pycounters.readthedocs.org/en/latest/)

~~~
dcraw
Cool, thanks for the link. I like their logging support.

------
drdaeman
Trivial but useful. Next time, instead of kicking in my own custom timing
decorator (5-liner, but...) I'll probably use this. [Edit: pycounter looks
even nicer, didn't heard of them before, thanks for sharing!]

The only downside I see, it does record function name, but doesn't record
module name (and, for class members, classname). For example, it wouldn't be
too useful to see "authorize" instead of "ppp.common.authorize" in RADIUS
server profiling logs. :)

~~~
dcraw
Yeah, the simplest thing to do would be to add the module name, which I may
do. You can also pass a name parameter to the decorator.

------
armon
We built a similar decorator/context manager for profiling, but it is really
much more useful if you can export the data to statsite + graphite so that you
can graph and view it on an on going basis. The insight into the runtime is
much more valuable when you have historic data to compare it to.

