Skip to content

Commit 84964cd

Browse files
committed
fix: proper imoprt erorr handling
1 parent 29a4ab2 commit 84964cd

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/strands/telemetry/tracer.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@
2929

3030
logger = logging.getLogger(__name__)
3131

32+
HAS_OTEL_EXPORTER_MODULE = False
33+
OTEL_EXPORTER_MODULE_ERROR = (
34+
"opentelemetry-exporter-otlp-proto-http not detected;"
35+
"please install strands-agents with the optional 'otel' target"
36+
"otel http exporting is currently DISABLED"
37+
)
38+
try:
39+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
40+
41+
HAS_OTEL_EXPORTER_MODULE = True
42+
except ImportError:
43+
pass
44+
3245

3346
class JSONEncoder(json.JSONEncoder):
3447
"""Custom JSON encoder that handles non-serializable types."""
@@ -180,10 +193,8 @@ def _initialize_tracer(self) -> None:
180193
self.tracer_provider.add_span_processor(console_processor)
181194

182195
# Add OTLP exporter if endpoint is provided
183-
if self.otlp_endpoint and self.tracer_provider:
196+
if HAS_OTEL_EXPORTER_MODULE and self.otlp_endpoint and self.tracer_provider:
184197
try:
185-
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
186-
187198
# Ensure endpoint has the right format
188199
endpoint = self.otlp_endpoint
189200
if not endpoint.endswith("/v1/traces") and not endpoint.endswith("/traces"):
@@ -207,6 +218,8 @@ def _initialize_tracer(self) -> None:
207218
logger.info("endpoint=<%s> | OTLP exporter configured with endpoint", endpoint)
208219
except Exception as e:
209220
logger.exception("error=<%s> | Failed to configure OTLP exporter", e)
221+
elif self.otlp_endpoint and self.tracer_provider:
222+
logger.warning(OTEL_EXPORTER_MODULE_ERROR)
210223

211224
# Set as global tracer provider
212225
trace_api.set_tracer_provider(self.tracer_provider)

tests/strands/telemetry/test_tracer.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ def mock_set_tracer_provider():
5858

5959
@pytest.fixture
6060
def mock_otlp_exporter():
61-
with mock.patch("opentelemetry.exporter.otlp.proto.http.trace_exporter.OTLPSpanExporter") as mock_exporter:
61+
with (
62+
mock.patch("strands.telemetry.tracer.HAS_OTEL_EXPORTER_MODULE", True),
63+
mock.patch("opentelemetry.exporter.otlp.proto.http.trace_exporter.OTLPSpanExporter") as mock_exporter,
64+
):
6265
yield mock_exporter
6366

6467

@@ -199,7 +202,11 @@ def test_initialize_tracer_with_otlp(
199202
mock_resource.create.return_value = mock_resource_instance
200203

201204
# Initialize Tracer
202-
Tracer(otlp_endpoint="http://test-endpoint")
205+
with (
206+
mock.patch("strands.telemetry.tracer.HAS_OTEL_EXPORTER_MODULE", True),
207+
mock.patch("strands.telemetry.tracer.OTLPSpanExporter", mock_otlp_exporter),
208+
):
209+
Tracer(otlp_endpoint="http://test-endpoint")
203210

204211
# Verify the tracer provider was created with correct resource
205212
mock_tracer_provider.assert_called_once_with(resource=mock_resource_instance)
@@ -508,7 +515,11 @@ def test_initialize_tracer_with_invalid_otlp_endpoint(
508515
# This should not raise an exception, but should log an error
509516

510517
# Initialize Tracer
511-
Tracer(otlp_endpoint="http://invalid-endpoint")
518+
with (
519+
mock.patch("strands.telemetry.tracer.HAS_OTEL_EXPORTER_MODULE", True),
520+
mock.patch("strands.telemetry.tracer.OTLPSpanExporter", mock_otlp_exporter),
521+
):
522+
Tracer(otlp_endpoint="http://invalid-endpoint")
512523

513524
# Verify the tracer provider was created with correct resource
514525
mock_tracer_provider.assert_called_once_with(resource=mock_resource_instance)

0 commit comments

Comments
 (0)