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

View file

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