async def _run_app(self, scope, callback): # type: (Any, Any) -> Any is_recursive_asgi_middleware = _asgi_middleware_applied.get(False) if is_recursive_asgi_middleware: try: return await callback() except Exception as exc: _capture_exception(Hub.current, exc) raise exc from None _asgi_middleware_applied.set(True) try: hub = Hub(Hub.current) with auto_session_tracking(hub, session_mode="request"): with hub: with hub.configure_scope() as sentry_scope: sentry_scope.clear_breadcrumbs() sentry_scope._name = "asgi" processor = partial(self.event_processor, asgi_scope=scope) sentry_scope.add_event_processor(processor) ty = scope["type"] if ty in ("http", "websocket"): transaction = Transaction.continue_from_headers( self._get_headers(scope), op="{}.server".format(ty), ) else: transaction = Transaction(op="asgi.server") transaction.name = _DEFAULT_TRANSACTION_NAME transaction.set_tag("asgi.type", ty) with hub.start_transaction( transaction, custom_sampling_context={"asgi_scope": scope}): # XXX: Would be cool to have correct span status, but we # would have to wrap send(). That is a bit hard to do with # the current abstraction over ASGI 2/3. try: return await callback() except Exception as exc: _capture_exception(hub, exc) raise exc from None finally: _asgi_middleware_applied.set(False)
def track_response_data( self, code: Union[str, int], span: Transaction, error: Optional[str] = None, resp: Optional[Response] = None, ) -> None: try: span.set_http_status(int(code)) except ValueError: span.set_status(code) span.set_tag("integration", "slack") is_ok = False # If Slack gives us back a 200 we still want to check the 'ok' param if resp: content_type = resp.headers["content-type"] if content_type == "text/html": is_ok = str(resp.content) == "ok" # If there is an error, Slack just makes the error the entire response. error_option = resp.content else: # The content-type should be "application/json" at this point but we don't check. response = resp.json() is_ok = response.get("ok") error_option = response.get("error") span.set_tag("ok", is_ok) # when 'ok' is False, we can add the error we get back as a tag if not is_ok: span.set_tag("slack_error", error_option) metrics.incr( SLACK_DATADOG_METRIC, sample_rate=1.0, tags={ "ok": is_ok, "status": code }, ) extra = { self.integration_type: self.name, "status_string": str(code), "error": str(error)[:256] if error else None, } extra.update(getattr(self, "logging_context", None) or {}) self.logger.info(f"{self.integration_type}.http_response", extra=extra)