uipath 2.0.51__tar.gz → 2.0.53__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of uipath might be problematic. Click here for more details.

Files changed (145) hide show
  1. {uipath-2.0.51 → uipath-2.0.53}/.github/workflows/build.yml +11 -0
  2. {uipath-2.0.51 → uipath-2.0.53}/.github/workflows/publish-dev.yml +12 -1
  3. {uipath-2.0.51 → uipath-2.0.53}/PKG-INFO +3 -2
  4. {uipath-2.0.51 → uipath-2.0.53}/docs/core/getting_started.md +8 -0
  5. {uipath-2.0.51 → uipath-2.0.53}/pyproject.toml +3 -2
  6. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_auth/_auth_server.py +1 -1
  7. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/cli_auth.py +3 -1
  8. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/cli_deploy.py +2 -0
  9. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/cli_init.py +2 -0
  10. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/cli_invoke.py +3 -1
  11. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/cli_new.py +2 -0
  12. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/cli_pack.py +2 -0
  13. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/cli_publish.py +2 -0
  14. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/cli_run.py +6 -1
  15. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_execution_context.py +1 -1
  16. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_folder_context.py +1 -1
  17. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_uipath.py +1 -1
  18. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_utils/constants.py +2 -0
  19. uipath-2.0.53/src/uipath/telemetry/__init__.py +3 -0
  20. uipath-2.0.53/src/uipath/telemetry/_constants.py +16 -0
  21. uipath-2.0.53/src/uipath/telemetry/_track.py +130 -0
  22. {uipath-2.0.51 → uipath-2.0.53}/uv.lock +2033 -1586
  23. {uipath-2.0.51 → uipath-2.0.53}/.cursorrules +0 -0
  24. {uipath-2.0.51 → uipath-2.0.53}/.editorconfig +0 -0
  25. {uipath-2.0.51 → uipath-2.0.53}/.gitattributes +0 -0
  26. {uipath-2.0.51 → uipath-2.0.53}/.github/workflows/cd.yml +0 -0
  27. {uipath-2.0.51 → uipath-2.0.53}/.github/workflows/ci.yml +0 -0
  28. {uipath-2.0.51 → uipath-2.0.53}/.github/workflows/commitlint.yml +0 -0
  29. {uipath-2.0.51 → uipath-2.0.53}/.github/workflows/lint.yml +0 -0
  30. {uipath-2.0.51 → uipath-2.0.53}/.github/workflows/publish-docs.yml +0 -0
  31. {uipath-2.0.51 → uipath-2.0.53}/.github/workflows/slack.yml +0 -0
  32. {uipath-2.0.51 → uipath-2.0.53}/.github/workflows/test.yml +0 -0
  33. {uipath-2.0.51 → uipath-2.0.53}/.gitignore +0 -0
  34. {uipath-2.0.51 → uipath-2.0.53}/.pre-commit-config.yaml +0 -0
  35. {uipath-2.0.51 → uipath-2.0.53}/.python-version +0 -0
  36. {uipath-2.0.51 → uipath-2.0.53}/.vscode/extensions.json +0 -0
  37. {uipath-2.0.51 → uipath-2.0.53}/.vscode/settings.json +0 -0
  38. {uipath-2.0.51 → uipath-2.0.53}/CONTRIBUTING.md +0 -0
  39. {uipath-2.0.51 → uipath-2.0.53}/LICENSE +0 -0
  40. {uipath-2.0.51 → uipath-2.0.53}/README.md +0 -0
  41. {uipath-2.0.51 → uipath-2.0.53}/docs/CONTRIBUTING.md +0 -0
  42. {uipath-2.0.51 → uipath-2.0.53}/docs/assets/favicon.png +0 -0
  43. {uipath-2.0.51 → uipath-2.0.53}/docs/assets/logo-dark.svg +0 -0
  44. {uipath-2.0.51 → uipath-2.0.53}/docs/assets/logo-light.svg +0 -0
  45. {uipath-2.0.51 → uipath-2.0.53}/docs/cli/index.md +0 -0
  46. {uipath-2.0.51 → uipath-2.0.53}/docs/core/actions.md +0 -0
  47. {uipath-2.0.51 → uipath-2.0.53}/docs/core/assets.md +0 -0
  48. {uipath-2.0.51 → uipath-2.0.53}/docs/core/buckets.md +0 -0
  49. {uipath-2.0.51 → uipath-2.0.53}/docs/core/connections.md +0 -0
  50. {uipath-2.0.51 → uipath-2.0.53}/docs/core/context_grounding.md +0 -0
  51. {uipath-2.0.51 → uipath-2.0.53}/docs/core/jobs.md +0 -0
  52. {uipath-2.0.51 → uipath-2.0.53}/docs/core/processes.md +0 -0
  53. {uipath-2.0.51 → uipath-2.0.53}/docs/core/queues.md +0 -0
  54. {uipath-2.0.51 → uipath-2.0.53}/docs/hooks.py +0 -0
  55. {uipath-2.0.51 → uipath-2.0.53}/docs/javascripts/extra.js +0 -0
  56. {uipath-2.0.51 → uipath-2.0.53}/docs/langchain/chat_models.md +0 -0
  57. {uipath-2.0.51 → uipath-2.0.53}/docs/langchain/context_grounding.md +0 -0
  58. {uipath-2.0.51 → uipath-2.0.53}/docs/langchain/human_in_the_loop.md +0 -0
  59. {uipath-2.0.51 → uipath-2.0.53}/docs/overrides/partials/logo.html +0 -0
  60. {uipath-2.0.51 → uipath-2.0.53}/docs/release_policy.md +0 -0
  61. {uipath-2.0.51 → uipath-2.0.53}/docs/stylesheets/extra.css +0 -0
  62. {uipath-2.0.51 → uipath-2.0.53}/justfile +0 -0
  63. {uipath-2.0.51 → uipath-2.0.53}/mkdocs.yml +0 -0
  64. {uipath-2.0.51 → uipath-2.0.53}/py.typed +0 -0
  65. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/__init__.py +0 -0
  66. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/README.md +0 -0
  67. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/__init__.py +0 -0
  68. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_auth/_models.py +0 -0
  69. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  70. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  71. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_auth/_utils.py +0 -0
  72. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_auth/auth_config.json +0 -0
  73. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_auth/index.html +0 -0
  74. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_auth/localhost.crt +0 -0
  75. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_auth/localhost.key +0 -0
  76. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_runtime/_contracts.py +0 -0
  77. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_runtime/_logging.py +0 -0
  78. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  79. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  80. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_templates/.rels.template +0 -0
  81. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  82. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_templates/main.py.template +0 -0
  83. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  84. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_utils/_common.py +0 -0
  85. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_utils/_console.py +0 -0
  86. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_utils/_folders.py +0 -0
  87. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_utils/_input_args.py +0 -0
  88. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  89. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/_utils/_processes.py +0 -0
  90. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/middlewares.py +0 -0
  91. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_cli/spinner.py +0 -0
  92. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_config.py +0 -0
  93. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/__init__.py +0 -0
  94. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/_base_service.py +0 -0
  95. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/actions_service.py +0 -0
  96. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/api_client.py +0 -0
  97. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/assets_service.py +0 -0
  98. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/buckets_service.py +0 -0
  99. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/connections_service.py +0 -0
  100. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/context_grounding_service.py +0 -0
  101. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/folder_service.py +0 -0
  102. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/jobs_service.py +0 -0
  103. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/llm_gateway_service.py +0 -0
  104. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/processes_service.py +0 -0
  105. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_services/queues_service.py +0 -0
  106. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_utils/__init__.py +0 -0
  107. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_utils/_endpoint.py +0 -0
  108. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_utils/_infer_bindings.py +0 -0
  109. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_utils/_logs.py +0 -0
  110. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_utils/_read_overwrites.py +0 -0
  111. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_utils/_request_override.py +0 -0
  112. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_utils/_request_spec.py +0 -0
  113. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/_utils/_user_agent.py +0 -0
  114. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/__init__.py +0 -0
  115. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/action_schema.py +0 -0
  116. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/actions.py +0 -0
  117. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/assets.py +0 -0
  118. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/buckets.py +0 -0
  119. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/connections.py +0 -0
  120. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/context_grounding.py +0 -0
  121. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/context_grounding_index.py +0 -0
  122. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/errors.py +0 -0
  123. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/exceptions.py +0 -0
  124. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/interrupt_models.py +0 -0
  125. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/job.py +0 -0
  126. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/llm_gateway.py +0 -0
  127. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/processes.py +0 -0
  128. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/models/queues.py +0 -0
  129. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/py.typed +0 -0
  130. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/tracing/__init__.py +0 -0
  131. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/tracing/_otel_exporters.py +0 -0
  132. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/tracing/_traced.py +0 -0
  133. {uipath-2.0.51 → uipath-2.0.53}/src/uipath/tracing/_utils.py +0 -0
  134. {uipath-2.0.51 → uipath-2.0.53}/tests/__init__.py +0 -0
  135. {uipath-2.0.51 → uipath-2.0.53}/tests/cli/test_init.py +0 -0
  136. {uipath-2.0.51 → uipath-2.0.53}/tests/conftest.py +0 -0
  137. {uipath-2.0.51 → uipath-2.0.53}/tests/sdk/services/test_llm_integration.py +0 -0
  138. {uipath-2.0.51 → uipath-2.0.53}/tests/sdk/services/test_llm_service.py +0 -0
  139. {uipath-2.0.51 → uipath-2.0.53}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  140. {uipath-2.0.51 → uipath-2.0.53}/tests/sdk/test_config.py +0 -0
  141. {uipath-2.0.51 → uipath-2.0.53}/tests/sdk/test_overwrites.py +0 -0
  142. {uipath-2.0.51 → uipath-2.0.53}/tests/tracing/test_otel_exporters.py +0 -0
  143. {uipath-2.0.51 → uipath-2.0.53}/tests/tracing/test_span_utils.py +0 -0
  144. {uipath-2.0.51 → uipath-2.0.53}/tests/tracing/test_traced.py +0 -0
  145. {uipath-2.0.51 → uipath-2.0.53}/tests/tracing/test_tracing_manager.py +0 -0
