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)