Skip to content

Commit 67f7cb4

Browse files
committed
Handle 500s in request summary exception handler
- use new function to format fields
1 parent 3a51f56 commit 67f7cb4

File tree

1 file changed

+34
-27
lines changed

1 file changed

+34
-27
lines changed

src/app/api.py

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,40 @@
4949
app.add_middleware(SentryAsgiMiddleware)
5050

5151

52+
def format_log_fields(request, request_time, status_code):
53+
current_time = time.time()
54+
fields = {
55+
"agent": request.headers.get("User-Agent"),
56+
"path": request.url.path,
57+
"method": request.method,
58+
"lang": request.headers.get("Accept-Language"),
59+
"querystring": dict(request.query_params),
60+
"errno": 0,
61+
"t": int((current_time - request_time) * 1000.0),
62+
"time": datetime.fromtimestamp(current_time).isoformat(),
63+
"status_code": status_code,
64+
}
65+
return fields
66+
67+
68+
@app.middleware("http")
69+
async def request_summary(request: Request, call_next):
70+
"""Middleware to log request info"""
71+
summary_logger = logging.getLogger("request.summary")
72+
request_time = time.time()
73+
try:
74+
response = await call_next(request)
75+
log_fields = format_log_fields(
76+
request, request_time, status_code=response.status_code
77+
)
78+
summary_logger.info("", extra=log_fields)
79+
return response
80+
except Exception as exc:
81+
log_fields = format_log_fields(request, request_time, status_code=500)
82+
summary_logger.info(exc, extra=log_fields)
83+
raise
84+
85+
5286
@app.get("/", include_in_schema=False)
5387
def root():
5488
"""Expose key configuration"""
@@ -64,33 +98,6 @@ def root():
6498
}
6599

66100

67-
@app.middleware("http")
68-
async def request_summary(request: Request, call_next):
69-
"""Middleware to log request info"""
70-
summary_logger = logging.getLogger("request.summary")
71-
previous_time = time.time()
72-
73-
infos = {
74-
"agent": request.headers.get("User-Agent"),
75-
"path": request.url.path,
76-
"method": request.method,
77-
"lang": request.headers.get("Accept-Language"),
78-
"querystring": dict(request.query_params),
79-
"errno": 0,
80-
}
81-
82-
response = await call_next(request)
83-
84-
current = time.time()
85-
duration = int((current - previous_time) * 1000.0)
86-
isotimestamp = datetime.fromtimestamp(current).isoformat()
87-
infos = {"time": isotimestamp, "code": response.status_code, "t": duration, **infos}
88-
89-
summary_logger.info("", extra=infos)
90-
91-
return response
92-
93-
94101
@app.post("/bugzilla_webhook")
95102
def bugzilla_webhook(
96103
request: BugzillaWebhookRequest = Body(..., embed=False),

0 commit comments

Comments
 (0)