@@ -26,6 +26,17 @@ jobs:
26
26
  uv venv
27
27
  uv sync --all-extras
28
28
 
29
+ - name: Replace connection string placeholder
30
+ run: |
31
+ originalfile="src/uipath/telemetry/_constants.py"
32
+ tmpfile=$(mktemp)
33
+ trap 'rm -f "$tmpfile"' EXIT
34
+
35
+ rsync -a --no-whole-file --ignore-existing "$originalfile" "$tmpfile"
36
+ envsubst '$CONNECTION_STRING' < "$originalfile" > "$tmpfile" && mv "$tmpfile" "$originalfile"
37
+ env:
38
+ CONNECTION_STRING: ${{ secrets.APPINS_CONNECTION_STRING }}
39
+
29
40
  - name: Build
30
41
  run: |
31
42
  uv build
@@ -25,6 +25,17 @@ jobs:
25
25
  uv venv
26
26
  uv sync --all-extras
27
27
 
28
+ - name: Replace connection string placeholder
29
+ run: |
30
+ originalfile="src/uipath/telemetry/_constants.py"
31
+ tmpfile=$(mktemp)
32
+ trap 'rm -f "$tmpfile"' EXIT
33
+
34
+ rsync -a --no-whole-file --ignore-existing "$originalfile" "$tmpfile"
35
+ envsubst '$CONNECTION_STRING' < "$originalfile" > "$tmpfile" && mv "$tmpfile" "$originalfile"
36
+ env:
37
+ CONNECTION_STRING: ${{ secrets.APPINS_CONNECTION_STRING }}
38
+
28
39
  - name: Set development version
