|
8 | 8 | from datetime import datetime |
9 | 9 | from os import environ as env |
10 | 10 | from typing import Any, Dict, Optional |
| 11 | +from zoneinfo import ZoneInfo |
11 | 12 |
|
12 | 13 | from opentelemetry.sdk.trace import ReadableSpan |
13 | 14 | from opentelemetry.trace import StatusCode |
14 | 15 |
|
15 | 16 | logger = logging.getLogger(__name__) |
16 | 17 |
|
17 | 18 |
|
| 19 | +def _simple_serialize_defaults(obj): |
| 20 | + if hasattr(obj, "model_dump"): |
| 21 | + return obj.model_dump(exclude_none=True, mode="json") |
| 22 | + if hasattr(obj, "dict"): |
| 23 | + return obj.dict() |
| 24 | + if hasattr(obj, "to_dict"): |
| 25 | + return obj.to_dict() |
| 26 | + |
| 27 | + if isinstance(obj, (set, tuple)): |
| 28 | + if hasattr(obj, "_asdict") and callable(obj._asdict): |
| 29 | + return obj._asdict() |
| 30 | + return list(obj) |
| 31 | + |
| 32 | + if isinstance(obj, datetime.datetime): |
| 33 | + return obj.isoformat() |
| 34 | + |
| 35 | + if isinstance(obj, (datetime.timezone, ZoneInfo)): |
| 36 | + return obj.tzname(None) |
| 37 | + |
| 38 | + return str(obj) |
| 39 | + |
| 40 | + |
18 | 41 | @dataclass |
19 | 42 | class UiPathSpan: |
20 | 43 | """Represents a span in the UiPath tracing system.""" |
@@ -233,7 +256,7 @@ def format_args_for_trace_json( |
233 | 256 | ) -> str: |
234 | 257 | """Return a JSON string of inputs from the function signature.""" |
235 | 258 | result = _SpanUtils.format_args_for_trace(signature, *args, **kwargs) |
236 | | - return json.dumps(result, default=str) |
| 259 | + return json.dumps(result, default=_simple_serialize_defaults) |
237 | 260 |
|
238 | 261 | @staticmethod |
239 | 262 | def format_args_for_trace( |
|
0 commit comments