diff --git a/changelog/3449.changed.md b/changelog/3449.changed.md index d06ad37c4..d5ea2f6d7 100644 --- a/changelog/3449.changed.md +++ b/changelog/3449.changed.md @@ -1 +1 @@ -- Renamed tracing span attribute `system` to `system_instructions` to align with the OpenTelemetry GenAI semantic conventions. +- Renamed tracing span attributes to align with OpenTelemetry GenAI semantic conventions: `gen_ai.system` to `gen_ai.provider.name`, `system` to `gen_ai.system_instructions`, `gen_ai.usage.cache_read_input_tokens` to `gen_ai.usage.cache_read.input_tokens`, and `gen_ai.usage.cache_creation_input_tokens` to `gen_ai.usage.cache_creation.input_tokens`. diff --git a/src/pipecat/utils/tracing/service_attributes.py b/src/pipecat/utils/tracing/service_attributes.py index 1a6537f2b..e5cf4a83f 100644 --- a/src/pipecat/utils/tracing/service_attributes.py +++ b/src/pipecat/utils/tracing/service_attributes.py @@ -25,20 +25,20 @@ if is_tracing_available(): from opentelemetry.trace import Span -def _get_gen_ai_system_from_service_name(service_name: str) -> str: - """Extract the standardized gen_ai.system value from a service class name. +def _get_provider_name_from_service_name(service_name: str) -> str: + """Extract the standardized gen_ai.provider.name value from a service class name. Source: - https://opentelemetry.io/docs/specs/semconv/attributes-registry/gen-ai/#gen-ai-system + https://opentelemetry.io/docs/specs/semconv/attributes-registry/gen-ai/ Uses standard OTel names where possible, with special case mappings for service names that don't follow the pattern. Args: - service_name: The service class name to extract system name from. + service_name: The service class name to extract provider name from. Returns: - The standardized gen_ai.system value. + The standardized gen_ai.provider.name value. """ SPECIAL_CASE_MAPPINGS = { # AWS @@ -91,7 +91,7 @@ def add_tts_span_attributes( **kwargs: Additional attributes to add. """ # Add standard attributes - span.set_attribute("gen_ai.system", service_name.replace("TTSService", "").lower()) + span.set_attribute("gen_ai.provider.name", service_name.replace("TTSService", "").lower()) span.set_attribute("gen_ai.request.model", model) span.set_attribute("gen_ai.operation.name", operation_name) span.set_attribute("gen_ai.output.type", "speech") @@ -150,7 +150,7 @@ def add_stt_span_attributes( **kwargs: Additional attributes to add. """ # Add standard attributes - span.set_attribute("gen_ai.system", service_name.replace("STTService", "").lower()) + span.set_attribute("gen_ai.provider.name", service_name.replace("STTService", "").lower()) span.set_attribute("gen_ai.request.model", model) span.set_attribute("gen_ai.operation.name", operation_name) span.set_attribute("vad_enabled", vad_enabled) @@ -218,7 +218,7 @@ def add_llm_span_attributes( **kwargs: Additional attributes to add. """ # Add standard attributes - span.set_attribute("gen_ai.system", _get_gen_ai_system_from_service_name(service_name)) + span.set_attribute("gen_ai.provider.name", _get_provider_name_from_service_name(service_name)) span.set_attribute("gen_ai.request.model", model) span.set_attribute("gen_ai.operation.name", "chat") span.set_attribute("gen_ai.output.type", "text") @@ -241,7 +241,7 @@ def add_llm_span_attributes( span.set_attribute("tool_choice", tool_choice) if system_instructions: - span.set_attribute("system_instructions", system_instructions) + span.set_attribute("gen_ai.system_instructions", system_instructions) if ttfb is not None: span.set_attribute("metrics.ttfb", ttfb) @@ -313,7 +313,7 @@ def add_gemini_live_span_attributes( **kwargs: Additional attributes to add. """ # Add standard attributes - span.set_attribute("gen_ai.system", "gcp.gemini") + span.set_attribute("gen_ai.provider.name", "gcp.gemini") span.set_attribute("gen_ai.request.model", model) span.set_attribute("gen_ai.operation.name", operation_name) span.set_attribute("service.operation", operation_name) @@ -414,7 +414,7 @@ def add_openai_realtime_span_attributes( **kwargs: Additional attributes to add. """ # Add standard attributes - span.set_attribute("gen_ai.system", "openai") + span.set_attribute("gen_ai.provider.name", "openai") span.set_attribute("gen_ai.request.model", model) span.set_attribute("gen_ai.operation.name", operation_name) span.set_attribute("service.operation", operation_name) diff --git a/src/pipecat/utils/tracing/service_decorators.py b/src/pipecat/utils/tracing/service_decorators.py index 2e54732f1..cc353e1a3 100644 --- a/src/pipecat/utils/tracing/service_decorators.py +++ b/src/pipecat/utils/tracing/service_decorators.py @@ -137,14 +137,14 @@ def _add_token_usage_to_span(span, token_usage): and token_usage["cache_read_input_tokens"] is not None ): span.set_attribute( - "gen_ai.usage.cache_read_input_tokens", token_usage["cache_read_input_tokens"] + "gen_ai.usage.cache_read.input_tokens", token_usage["cache_read_input_tokens"] ) if ( "cache_creation_input_tokens" in token_usage and token_usage["cache_creation_input_tokens"] is not None ): span.set_attribute( - "gen_ai.usage.cache_creation_input_tokens", + "gen_ai.usage.cache_creation.input_tokens", token_usage["cache_creation_input_tokens"], ) if "reasoning_tokens" in token_usage and token_usage["reasoning_tokens"] is not None: @@ -159,11 +159,11 @@ def _add_token_usage_to_span(span, token_usage): # Add cached token metrics for LLMTokenUsage object cache_read_tokens = getattr(token_usage, "cache_read_input_tokens", None) if cache_read_tokens is not None: - span.set_attribute("gen_ai.usage.cache_read_input_tokens", cache_read_tokens) + span.set_attribute("gen_ai.usage.cache_read.input_tokens", cache_read_tokens) cache_creation_tokens = getattr(token_usage, "cache_creation_input_tokens", None) if cache_creation_tokens is not None: - span.set_attribute("gen_ai.usage.cache_creation_input_tokens", cache_creation_tokens) + span.set_attribute("gen_ai.usage.cache_creation.input_tokens", cache_creation_tokens) reasoning_tokens = getattr(token_usage, "reasoning_tokens", None) if reasoning_tokens is not None: