Include request duration in traces

This commit is contained in:
Simon Willison 2019-05-01 16:16:15 -07:00
commit 669fa21a71
2 changed files with 10 additions and 5 deletions

View file

@ -6,6 +6,7 @@ import json
import os
import sys
import threading
import time
import traceback
import urllib.parse
from concurrent import futures
@ -654,6 +655,7 @@ class Datasette:
async def handle_request(self, request, write_callback, stream_callback):
if request.args.get("_trace"):
request["traces"] = []
request["trace_start"] = time.time()
with capture_traces(request["traces"]):
res = await super().handle_request(request, write_callback, stream_callback)
else:
@ -756,7 +758,10 @@ class Datasette:
async def add_traces_to_response(request, response):
if request.get("traces") is None:
return
traces = request["traces"]
traces = {
"duration": time.time() - request["trace_start"],
"queries": request["traces"],
}
if "text/html" in response.content_type and b'</body>' in response.body:
extra = json.dumps(traces, indent=2)
extra_html = "<pre>{}</pre></body>".format(extra).encode("utf8")
@ -765,9 +770,9 @@ class Datasette:
data = json.loads(response.body.decode("utf8"))
if "_traces" not in data:
data["_traces"] = {
"num_traces": len(traces),
"num_traces": len(traces["queries"]),
"traces": traces,
"duration_sum_ms": sum(t[-1] for t in traces),
"duration_sum_ms": sum(t[-1] for t in traces["queries"]),
}
response.body = json.dumps(data).encode("utf8")

View file

@ -1452,5 +1452,5 @@ def test_trace(app_client):
traces = data["_traces"]
assert isinstance(traces["duration_sum_ms"], float)
assert isinstance(traces["num_traces"], int)
assert isinstance(traces["traces"], list)
assert len(traces["traces"]) == traces["num_traces"]
assert isinstance(traces["traces"], dict)
assert len(traces["traces"]["queries"]) == traces["num_traces"]