feat(governance): add track_event for custom telemetry to /runtime/log#1745
feat(governance): add track_event for custom telemetry to /runtime/log#1745viswa-uipath wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Pull request overview
Adds a platform-specific telemetry hook to the uipath-platform governance surface so runtime consumers can emit custom events to the agentic governance ingress (POST .../api/v1/runtime/log), with optional correlation via x-uipath-operation-id.
Changes:
- Add
GovernanceService.track_event()/track_event_async()to POST{eventName, data?}to/runtime/log, withoperation_idfalling back toresolve_trace_id(). - Add
UiPathPlatformGovernanceProvider.track_event()/track_event_async()delegation methods. - Bump
uipath-platformversion0.1.73 → 0.1.74(and lockfile).
Reviewed changes
Copilot reviewed 5 out of 6 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/uipath-platform/src/uipath/platform/governance/_governance_service.py | Adds the new /runtime/log client methods and operation-id header behavior. |
| packages/uipath-platform/src/uipath/platform/governance/_governance_provider.py | Exposes track_event through the provider adapter via thin delegation. |
| packages/uipath-platform/tests/services/test_governance_service.py | Adds sync/async tests covering payload shape, operation-id behavior, override routing, and error paths. |
| packages/uipath-platform/tests/services/test_governance_provider.py | Adds delegation tests for the provider’s sync/async track_event methods. |
| packages/uipath-platform/pyproject.toml | Version bump to 0.1.74. |
| packages/uipath-platform/uv.lock | Lockfile update reflecting the version bump. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…ockfile track_event / track_event_async now reject empty or whitespace-only event_name with a ValueError at call time instead of round-tripping the platform's own 4xx (per Copilot review on #1745). Documented in the Raises section and covered by parametrized tests on both the sync and async variants. Also regenerates packages/uipath/uv.lock so it tracks the bumped uipath-platform 0.1.74 — the prior CI run failed `uv sync --locked` because the lockfile still referenced 0.1.73. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
GovernanceService.track_event(*, event_name, data=None, operation_id=None) posts to /runtime/log, which the server forwards to App Insights as a customEvents row. Both sync and async variants are provided. event_name is validated client-side — empty or whitespace-only values raise ValueError before any URL/header work, so callers fail fast with a clear error instead of round-tripping the platform's 4xx. The optional operation_id becomes the x-uipath-operation-id header that the server stamps as App Insights operation_Id on every emitted event — events sharing an id are queryable together in KQL. When the caller omits operation_id, it falls back to resolve_trace_id() so events from the same agent trace correlate automatically; when no source resolves, the header is omitted and App Insights generates its own id per event. UiPathPlatformGovernanceProvider exposes thin track_event / track_event_async delegates so runtime consumers can emit events through the protocol-adapter surface without importing the platform service directly. Bumps uipath-platform 0.1.73 → 0.1.74. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
f702886 to
73908ab
Compare
|
🚨 Heads up:
|



Summary
Adds
track_eventtoGovernanceServiceandUiPathPlatformGovernanceProviderfor posting custom telemetry events toPOST /agenticgovernance_/api/v1/runtime/log. The server forwards each event to App Insights as acustomEventsrow.GovernanceService.track_event(*, event_name, data=None, operation_id=None)+ async — POSTs{ eventName, data? }to/runtime/log.eventNamemust be non-empty;datais included only when provided.x-uipath-operation-idheader — caller can supplyoperation_idto correlate events from one logical request (becomes App Insightsoperation_Id). When omitted, falls back toresolve_trace_id()so events from the same agent trace correlate automatically. When no source resolves, the header is omitted and App Insights generates its own id per event.UiPathPlatformGovernanceProvider.track_event(*, ...)+ async — thin delegate so runtime consumers can emit events through the protocol-adapter surface without importing the platform service directly.Bumps:
uipath-platform0.1.73 → 0.1.74.Design choices
compensate(*, ...)—track_event(*, event_name, data=None, operation_id=None)follows the same kwarg-only pattern already established on the service; no request-object wrapper.operation_idfallback toresolve_trace_id(), not required — events emitted from inside an OTel-traced agent flow automatically get the canonical trace id as theiroperation_Id. Callers in background pools (where OTel context is thread-local and lost) passoperation_idexplicitly; callers with neither leave App Insights to assign one per event._build_org_scoped_request—UIPATH_SERVICE_URL_AGENTICGOVERNANCEoverride + routing-header injection work for/runtime/logwithout extra plumbing. Override redirects to{override}/api/v1/runtime/logand replaces the platform router's tenant/account headers.track_eventis platform-specific telemetry, not a runtime contract. Adding a protocol can be done later ifuipath-runtimeconsumers need to swap in fakes.@traced(name="governance_track_event", ...)on both sync/async — matches the trace span names already used forretrieve_policyandcompensate.Out of scope (follow-ups)
track_eventif/when a runtime consumer needs constructor-injected fakes.Test plan
ruff check ./ruff format --check .— cleanmypy src tests—Success: no issues found in 201 source filesuipath-platformsuitetrack_event:TestTrackEvent(8): name-only payload;dataincluded when provided; calleroperation_idheader; trace-id fallback viaresolve_trace_id(); caller value wins over fallback; header omitted when no source resolves;UIPATH_ORGANIZATION_IDmissing raisesValueError; HTTP error raisesEnrichedException.TestTrackEventAsync(1): async variant — payload shape + trace-id fallback.TestServiceUrlOverride(+1):UIPATH_SERVICE_URL_AGENTICGOVERNANCEredirects/runtime/logand preservesx-uipath-operation-id.TestDelegation(+2): provider delegation for sync + async.🤖 Generated with Claude Code
Development Packages
uipath