Skip to content

Commit c923db8

Browse files
Merge pull request #256 from askui/fix/tracing
fix: clean up otel tracing and add workspace ID to trace resource
2 parents a5318c8 + 07fe1c2 commit c923db8

File tree

5 files changed

+82
-28
lines changed

5 files changed

+82
-28
lines changed

docs/09_observability_telemetry_tracing.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ Set the following environment variables to configure tracing. All variables use
9292
| `ASKUI__OTEL_ENDPOINT` | OTLP HTTP endpoint URL ||
9393
| `ASKUI__OTEL_SERVICE_NAME` | Service name reported in traces | `askui-python-sdk` |
9494
| `ASKUI__OTEL_SERVICE_VERSION` | Service version reported in traces | Current package version |
95-
| `ASKUI__OTEL_CLUSTER_NAME` | Cluster name reported in traces | `askui-dev` |
9695

9796
#### Linux & MacOS
9897
```bash
@@ -132,7 +131,6 @@ from askui.telemetry.otel import OtelSettings
132131

133132
settings = OtelSettings(
134133
enabled=True,
135-
service_name="my-custom-service",
136-
cluster_name="production",
134+
service_name="my-custom-service"
137135
)
138136
```

pdm.lock

Lines changed: 56 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,6 @@ otel = [
228228
"opentelemetry-api>=1.38.0",
229229
"opentelemetry-exporter-otlp-proto-http>=1.38.0",
230230
"opentelemetry-instrumentation-httpx>=0.59b0",
231-
"opentelemetry-instrumentation-sqlalchemy>=0.59b0",
232231
]
233232
vertex = [
234233
"google-cloud-aiplatform>=1.122.0",

src/askui/models/shared/conversation.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,7 @@ def _execute_step(self) -> bool:
291291
self._switch_speaker_if_needed()
292292

293293
# 2. Get next message(s) from speaker and add to history
294-
logger.debug("Executing step with speaker: %s", self.current_speaker.name)
295-
result: SpeakerResult = self.current_speaker.handle_step(
296-
self, self.cache_manager
297-
)
298-
for message in result.messages_to_add:
299-
self._add_message(message)
294+
result = self._get_next_message()
300295

301296
# 3. Execute tool calls if applicable
302297
continue_loop = False
@@ -318,6 +313,16 @@ def _execute_step(self) -> bool:
318313

319314
return continue_loop
320315

316+
@tracer.start_as_current_span("_get_next_message")
317+
def _get_next_message(self) -> SpeakerResult:
318+
logger.debug("Executing step with speaker: %s", self.current_speaker.name)
319+
result: SpeakerResult = self.current_speaker.handle_step(
320+
self, self.cache_manager
321+
)
322+
for message in result.messages_to_add:
323+
self._add_message(message)
324+
return result
325+
321326
@tracer.start_as_current_span("_execute_tools_if_present")
322327
def _execute_tools_if_present(self, message: MessageParam) -> MessageParam | None:
323328
"""Execute tools if the message contains tool use blocks.

src/askui/telemetry/otel.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from opentelemetry.sdk.resources import Resource
66
from opentelemetry.sdk.trace import TracerProvider
77
from opentelemetry.sdk.trace.export import BatchSpanProcessor
8-
from pydantic import Field, SecretStr, model_validator
8+
from pydantic import AliasChoices, Field, SecretStr, model_validator
99
from pydantic_settings import BaseSettings, SettingsConfigDict
1010
from typing_extensions import Self
1111

@@ -21,6 +21,7 @@ class OtelSettings(BaseSettings):
2121
env_prefix="ASKUI__OTEL_",
2222
case_sensitive=False,
2323
extra="ignore",
24+
validate_by_name=True,
2425
)
2526

2627
enabled: bool = Field(default=False)
@@ -38,7 +39,11 @@ class OtelSettings(BaseSettings):
3839
default=None,
3940
description="OTLP endpoint URL.",
4041
)
41-
cluster_name: str = Field(default="askui-dev")
42+
workspace_id: str | None = Field(
43+
default=None,
44+
validation_alias=AliasChoices("ASKUI_WORKSPACE_ID", "askui_workspace_id"),
45+
description="AskUI workspace ID. Read from ASKUI_WORKSPACE_ID env var.",
46+
)
4247

4348
@model_validator(mode="after")
4449
def validate_secret_when_enabled(self) -> Self:
@@ -71,23 +76,20 @@ def setup_opentelemetry_tracing(settings: OtelSettings) -> None:
7176
from opentelemetry.instrumentation.httpx import (
7277
HTTPXClientInstrumentor,
7378
)
74-
from opentelemetry.instrumentation.sqlalchemy import (
75-
SQLAlchemyInstrumentor,
76-
)
7779
except ImportError:
7880
logger.exception("Failed to set up OpenTelemetry Tracing.")
7981
return
8082

8183
if not settings.enabled:
8284
return
8385

84-
resource = Resource.create(
85-
{
86-
"service.name": settings.service_name,
87-
"service.version": settings.service_version,
88-
"cluster.name": settings.cluster_name,
89-
}
90-
)
86+
resource_attributes: dict[str, str] = {
87+
"service.name": settings.service_name,
88+
"service.version": settings.service_version,
89+
}
90+
if settings.workspace_id:
91+
resource_attributes["askui.workspace.id"] = settings.workspace_id
92+
resource = Resource.create(resource_attributes)
9193
provider = TracerProvider(resource=resource)
9294

9395
base: str = settings.user + ":" + settings.secret.get_secret_value() # type: ignore
@@ -104,4 +106,3 @@ def setup_opentelemetry_tracing(settings: OtelSettings) -> None:
104106
trace.set_tracer_provider(provider)
105107

106108
HTTPXClientInstrumentor().instrument()
107-
SQLAlchemyInstrumentor().instrument()

0 commit comments

Comments
 (0)