44from typing import Any , Callable , List , Optional
55
66from opentelemetry import context , trace
7+ from opentelemetry .sdk .trace import ReadableSpan , TracerProvider
78from opentelemetry .trace import set_span_in_context
89
910logger = logging .getLogger (__name__ )
@@ -37,14 +38,20 @@ def get_parent_context() -> context.Context:
3738 - Current context as fallback
3839 """
3940 current_span = trace .get_current_span ()
40- has_current_span = current_span is not None and current_span .get_span_context ().is_valid
41+ has_current_span = (
42+ current_span is not None and current_span .get_span_context ().is_valid
43+ )
4144
4245 external_span = UiPathTracingManager .get_external_current_span ()
4346 has_external_span = external_span is not None
4447
4548 # Only one or no spans available
4649 if not has_current_span :
47- return set_span_in_context (external_span ) if has_external_span else context .get_current ()
50+ return (
51+ set_span_in_context (external_span )
52+ if has_external_span
53+ else context .get_current ()
54+ )
4855 if not has_external_span :
4956 return set_span_in_context (current_span )
5057
@@ -55,7 +62,9 @@ def get_parent_context() -> context.Context:
5562 return set_span_in_context (bottom_span )
5663
5764 @staticmethod
58- def _get_bottom_most_span (current_span : Any , external_span : Any ) -> Any :
65+ def _get_bottom_most_span (
66+ current_span : ReadableSpan , external_span : ReadableSpan
67+ ) -> ReadableSpan :
5968 """Determine which span is deeper in the ancestor tree.
6069
6170 Args:
@@ -66,33 +75,85 @@ def _get_bottom_most_span(current_span: Any, external_span: Any) -> Any:
6675 The span that is deeper (closer to the bottom) in the call hierarchy
6776 """
6877 ancestor_spans = UiPathTracingManager .get_ancestor_spans ()
78+
79+ logger .info ("=" * 80 )
80+ logger .info ("Determining bottom-most span..." )
81+
6982 if not ancestor_spans :
83+ logger .info ("No ancestor spans available -> returning external_span" )
84+ logger .info ("=" * 80 )
7085 return external_span
7186
7287 current_span_id = current_span .get_span_context ().span_id
7388 external_span_id = external_span .get_span_context ().span_id
7489
90+ current_parent_id = (
91+ f"{ current_span .parent .span_id :016x} " if current_span .parent else "None"
92+ )
93+ external_parent_id = (
94+ f"{ external_span .parent .span_id :016x} " if external_span .parent else "None"
95+ )
96+
97+ logger .info (
98+ f"current_span: '{ current_span .name } ' (id: { current_span_id :016x} , parent: { current_parent_id } )"
99+ )
100+ logger .info (
101+ f"external_span: '{ external_span .name } ' (id: { external_span_id :016x} , parent: { external_parent_id } )"
102+ )
103+ logger .info (f"Total ancestors: { len (ancestor_spans )} " )
104+
75105 current_index = None
76106 external_index = None
77107
108+ # Log all ancestors in a single line
109+ ancestor_info = " -> " .join (
110+ [f"{ ancestor .name } [{ i } ]" for i , ancestor in enumerate (ancestor_spans )]
111+ )
112+ logger .info (f"Ancestor chain (top to bottom): { ancestor_info } " )
113+
78114 for i , ancestor in enumerate (ancestor_spans ):
79115 ancestor_id = ancestor .get_span_context ().span_id
80116 if ancestor_id == current_span_id :
81117 current_index = i
118+ logger .info (f" Found current_span at index { i } : '{ ancestor .name } '" )
82119 if ancestor_id == external_span_id :
83120 external_index = i
121+ logger .info (f" Found external_span at index { i } : '{ ancestor .name } '" )
84122
85123 # Both in tree: higher index = deeper
86124 if current_index is not None and external_index is not None :
87- return current_span if current_index > external_index else external_span
125+ if current_index > external_index :
126+ logger .info (
127+ f"RESULT: current_span '{ current_span .name } ' is deeper (index { current_index } > { external_index } )"
128+ )
129+ logger .info ("=" * 80 )
130+ return current_span
131+ else :
132+ logger .info (
133+ f"RESULT: external_span '{ external_span .name } ' is deeper (index { external_index } >= { current_index } )"
134+ )
135+ logger .info ("=" * 80 )
136+ return external_span
88137
89138 # Only one in tree: that one is deeper
90139 if current_index is not None :
140+ logger .info (
141+ f"RESULT: Only current_span '{ current_span .name } ' in tree -> returning it"
142+ )
143+ logger .info ("=" * 80 )
91144 return current_span
92145 if external_index is not None :
146+ logger .info (
147+ f"RESULT: Only external_span '{ external_span .name } ' in tree -> returning it"
148+ )
149+ logger .info ("=" * 80 )
93150 return external_span
94151
95152 # Neither in tree: default to external
153+ logger .info (
154+ f"RESULT: Neither span in tree -> defaulting to external_span '{ external_span .name } '"
155+ )
156+ logger .info ("=" * 80 )
96157 return external_span
97158
98159 @staticmethod
0 commit comments