"""Opt-in HTTP-associated SQL diagnostics, never enabled during benchmarks."""
import json
import os
import time
from django.db import connection
class SQLTraceMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
statements = {}
def capture(execute, sql, params, many, context):
start = time.perf_counter_ns()
error = None
try:
return execute(sql, params, many, context)
except Exception as exc:
error = type(exc).__name__
raise
finally:
key = (sql, error)
item = statements.setdefault(key, {"sql": sql, "duration_ns": 0,
"error": error, "calls": 0})
item["calls"] += 1
item["duration_ns"] += time.perf_counter_ns() - start
with connection.execute_wrapper(capture):
response = self.get_response(request)
record = {"request_id": request.headers.get("X-Harness-Request", ""),
"method": request.method, "path": request.path,
"status": response.status_code,
"count": sum(item["calls"] for item in statements.values()),
"statements": list(statements.values())}
# A single append syscall prevents worker records from interleaving.
fd = os.open(os.environ["SQL_TRACE"], os.O_WRONLY | os.O_CREAT | os.O_APPEND, 0o600)
try:
os.write(fd, (json.dumps(record) + "\n").encode())
finally:
os.close(fd)
return response