def call()

in elasticapm/instrumentation/packages/azure.py [0:0]


    def call(self, module, method, wrapped, instance, args, kwargs):
        if len(args) == 1:
            request = args[0]
        else:
            request = kwargs["request"]

        if hasattr(request, "url"):  # Azure Storage HttpRequest
            parsed_url = urllib.parse.urlparse(request.url)
            hostname = parsed_url.hostname
            port = parsed_url.port
            path = parsed_url.path
            query_params = urllib.parse.parse_qs(parsed_url.query)
        else:  # CosmosDB HTTPRequest
            hostname = request.host
            port = hostname.split(":")[1] if ":" in hostname else 80
            path = request.path
            query_params = request.query

        # Detect the service
        service = None
        if ".blob.core." in hostname:
            service = "azureblob"
            service_type = "storage"
        elif ".queue.core." in hostname:
            service = "azurequeue"
            service_type = "messaging"
        elif ".table.core." in hostname:
            service = "azuretable"
            service_type = "storage"
        elif ".file.core." in hostname:
            service = "azurefile"
            service_type = "storage"

        # Do not create a span if we don't recognize the service
        if not service:
            return wrapped(*args, **kwargs)

        context = {
            "destination": {
                "address": hostname,
                "port": port,
            }
        }

        handler_info = handlers[service](request, hostname, path, query_params, service, service_type, context)

        with capture_span(
            handler_info.signature,
            span_type=handler_info.span_type,
            leaf=True,
            span_subtype=handler_info.span_subtype,
            span_action=handler_info.span_action,
            extra=handler_info.context,
        ):
            return wrapped(*args, **kwargs)