29
40
  shell: pwsh
30
41
  env:
@@ -116,4 +127,4 @@ jobs:
116
127
  run: |
117
128
  uv publish
118
129
  env:
119
- UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
130
+ UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath
3
- Version: 2.0.51
3
+ Version: 2.0.53
4
4
  Summary: Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools.
5
5
  Project-URL: Homepage, https://uipath.com
6
6
  Project-URL: Repository, https://github.com/UiPath/uipath-python
@@ -14,9 +14,10 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Topic :: Software Development :: Build Tools
16
16
  Requires-Python: >=3.10
17
+ Requires-Dist: azure-monitor-opentelemetry>=1.6.8
17
18
  Requires-Dist: click>=8.1.8
18
19
  Requires-Dist: httpx>=0.28.1
19
- Requires-Dist: opentelemetry-sdk>=1.32.1
20
+ Requires-Dist: opentelemetry-sdk>=1.31.1
20
21
  Requires-Dist: pathlib>=1.0.1
21
22
  Requires-Dist: pydantic>=2.11.1
22
23
  Requires-Dist: python-dotenv>=1.0.1
@@ -87,6 +87,14 @@ uipath version 2.0.29
87
87
 
88
88
  ////
89
89
 
90
+ ### Telemetry
91
+
92
+ To help us improve the developer experience, the CLI collects basic usage data about commands invocation. For more details about UiPath’s privacy practices, please review the [privacy statement](https://www.uipath.com/legal/privacy-policy).
93
+
94
+ #### Disabling telemetry data
95
+
96
+ Telemetry is enabled by default, yet it is possible to opt-out by setting to `false` the `UIPATH_TELEMETRY_ENABLED` environment variable.
97
+
90
98
  ### Authentication
91
99
 
92
100
  To debug your script locally and publish your project, you need to authenticate with UiPath:
@@ -1,19 +1,20 @@
1
1
  [project]
2
2
  name = "uipath"
3
- version = "2.0.51"
3
+ version = "2.0.53"
4
4
  description = "Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools."
5
5
  readme = { file = "README.md", content-type = "text/markdown" }
6
6
  requires-python = ">=3.10"
7
7
  dependencies = [
8
8
  "click>=8.1.8",
9
9
  "httpx>=0.28.1",
10
- "opentelemetry-sdk>=1.32.1",
10
+ "opentelemetry-sdk>=1.31.1",
11
11
  "pydantic>=2.11.1",
12
12
  "python-dotenv>=1.0.1",
13
13
  "tenacity>=9.0.0",
14
14
  "tomli>=2.2.1",
15
15
  "pathlib>=1.0.1",
16
16
  "rich>=13.0.0",
17
+ "azure-monitor-opentelemetry>=1.6.8",
17
18
  ]
18
19
  classifiers = [
19
20
  "Development Status :: 3 - Alpha",
@@ -10,7 +10,7 @@ from dotenv import load_dotenv
10
10
 
11
11
  from ._oidc_utils import get_auth_config
12
12
 
13
- load_dotenv()
13
+ load_dotenv(override=True)
14
14
 
15
15
  # Server port
16
16
  PORT = 6234
@@ -7,6 +7,7 @@ import webbrowser
7
7
  import click
8
8
  from dotenv import load_dotenv
9
9
 
10
+ from ..telemetry import track
10
11
  from ._auth._auth_server import HTTPSServer
11
12
  from ._auth._oidc_utils import get_auth_config, get_auth_url
12
13
  from ._auth._portal_service import PortalService, select_tenant
@@ -14,7 +15,7 @@ from ._auth._utils import update_auth_file, update_env_file
14
15
  from ._utils._common import environment_options
15
16
  from ._utils._console import ConsoleLogger
16
17
 
17
- load_dotenv()
18
+ load_dotenv(override=True)
18
19
  console = ConsoleLogger()
19
20
 
20
21
 
@@ -63,6 +64,7 @@ def set_port():
63
64
  required=False,
64
65
  help="Force new token",
65
66
  )
67
+ @track
66
68
  def auth(domain, force: None | bool = False):
67
69
  """Authenticate with UiPath Cloud Platform."""
68
70
  with console.spinner("Authenticating with UiPath ..."):
@@ -1,6 +1,7 @@
1
1
  # type: ignore
2
2
  import click
3
3
 
4
+ from ..telemetry import track
4
5
  from .cli_pack import pack
5
6
  from .cli_publish import publish
6
7
 
@@ -21,6 +22,7 @@ from .cli_publish import publish
21
22
  help="Whether to publish to the personal workspace",
22
23
  )
