|
36 | 36 | from typing import Dict, Optional
|
37 | 37 |
|
38 | 38 | import starlette
|
| 39 | +from starlette.datastructures import Headers |
39 | 40 | from starlette.requests import Request
|
40 | 41 | from starlette.routing import Match, Mount
|
41 | 42 | from starlette.types import ASGIApp, Message
|
@@ -151,6 +152,10 @@ async def wrapped_send(message) -> None:
|
151 | 152 | _mocked_receive = None
|
152 | 153 | _request_receive = None
|
153 | 154 |
|
| 155 | + # begin the transaction before capturing the body to get that time accounted |
| 156 | + trace_parent = TraceParent.from_headers(dict(Headers(scope))) |
| 157 | + self.client.begin_transaction("request", trace_parent=trace_parent) |
| 158 | + |
154 | 159 | if self.client.config.capture_body != "off":
|
155 | 160 |
|
156 | 161 | # When we consume the body from receive, we replace the streaming
|
@@ -234,9 +239,6 @@ async def _request_started(self, request: Request) -> None:
|
234 | 239 | if self.client.config.capture_body != "off":
|
235 | 240 | await get_body(request)
|
236 | 241 |
|
237 |
| - trace_parent = TraceParent.from_headers(dict(request.headers)) |
238 |
| - self.client.begin_transaction("request", trace_parent=trace_parent) |
239 |
| - |
240 | 242 | await set_context(lambda: get_data_from_request(request, self.client.config, constants.TRANSACTION), "request")
|
241 | 243 | transaction_name = self.get_route_name(request) or request.url.path
|
242 | 244 | elasticapm.set_transaction_name("{} {}".format(request.method, transaction_name), override=False)
|
|
0 commit comments