Skip to content

Commit 243a0b1

Browse files
committed
Refactor test llmobs writer out to utils, add release note
1 parent 75ca16d commit 243a0b1

File tree

5 files changed

+30
-60
lines changed

5 files changed

+30
-60
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
features:
3+
- |
4+
LLM Observability: Introduces support for submitting custom evaluations to LLM Observability via agent proxy mode.

tests/contrib/botocore/test_bedrock_llmobs.py

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
from ddtrace.contrib.internal.botocore.patch import unpatch
1313
from ddtrace.llmobs import LLMObs
1414
from ddtrace.llmobs import LLMObs as llmobs_service
15-
from ddtrace.llmobs._constants import AGENTLESS_BASE_URL
16-
from ddtrace.llmobs._writer import LLMObsSpanWriter
15+
from ddtrace.llmobs._constants import AGENTLESS_SPAN_BASE_URL
1716
from ddtrace.trace import Pin
1817
from tests.contrib.botocore.bedrock_utils import _MOCK_RESPONSE_DATA
1918
from tests.contrib.botocore.bedrock_utils import _MODELS
@@ -22,20 +21,12 @@
2221
from tests.contrib.botocore.bedrock_utils import bedrock_converse_args_with_system_and_tool
2322
from tests.contrib.botocore.bedrock_utils import create_bedrock_converse_request
2423
from tests.contrib.botocore.bedrock_utils import get_request_vcr
24+
from tests.llmobs._utils import TestLLMObsSpanWriter
2525
from tests.llmobs._utils import _expected_llmobs_llm_span_event
2626
from tests.utils import DummyTracer
2727
from tests.utils import override_global_config
2828

2929

30-
class TestLLMObsSpanWriter(LLMObsSpanWriter):
31-
def __init__(self, *args, **kwargs):
32-
super().__init__(*args, **kwargs)
33-
self.events = []
34-
35-
def enqueue(self, event):
36-
self.events.append(event)
37-
38-
3930
@pytest.fixture(scope="session")
4031
def request_vcr():
4132
yield get_request_vcr()
@@ -58,7 +49,7 @@ def aws_credentials():
5849

5950

6051
@pytest.fixture
61-
def boto3(aws_credentials, mock_llmobs_span_writer, ddtrace_global_config):
52+
def boto3(aws_credentials, llmobs_span_writer, ddtrace_global_config):
6253
global_config = {"_dd_api_key": "<not-a-real-api_key>"}
6354
global_config.update(ddtrace_global_config)
6455
with override_global_config(global_config):
@@ -93,21 +84,9 @@ def bedrock_client_proxy(boto3):
9384
yield bedrock_client
9485

9586

96-
@pytest.fixture
97-
def mock_llmobs_span_writer():
98-
patcher = mock.patch("ddtrace.llmobs._llmobs.LLMObsSpanWriter")
99-
try:
100-
LLMObsSpanWriterMock = patcher.start()
101-
m = mock.MagicMock()
102-
LLMObsSpanWriterMock.return_value = m
103-
yield m
104-
finally:
105-
patcher.stop()
106-
107-
10887
@pytest.fixture
10988
def llmobs_span_writer():
110-
agentless_url = "{}.{}".format(AGENTLESS_BASE_URL, "datad0g.com")
89+
agentless_url = "{}.{}".format(AGENTLESS_SPAN_BASE_URL, "datad0g.com")
11190
yield TestLLMObsSpanWriter(is_agentless=True, _agentless_url=agentless_url, interval=1.0, timeout=1.0)
11291

11392

@@ -750,15 +729,15 @@ def test_llmobs_error(self, ddtrace_global_config, bedrock_client, mock_tracer,
750729
)
751730

752731
@pytest.mark.skipif(BOTO_VERSION < (1, 34, 131), reason="Converse API not available until botocore 1.34.131")
753-
def test_llmobs_converse(cls, bedrock_client, mock_llmobs_span_writer, request_vcr, mock_tracer, llmobs_events):
732+
def test_llmobs_converse(cls, bedrock_client, request_vcr, mock_tracer, llmobs_events):
754733
request_params = create_bedrock_converse_request(**bedrock_converse_args_with_system_and_tool)
755734
with request_vcr.use_cassette("bedrock_converse.yaml"):
756735
response = bedrock_client.converse(**request_params)
757736

758737
span = mock_tracer.pop_traces()[0][0]
759738
assert len(llmobs_events) == 1
760739

