def autofill_service_target()

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"]