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.