761-
llmobs_events[0] == _expected_llmobs_llm_span_event(
740+
assert llmobs_events[0] == _expected_llmobs_llm_span_event(
762741
span,
763742
model_name="claude-3-sonnet-20240229-v1:0",
764743
model_provider="anthropic",
@@ -793,9 +772,7 @@ def test_llmobs_converse(cls, bedrock_client, mock_llmobs_span_writer, request_v
793772
)
794773

795774
@pytest.mark.skipif(BOTO_VERSION < (1, 34, 131), reason="Converse API not available until botocore 1.34.131")
796-
def test_llmobs_converse_error(
797-
self, bedrock_client, mock_llmobs_span_writer, request_vcr, mock_tracer, llmobs_events
798-
):
775+
def test_llmobs_converse_error(self, bedrock_client, request_vcr, mock_tracer, llmobs_events):
799776
"""Test error handling for the Bedrock Converse API."""
800777
import botocore
801778

@@ -825,9 +802,7 @@ def test_llmobs_converse_error(
825802
)
826803

827804
@pytest.mark.skipif(BOTO_VERSION < (1, 34, 131), reason="Converse API not available until botocore 1.34.131")
828-
def test_llmobs_converse_stream(
829-
cls, bedrock_client, mock_llmobs_span_writer, request_vcr, mock_tracer, llmobs_events
830-
):
805+
def test_llmobs_converse_stream(cls, bedrock_client, request_vcr, mock_tracer, llmobs_events):
831806
output_msg = ""
832807
request_params = create_bedrock_converse_request(**bedrock_converse_args_with_system_and_tool)
833808
with request_vcr.use_cassette("bedrock_converse_stream.yaml"):
@@ -840,7 +815,7 @@ def test_llmobs_converse_stream(
840815
span = mock_tracer.pop_traces()[0][0]
841816
assert len(llmobs_events) == 1
842817

843-
llmobs_events[0] == _expected_llmobs_llm_span_event(
818+
assert llmobs_events[0] == _expected_llmobs_llm_span_event(
844819
span,
845820
model_name="claude-3-sonnet-20240229-v1:0",
846821
model_provider="anthropic",

tests/contrib/langgraph/conftest.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
from ddtrace.contrib.internal.langgraph.patch import patch
1111
from ddtrace.contrib.internal.langgraph.patch import unpatch
1212
from ddtrace.llmobs import LLMObs as llmobs_service
13-
from ddtrace.llmobs._constants import AGENTLESS_BASE_URL
14-
from ddtrace.llmobs._writer import LLMObsSpanWriter
13+
from ddtrace.llmobs._constants import AGENTLESS_SPAN_BASE_URL
1514
from ddtrace.trace import Pin
1615
from tests.utils import DummyTracer
1716
from tests.utils import override_global_config
17+
from tests.llmobs._utils import TestLLMObsSpanWriter
1818

1919

2020
DATADOG_SITE = "datad0g.com"
@@ -41,18 +41,9 @@ def default_global_config():
4141
return {"_dd_api_key": "<not-a-real-api_key>", "_llmobs_ml_app": "unnamed-ml-app", "service": "tests.llmobs"}
4242

4343

44-
class TestLLMObsSpanWriter(LLMObsSpanWriter):
45-
def __init__(self, *args, **kwargs):
46-
super().__init__(*args, **kwargs)
47-
self.events = []
48-
49-
def enqueue(self, event):
50-
self.events.append(event)
51-
52-
5344
@pytest.fixture
5445
def llmobs_span_writer():
55-
agentless_url = "{}.{}".format(AGENTLESS_BASE_URL, DATADOG_SITE)
46+
agentless_url = "{}.{}".format(AGENTLESS_SPAN_BASE_URL, DATADOG_SITE)
5647
yield TestLLMObsSpanWriter(is_agentless=True, _agentless_url=agentless_url, interval=1.0, timeout=1.0)
5748

5849

tests/llmobs/_utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from ddtrace.llmobs._constants import INTEGRATION
1515
from ddtrace.llmobs._utils import _get_span_name
1616
from ddtrace.llmobs._writer import LLMObsEvaluationMetricEvent
17+
from ddtrace.llmobs._writer import LLMObsSpanWriter
1718
from ddtrace.trace import Span
1819

1920

@@ -798,3 +799,15 @@ def _expected_span_link(span_event, link_from, link_to):
798799
"span_id": span_event["span_id"],
799800
"attributes": {"from": link_from, "to": link_to},
800801
}
802+
803+
804+
class TestLLMObsSpanWriter(LLMObsSpanWriter):
805+
def __init__(self, *args, **kwargs):
806+
super().__init__(*args, **kwargs)
807+
self.events = []
808+
809+
def enqueue(self, event):
810+
self.events.append(event)
811+
812+
def events(self):
813+
return self.events

tests/llmobs/conftest.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from ddtrace.internal.utils.http import Response
1212
from ddtrace.llmobs import LLMObs as llmobs_service
1313
from ddtrace.llmobs._evaluators.ragas.faithfulness import RagasFaithfulnessEvaluator
14-
from ddtrace.llmobs._writer import LLMObsSpanWriter
14+
from tests.llmobs._utils import TestLLMObsSpanWriter
1515
from tests.llmobs._utils import logs_vcr
1616
from tests.utils import DummyTracer
1717
from tests.utils import override_env
@@ -197,19 +197,6 @@ def llmobs_env():
197197
}
198198

199199

200-
class TestLLMObsSpanWriter(LLMObsSpanWriter):
201-
def __init__(self, *args, **kwargs):
202-
super().__init__(*args, **kwargs)
203-
self._events = []
204-
205-
def enqueue(self, event):
206-
self._events.append(event)
207-
super().enqueue(event)
208-
209-
def events(self):
210-
return self._events
211-
212-
213200
@pytest.fixture
214201
def llmobs_span_writer(_llmobs_backend):
215202
url, _ = _llmobs_backend

0 commit comments

Comments
 (0)