Skip to content

Commit 829dff7

Browse files
authored
Merge pull request #521 from UiPath/fix/decouple_runtime_otel
fix: decouple runtime from tracing
2 parents 90bf68e + 6e0f3f5 commit 829dff7

2 files changed

Lines changed: 33 additions & 40 deletions

File tree

src/uipath/_cli/_runtime/_runtime.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,8 @@
88
from dataclasses import asdict, is_dataclass
99
from typing import Any, Dict, Optional, Type, TypeVar, cast, get_type_hints
1010

11-
from opentelemetry import trace
12-
from opentelemetry.sdk.trace import TracerProvider
13-
from opentelemetry.sdk.trace.export import BatchSpanProcessor
1411
from pydantic import BaseModel
1512

16-
from uipath.tracing import LlmOpsHttpExporter
17-
1813
from ._contracts import (
1914
UiPathBaseRuntime,
2015
UiPathErrorCategory,
@@ -43,11 +38,6 @@ async def execute(self) -> Optional[UiPathRuntimeResult]:
4338
await self.validate()
4439

4540
try:
46-
trace.set_tracer_provider(TracerProvider())
47-
trace.get_tracer_provider().add_span_processor( # type: ignore
48-
BatchSpanProcessor(LlmOpsHttpExporter())
49-
)
50-
5141
if self.context.entrypoint is None:
5242
return None
5343

@@ -74,8 +64,6 @@ async def execute(self) -> Optional[UiPathRuntimeResult]:
7464
f"Error: {str(e)}",
7565
UiPathErrorCategory.SYSTEM,
7666
) from e
77-
finally:
78-
trace.get_tracer_provider().shutdown() # type: ignore
7967

8068
async def validate(self) -> None:
8169
"""Validate runtime inputs."""

src/uipath/_cli/cli_run.py

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from dotenv import load_dotenv
1111

1212
from uipath._cli._utils._debug import setup_debugging
13+
from uipath.tracing import LlmOpsHttpExporter
1314

1415
from .._utils.constants import (
1516
ENV_JOB_ID,
@@ -18,6 +19,7 @@
1819
from ._runtime._contracts import (
1920
UiPathRuntimeContext,
2021
UiPathRuntimeError,
22+
UiPathRuntimeFactory,
2123
UiPathTraceContext,
2224
)
2325
from ._runtime._runtime import UiPathRuntime
@@ -61,39 +63,42 @@ def python_run_middleware(
6163
)
6264

6365
try:
66+
context = UiPathRuntimeContext.from_config(
67+
env.get("UIPATH_CONFIG_PATH", "uipath.json"), **kwargs
68+
)
69+
context.entrypoint = entrypoint
70+
context.input = input
71+
context.resume = resume
72+
context.job_id = env.get("UIPATH_JOB_KEY")
73+
context.trace_id = env.get("UIPATH_TRACE_ID")
74+
context.input_file = kwargs.get("input_file", None)
75+
context.execution_output_file = kwargs.get("execution_output_file", None)
76+
context.is_eval_run = kwargs.get("is_eval_run", False)
77+
context.logs_min_level = env.get("LOG_LEVEL", "INFO")
78+
context.tracing_enabled = env.get("UIPATH_TRACING_ENABLED", True)
79+
context.trace_context = UiPathTraceContext(
80+
trace_id=env.get("UIPATH_TRACE_ID"),
81+
parent_span_id=env.get("UIPATH_PARENT_SPAN_ID"),
82+
root_span_id=env.get("UIPATH_ROOT_SPAN_ID"),
83+
enabled=env.get("UIPATH_TRACING_ENABLED", True),
84+
job_id=env.get("UIPATH_JOB_KEY"),
85+
org_id=env.get("UIPATH_ORGANIZATION_ID"),
86+
tenant_id=env.get("UIPATH_TENANT_ID"),
87+
process_key=env.get("UIPATH_PROCESS_UUID"),
88+
folder_key=env.get("UIPATH_FOLDER_KEY"),
89+
reference_id=env.get("UIPATH_JOB_KEY") or str(uuid4()),
90+
)
91+
92+
runtime_factory = UiPathRuntimeFactory(UiPathRuntime, UiPathRuntimeContext)
93+
94+
if context.job_id:
95+
runtime_factory.add_span_exporter(LlmOpsHttpExporter())
6496

6597
async def execute():
66-
context = UiPathRuntimeContext.from_config(
67-
env.get("UIPATH_CONFIG_PATH", "uipath.json"), **kwargs
68-
)
69-
context.entrypoint = entrypoint
70-
context.input = input
71-
context.resume = resume
72-
context.job_id = env.get("UIPATH_JOB_KEY")
73-
context.trace_id = env.get("UIPATH_TRACE_ID")
74-
context.input_file = kwargs.get("input_file", None)
75-
context.execution_output_file = kwargs.get("execution_output_file", None)
76-
context.is_eval_run = kwargs.get("is_eval_run", False)
77-
context.tracing_enabled = env.get("UIPATH_TRACING_ENABLED", True)
78-
context.trace_context = UiPathTraceContext(
79-
trace_id=env.get("UIPATH_TRACE_ID"),
80-
parent_span_id=env.get("UIPATH_PARENT_SPAN_ID"),
81-
root_span_id=env.get("UIPATH_ROOT_SPAN_ID"),
82-
enabled=env.get("UIPATH_TRACING_ENABLED", True),
83-
job_id=env.get("UIPATH_JOB_KEY"),
84-
org_id=env.get("UIPATH_ORGANIZATION_ID"),
85-
tenant_id=env.get("UIPATH_TENANT_ID"),
86-
process_key=env.get("UIPATH_PROCESS_UUID"),
87-
folder_key=env.get("UIPATH_FOLDER_KEY"),
88-
reference_id=env.get("UIPATH_JOB_KEY") or str(uuid4()),
89-
)
90-
context.logs_min_level = env.get("LOG_LEVEL", "INFO")
91-
async with UiPathRuntime.from_context(context) as runtime:
92-
await runtime.execute()
98+
await runtime_factory.execute(context)
9399

94100
asyncio.run(execute())
95101

96-
# Return success
97102
return MiddlewareResult(should_continue=False)
98103

99104
except UiPathRuntimeError as e:

0 commit comments

Comments
 (0)