23
24
  @click.argument("root", type=str, default="./")
25
+ @track
24
26
  def deploy(root, feed):
25
27
  """Pack and publish the project."""
26
28
  ctx = click.get_current_context()
@@ -7,6 +7,7 @@ from typing import Optional
7
7
 
8
8
  import click
9
9
 
10
+ from ..telemetry import track
10
11
  from ._utils._console import ConsoleLogger
11
12
  from ._utils._input_args import generate_args
12
13
  from ._utils._parse_ast import generate_bindings_json
@@ -52,6 +53,7 @@ def get_user_script(directory: str, entrypoint: Optional[str] = None) -> Optiona
52
53
 
53
54
  @click.command()
54
55
  @click.argument("entrypoint", required=False, default=None)
56
+ @track
55
57
  def init(entrypoint: str) -> None:
56
58
  """Create uipath.json with input/output schemas and bindings."""
57
59
  with console.spinner("Initializing UiPath project ..."):
@@ -14,12 +14,13 @@ try:
14
14
  except ImportError:
15
15
  import tomli as tomllib
16
16
 
17
+ from ..telemetry import track
17
18
  from ._utils._common import get_env_vars
18
19
  from ._utils._folders import get_personal_workspace_info
19
20
  from ._utils._processes import get_release_info
20
21
 
