Skip to content
This repository was archived by the owner on Jun 13, 2023. It is now read-only.

Commit dae687d

Browse files
authored
fix(fastapi): request body extraction (#324)
1 parent c0fb31e commit dae687d

2 files changed

Lines changed: 28 additions & 15 deletions

File tree

epsagon/runners/fastapi.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,11 @@ class FastapiRunner(BaseEvent):
3535
RESOURCE_TYPE = 'fastapi'
3636
OPERATION = 'request'
3737

38-
def __init__(self, start_time, request, body):
38+
def __init__(self, start_time, request):
3939
"""
4040
Initialize.
4141
:param start_time: event's start time (epoch).
4242
:param request: the incoming request.
43-
:param body: the body of request.
4443
"""
4544

4645
super(FastapiRunner, self).__init__(start_time)
@@ -62,13 +61,6 @@ def __init__(self, start_time, request, body):
6261
query_params.items()
6362
)
6463

65-
if body:
66-
add_data_if_needed(
67-
self.resource['metadata'],
68-
'Request Data',
69-
body
70-
)
71-
7264
request_headers = dict(request.headers.items())
7365
if request_headers.get(EPSAGON_HEADER):
7466
self.resource['metadata']['http_trace_id'] = request_headers.get(
@@ -81,6 +73,17 @@ def __init__(self, start_time, request, body):
8173
request_headers
8274
)
8375

76+
def update_request_body(self, body):
77+
"""
78+
Adds request body to event
79+
"""
80+
if body:
81+
add_data_if_needed(
82+
self.resource['metadata'],
83+
'Request Data',
84+
body
85+
)
86+
8487
def update_response(self, response):
8588
"""
8689
Adds response data to event.

epsagon/wrappers/fastapi.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import warnings
1010
from fastapi.routing import APIRoute
1111
from fastapi import Request, Response
12+
from starlette.requests import ClientDisconnect
1213

1314
import epsagon.trace
1415
from epsagon.runners.fastapi import FastapiRunner
@@ -52,11 +53,7 @@ async def custom_route_handler(request: Request) -> Response:
5253
runner = None
5354
response = None
5455
try:
55-
body = await request.json()
56-
except json.decoder.JSONDecodeError:
57-
body = ''
58-
try:
59-
runner = FastapiRunner(time.time(), request, json.dumps(body))
56+
runner = FastapiRunner(time.time(), request)
6057
trace.set_runner(runner)
6158
collect_container_metadata(runner.resource['metadata'])
6259
except Exception as exception: # pylint: disable=W0703
@@ -68,7 +65,20 @@ async def custom_route_handler(request: Request) -> Response:
6865
raised_err = exception
6966
traceback_data = get_traceback_data_from_exception(exception)
7067
trace.runner.set_exception(exception, traceback_data)
71-
68+
try:
69+
trace.runner.update_request_body(
70+
json.dumps(await request.json())
71+
)
72+
except json.decoder.JSONDecodeError:
73+
print_debug('Could not JSON-decode request body')
74+
except ClientDisconnect:
75+
print_debug(
76+
'Could not extract request body - client is disconnected'
77+
)
78+
except Exception as exception: # pylint: disable=W0703
79+
print_debug(
80+
'Could not extract request body: {}'.format(exception)
81+
)
7282
try:
7383
if not raised_err and response is not None and runner:
7484
if ignore_request(

0 commit comments

Comments
 (0)