in elasticapm/traces.py [0:0]
def autofill_service_target(self) -> None:
if self.leaf:
service_target = nested_key(self.context, "service", "target") or {}
if "type" not in service_target: # infer type from span type & subtype
# use sub-type if provided, fallback on type othewise
service_target["type"] = self.subtype or self.type
if "name" not in service_target: # infer name from span attributes
if nested_key(self.context, "db", "instance"): # database spans
service_target["name"] = self.context["db"]["instance"]
elif "message" in self.context: # messaging spans
service_target["name"] = self.context["message"]["queue"]["name"]
elif nested_key(self.context, "http", "url"): # http spans
url = self.context["http"]["url"]
parsed_url = urllib.parse.urlparse(url)
service_target["name"] = parsed_url.hostname
if parsed_url.port:
service_target["name"] += f":{parsed_url.port}"
if "service" not in self.context:
self.context["service"] = {}
self.context["service"]["target"] = service_target
elif nested_key(self.context, "service", "target"):
# non-exit spans should not have service.target.* fields
del self.context["service"]["target"]