21
22
  logger = logging.getLogger(__name__)
22
- load_dotenv()
23
+ load_dotenv(override=True)
23
24
  console = ConsoleLogger()
24
25
  client = httpx.Client(follow_redirects=True, timeout=30.0)
25
26
 
@@ -50,6 +51,7 @@ def _read_project_details() -> [str, str]:
50
51
  type=click.Path(exists=True),
51
52
  help="File path for the .json input",
52
53
  )
54
+ @track
53
55
  def invoke(
54
56
  entrypoint: Optional[str], input: Optional[str], file: Optional[str]
55
57
  ) -> None:
@@ -4,6 +4,7 @@ import shutil
4
4
 
5
5
  import click
6
6
 
7
+ from ..telemetry import track
7
8
  from ._utils._console import ConsoleLogger
8
9
  from .middlewares import Middlewares
9
10
 
@@ -38,6 +39,7 @@ requires-python = ">=3.10"
38
39
 
39
40
  @click.command()
40
41
  @click.argument("name", type=str, default="")
42
+ @track
41
43
  def new(name: str):
42
44
  """Generate a quick-start project."""
43
45
  directory = os.getcwd()
@@ -12,6 +12,7 @@ try:
12
12
  except ImportError:
13
13
  import tomli as tomllib
14
14
 
15
+ from ..telemetry import track
15
16
  from ._utils._console import ConsoleLogger
16
17
 
17
18
  console = ConsoleLogger()
@@ -366,6 +367,7 @@ def display_project_info(config):
366
367
 
367
368
  @click.command()
368
369
  @click.argument("root", type=str, default="./")
370
+ @track
369
371
  def pack(root):
370
372
  """Pack the project."""
371
373
  version = get_project_version(root)
@@ -6,6 +6,7 @@ import click
6
6
  import httpx
7
7
  from dotenv import load_dotenv
8
8
 
9
+ from ..telemetry import track
9
10
  from ._utils._common import get_env_vars
10
11
  from ._utils._console import ConsoleLogger
11
12
  from ._utils._folders import get_personal_workspace_info
@@ -63,6 +64,7 @@ def get_available_feeds(
63
64
  flag_value="personal",
64
65
  help="Whether to publish to the personal workspace",
65
66
  )
67
+ @track
66
68
  def publish(feed):
67
69
  """Publish the package."""
68
70
  current_path = os.getcwd()
@@ -9,6 +9,10 @@ from uuid import uuid4
9
9
  import click
10
10
  from dotenv import load_dotenv
11
11
 
12
+ from .._utils.constants import (
13
+ ENV_JOB_ID,
14
+ )
15
+ from ..telemetry import track
12
16
  from ._runtime._contracts import (
13
17
  UiPathRuntimeContext,
14
18
  UiPathRuntimeError,
@@ -19,7 +23,7 @@ from ._utils._console import ConsoleLogger
19
23
  from .middlewares import MiddlewareResult, Middlewares
20
24
 
21
25
  console = ConsoleLogger()
22
- load_dotenv()
26
+ load_dotenv(override=True)
23
27
 
24
28
 
25
29
  def python_run_middleware(
@@ -108,6 +112,7 @@ Usage: `uipath run <entrypoint_path> <input_arguments> [-f <input_json_file_path
108
112
  type=click.Path(exists=True),
109
113
  help="File path for the .json input",
110
114
  )
115
+ @track(when=lambda *_a, **_kw: env.get(ENV_JOB_ID) is None)
111
116
  def run(
112
117
  entrypoint: Optional[str], input: Optional[str], resume: bool, file: Optional[str]
113
118
  ) -> None:
@@ -5,7 +5,7 @@ from dotenv import load_dotenv
5
5
 
6
6
  from ._utils.constants import ENV_JOB_ID, ENV_JOB_KEY, ENV_ROBOT_KEY
7
7
 
8
- load_dotenv()
8
+ load_dotenv(override=True)
9
9
 
10
10
 
11
11
  class ExecutionContext:
@@ -10,7 +10,7 @@ from ._utils.constants import (
10
10
  HEADER_FOLDER_PATH,
11
11
  )
12
12
 
13
- load_dotenv()
13
+ load_dotenv(override=True)
14
14
 
15
15
 
16
16
  class FolderContext:
@@ -26,7 +26,7 @@ from ._utils.constants import (
26
26
  )
27
27
  from .models.errors import BaseUrlMissingError, SecretMissingError
28
28
 
29
- load_dotenv()
29
+ load_dotenv(override=True)
30
30
 
31
31
 
32
32
  class UiPath:
@@ -8,6 +8,8 @@ ENV_JOB_KEY = "UIPATH_JOB_KEY"
8
8
  ENV_JOB_ID = "UIPATH_JOB_ID"
9
9
  ENV_ROBOT_KEY = "UIPATH_ROBOT_KEY"
10
10
  ENV_TENANT_ID = "UIPATH_TENANT_ID"
11
+ ENV_ORGANIZATION_ID = "UIPATH_ORGANIZATION_ID"
12
+ ENV_TELEMETRY_ENABLED = "UIPATH_TELEMETRY_ENABLED"
11
13
 
12
14
  # Headers
13
15
  HEADER_FOLDER_KEY = "x-uipath-folderkey"
@@ -0,0 +1,3 @@
1
+ from ._track import track # noqa: D104
2
+
3
+ __all__ = ["track"]
@@ -0,0 +1,16 @@
1
+ _CONNECTION_STRING = ""
2
+
3
+ _APP_INSIGHTS_EVENT_MARKER_ATTRIBUTE = "APPLICATION_INSIGHTS_EVENT_MARKER_ATTRIBUTE"
4
+ _OTEL_RESOURCE_ATTRIBUTES = "OTEL_RESOURCE_ATTRIBUTES"
5
+ _SDK_VERSION = "SdkVersion"
6
+
7
+ _CODE_FILEPATH = "code.filepath"
8
+ _CODE_FUNCTION = "code.function"
9
+ _CODE_LINENO = "code.lineno"
10
+
11
+ _CLOUD_ORG_ID = "CloudOrganizationId"
12
+ _CLOUD_TENANT_ID = "CloudTenantId"
13
+ _CLOUD_URL = "CloudUrl"
14
+ _APP_NAME = "ApplicationName"
15
+
16
+ _UNKNOWN = ""
@@ -0,0 +1,130 @@
1
+ import os
2
+ from functools import wraps
3
+ from importlib.metadata import version
4
+ from logging import INFO, LogRecord, getLogger
5
+ from typing import Any, Callable, Dict, Optional, Union
6
+
7
+ from azure.monitor.opentelemetry import configure_azure_monitor
8
+ from opentelemetry.sdk._logs import LoggingHandler
9
+ from opentelemetry.util.types import Attributes
10
+
11
+ from .._utils.constants import (
12
+ ENV_BASE_URL,
13
+ ENV_ORGANIZATION_ID,
14
+ ENV_TELEMETRY_ENABLED,
15
+ ENV_TENANT_ID,
16
+ )
17
+ from ._constants import (
18
+ _APP_INSIGHTS_EVENT_MARKER_ATTRIBUTE,
19
+ _APP_NAME,
20
+ _CLOUD_ORG_ID,
21
+ _CLOUD_TENANT_ID,
22
+ _CLOUD_URL,
23
+ _CODE_FILEPATH,
24
+ _CODE_FUNCTION,
25
+ _CODE_LINENO,
26
+ _CONNECTION_STRING,
27
+ _OTEL_RESOURCE_ATTRIBUTES,
28
+ _SDK_VERSION,
29
+ _UNKNOWN,
30
+ )
31
+
32
+ _logger = getLogger(__name__)
33
+ _logger.propagate = False
34
+
35
+
36
+ class _AzureMonitorOpenTelemetryEventHandler(LoggingHandler):
37
+ @staticmethod
38
+ def _get_attributes(record: LogRecord) -> Attributes:
39
+ attributes = dict(LoggingHandler._get_attributes(record) or {})
40
+ attributes[_APP_INSIGHTS_EVENT_MARKER_ATTRIBUTE] = True
41
+ attributes[_CLOUD_TENANT_ID] = os.getenv(ENV_TENANT_ID, _UNKNOWN)
42
+ attributes[_CLOUD_ORG_ID] = os.getenv(ENV_ORGANIZATION_ID, _UNKNOWN)
43
+ attributes[_CLOUD_URL] = os.getenv(ENV_BASE_URL, _UNKNOWN)
44
+ attributes[_APP_NAME] = "UiPath.Sdk"
45
+ attributes[_SDK_VERSION] = version("uipath")
46
+
47
+ if _CODE_FILEPATH in attributes:
48
+ del attributes[_CODE_FILEPATH]
49
+ if _CODE_FUNCTION in attributes:
50
+ del attributes[_CODE_FUNCTION]
51
+ if _CODE_LINENO in attributes:
52
+ del attributes[_CODE_LINENO]
53
+
54
+ return attributes
55
+
56
+
57
+ class _TelemetryClient:
58
+ """A class to handle telemetry."""
59
+
60
+ _initialized = False
61
+ _enabled = os.getenv(ENV_TELEMETRY_ENABLED, "true").lower() == "true"
62
+
63
+ @staticmethod
64
+ def _initialize():
65
+ """Initialize the telemetry client."""
66
+ if _TelemetryClient._initialized or not _TelemetryClient._enabled:
67
+ return
68
+
69
+ try:
70
+ os.environ[_OTEL_RESOURCE_ATTRIBUTES] = (
71
+ "service.name=uipath-sdk,service.instance.id=" + version("uipath")
72
+ )
73
+ os.environ["OTEL_TRACES_EXPORTER"] = "none"
74
+
75
+ configure_azure_monitor(
76
+ connection_string=_CONNECTION_STRING,
77
+ disable_offline_storage=True,
78
+ )
79
+
80
+ _logger.addHandler(_AzureMonitorOpenTelemetryEventHandler())
81
+ _logger.setLevel(INFO)
82
+
83
+ _TelemetryClient._initialized = True
84
+ except Exception:
85
+ pass
86
+
87
+ @staticmethod
88
+ def _track_method(name: str, attrs: Optional[Dict[str, Any]] = None):
89
+ """Track function invocations."""
90
+ if not _TelemetryClient._enabled:
91
+ return
92
+
93
+ _TelemetryClient._initialize()
94
+
95
+ _logger.info(f"Sdk.{name.capitalize()}", extra=attrs)
96
+
97
+
98
+ def track(
99
+ name_or_func: Optional[Union[str, Callable[..., Any]]] = None,
100
+ *,
101
+ when: Optional[Union[bool, Callable[..., bool]]] = True,
102
+ extra: Optional[Dict[str, Any]] = None,
103
+ ):
104
+ """Decorator that will trace function invocations.
105
+
106
+ Args:
107
+ name_or_func: The name of the event to track or the function itself.
108
+ extra: Extra attributes to add to the telemetry event.
109
+ """
110
+
111
+ def decorator(func: Callable[..., Any]):
112
+ @wraps(func)
113
+ def wrapper(*args, **kwargs):
114
+ event_name = (
115
+ name_or_func if isinstance(name_or_func, str) else func.__name__
116
+ )
117
+
118
+ should_track = when(*args, **kwargs) if callable(when) else when
119
+
120
+ if should_track:
121
+ _TelemetryClient._track_method(event_name, extra)
122
+
123
+ return func(*args, **kwargs)
124
+
125
+ return wrapper
126
+
127
+ if callable(name_or_func):
128
+ return decorator(name_or_func)
129
+
130
+ return decorator