Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion sentry_sdk/ai/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from typing import Any
from typing import Any, Callable
from sentry_sdk.tracing import Span

import sentry_sdk
from sentry_sdk.utils import logger


Expand Down Expand Up @@ -37,3 +38,12 @@ def set_data_normalized(span, key, value, unpack=True):
span.set_data(key, normalized)
else:
span.set_data(key, json.dumps(normalized))


def get_start_span_function():
# type: () -> Callable[..., Any]
current_span = sentry_sdk.get_current_span()
transaction_exists = (
current_span is not None and current_span.containing_transaction == current_span
)
return sentry_sdk.start_span if transaction_exists else sentry_sdk.start_transaction
4 changes: 2 additions & 2 deletions sentry_sdk/integrations/anthropic.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import sentry_sdk
from sentry_sdk.ai.monitoring import record_token_usage
from sentry_sdk.ai.utils import set_data_normalized
from sentry_sdk.ai.utils import set_data_normalized, get_start_span_function
from sentry_sdk.consts import OP, SPANDATA
from sentry_sdk.integrations import _check_minimum_version, DidNotEnable, Integration
from sentry_sdk.scope import should_send_default_pii
Expand Down Expand Up @@ -194,7 +194,7 @@ def _sentry_patched_create_common(f, *args, **kwargs):

model = kwargs.get("model", "")

span = sentry_sdk.start_span(
span = get_start_span_function()(
op=OP.GEN_AI_CHAT,
name=f"chat {model}".strip(),
origin=AnthropicIntegration.origin,
Expand Down
8 changes: 5 additions & 3 deletions sentry_sdk/integrations/langchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import sentry_sdk
from sentry_sdk.ai.monitoring import set_ai_pipeline_name
from sentry_sdk.ai.utils import set_data_normalized
from sentry_sdk.ai.utils import set_data_normalized, get_start_span_function
from sentry_sdk.consts import OP, SPANDATA
from sentry_sdk.integrations import DidNotEnable, Integration
from sentry_sdk.scope import should_send_default_pii
Expand Down Expand Up @@ -716,8 +716,9 @@ def new_invoke(self, *args, **kwargs):
return f(self, *args, **kwargs)

agent_name, tools = _get_request_data(self, args, kwargs)
start_span_function = get_start_span_function()

with sentry_sdk.start_span(
with start_span_function(
op=OP.GEN_AI_INVOKE_AGENT,
name=f"invoke_agent {agent_name}" if agent_name else "invoke_agent",
origin=LangchainIntegration.origin,
Expand Down Expand Up @@ -767,8 +768,9 @@ def new_stream(self, *args, **kwargs):
return f(self, *args, **kwargs)

agent_name, tools = _get_request_data(self, args, kwargs)
start_span_function = get_start_span_function()

span = sentry_sdk.start_span(
span = start_span_function(
op=OP.GEN_AI_INVOKE_AGENT,
name=f"invoke_agent {agent_name}".strip(),
origin=LangchainIntegration.origin,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import sentry_sdk
from sentry_sdk.ai.utils import get_start_span_function

from ..consts import SPAN_ORIGIN
from ..utils import _get_start_span_function

from typing import TYPE_CHECKING

Expand All @@ -13,7 +13,7 @@ def agent_workflow_span(agent):
# type: (agents.Agent) -> sentry_sdk.tracing.Span

# Create a transaction or a span if an transaction is already active
span = _get_start_span_function()(
span = get_start_span_function()(
name=f"{agent.name} workflow",
origin=SPAN_ORIGIN,
)
Expand Down
5 changes: 3 additions & 2 deletions sentry_sdk/integrations/openai_agents/spans/invoke_agent.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import sentry_sdk
from sentry_sdk.ai.utils import set_data_normalized
from sentry_sdk.ai.utils import get_start_span_function, set_data_normalized
from sentry_sdk.consts import OP, SPANDATA
from sentry_sdk.scope import should_send_default_pii
from sentry_sdk.utils import safe_serialize
Expand All @@ -16,7 +16,8 @@

def invoke_agent_span(context, agent, kwargs):
# type: (agents.RunContextWrapper, agents.Agent, dict[str, Any]) -> sentry_sdk.tracing.Span
span = sentry_sdk.start_span(
start_span_function = get_start_span_function()
span = start_span_function(
op=OP.GEN_AI_INVOKE_AGENT,
name=f"invoke_agent {agent.name}",
origin=SPAN_ORIGIN,
Expand Down
10 changes: 0 additions & 10 deletions sentry_sdk/integrations/openai_agents/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

if TYPE_CHECKING:
from typing import Any
from typing import Callable
from agents import Usage

try:
Expand All @@ -29,15 +28,6 @@ def _capture_exception(exc):
sentry_sdk.capture_event(event, hint=hint)


def _get_start_span_function():
# type: () -> Callable[..., Any]
current_span = sentry_sdk.get_current_span()
transaction_exists = (
current_span is not None and current_span.containing_transaction == current_span
)
return sentry_sdk.start_span if transaction_exists else sentry_sdk.start_transaction


def _set_agent_data(span, agent):
# type: (sentry_sdk.tracing.Span, agents.Agent) -> None
span.set_data(
Expand Down
Loading