in elasticapm/contrib/sanic/__init__.py [0:0]
def _setup_request_handler(self, entity: AllMiddlewareGroup) -> None:
"""
This method is used to setup a series of Sanic Application level middleware so that they can be applied to all
the routes being registered under the app easily.
:param entity: entity: Sanic APP or Blueprint or BlueprintGroup Kind of resource
:return: None
"""
@entity.middleware("request")
async def _instrument_request(request: Request) -> None:
if not self._client.should_ignore_url(url=request.path):
trace_parent = TraceParent.from_headers(headers=request.headers)
self._client.begin_transaction("request", trace_parent=trace_parent)
await set_context(
lambda: get_request_info(
config=self._client.config, request=request, event_type=constants.TRANSACTION
),
"request",
)
self._setup_transaction_name(request=request)
if self._user_context_callback:
name, email, uid = await self._user_context_callback(request)
set_user_context(username=name, email=email, user_id=uid)
await self._setup_custom_context(request=request)
if self._label_info_callback:
labels = await self._label_info_callback(request)
label(**labels)
# noinspection PyUnusedLocal
@entity.middleware("response")
async def _instrument_response(request: Request, response: HTTPResponse) -> None:
await set_context(
lambda: get_response_info(
config=self._client.config, response=response, event_type=constants.TRANSACTION
),
"response",
)
self._setup_transaction_name(request=request)
result = f"HTTP {response.status // 100}xx"
set_transaction_result(result=result, override=False)
set_transaction_outcome(http_status_code=response.status, override=False)
elastic_context(data={"status_code": response.status}, key="response")
self._client.end_transaction()