Skip to content

Commit 7bc681e

Browse files
fix(ollama,together,replicate,sagemaker,bedrock): record exceptions on error spans
When API calls raise exceptions, spans were left in UNSET state with no error information. Add span.record_exception() and set StatusCode.ERROR on all sync/async wrappers in each affected package. Fixes #412
1 parent 25189ad commit 7bc681e

File tree

5 files changed

+69
-10
lines changed
  • packages
    • opentelemetry-instrumentation-bedrock/opentelemetry/instrumentation/bedrock
    • opentelemetry-instrumentation-ollama/opentelemetry/instrumentation/ollama
    • opentelemetry-instrumentation-replicate/opentelemetry/instrumentation/replicate
    • opentelemetry-instrumentation-sagemaker/opentelemetry/instrumentation/sagemaker
    • opentelemetry-instrumentation-together/opentelemetry/instrumentation/together

5 files changed

+69
-10
lines changed

packages/opentelemetry-instrumentation-bedrock/opentelemetry/instrumentation/bedrock/__init__.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
Meters,
6363
)
6464
from opentelemetry.trace import Span, SpanKind, get_tracer
65+
from opentelemetry.trace.status import Status, StatusCode
6566
from wrapt import wrap_function_wrapper
6667

6768

@@ -220,7 +221,12 @@ def with_instrumentation(*args, **kwargs):
220221
with tracer.start_as_current_span(
221222
_span_name(operation_name, _model), kind=SpanKind.CLIENT, attributes=span_attributes
222223
) as span:
223-
response = fn(*args, **kwargs)
224+
try:
225+
response = fn(*args, **kwargs)
226+
except Exception as e:
227+
span.record_exception(e)
228+
span.set_status(Status(StatusCode.ERROR, str(e)))
229+
raise
224230
_handle_call(span, kwargs, response, metric_params, event_logger)
225231
return response
226232

@@ -248,7 +254,13 @@ def with_instrumentation(*args, **kwargs):
248254
attributes=span_attributes,
249255
)
250256

251-
response = fn(*args, **kwargs)
257+
try:
258+
response = fn(*args, **kwargs)
259+
except Exception as e:
260+
span.record_exception(e)
261+
span.set_status(Status(StatusCode.ERROR, str(e)))
262+
span.end()
263+
raise
252264
_handle_stream_call(span, kwargs, response, metric_params, event_logger)
253265

254266
return response
@@ -276,7 +288,12 @@ def with_instrumentation(*args, **kwargs):
276288
kind=SpanKind.CLIENT,
277289
attributes=span_attributes,
278290
) as span:
279-
response = fn(*args, **kwargs)
291+
try:
292+
response = fn(*args, **kwargs)
293+
except Exception as e:
294+
span.record_exception(e)
295+
span.set_status(Status(StatusCode.ERROR, str(e)))
296+
raise
280297
_handle_converse(span, kwargs, response, metric_params, event_logger)
281298

282299
return response
@@ -301,7 +318,13 @@ def with_instrumentation(*args, **kwargs):
301318
kind=SpanKind.CLIENT,
302319
attributes=span_attributes,
303320
)
304-
response = fn(*args, **kwargs)
321+
try:
322+
response = fn(*args, **kwargs)
323+
except Exception as e:
324+
span.record_exception(e)
325+
span.set_status(Status(StatusCode.ERROR, str(e)))
326+
span.end()
327+
raise
305328
if span.is_recording():
306329
_handle_converse_stream(span, kwargs, response, metric_params, event_logger)
307330

packages/opentelemetry-instrumentation-ollama/opentelemetry/instrumentation/ollama/__init__.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,13 @@ def _wrap(
309309
_handle_input(span, event_logger, llm_request_type, args, kwargs)
310310

311311
start_time = time.perf_counter()
312-
response = wrapped(*args, **kwargs)
312+
try:
313+
response = wrapped(*args, **kwargs)
314+
except Exception as e:
315+
span.record_exception(e)
316+
span.set_status(Status(StatusCode.ERROR, str(e)))
317+
span.end()
318+
raise
313319
end_time = time.perf_counter()
314320

315321
if response:
@@ -384,7 +390,13 @@ async def _awrap(
384390
_handle_input(span, event_logger, llm_request_type, args, kwargs)
385391

386392
start_time = time.perf_counter()
387-
response = await wrapped(*args, **kwargs)
393+
try:
394+
response = await wrapped(*args, **kwargs)
395+
except Exception as e:
396+
span.record_exception(e)
397+
span.set_status(Status(StatusCode.ERROR, str(e)))
398+
span.end()
399+
raise
388400
end_time = time.perf_counter()
389401
if response:
390402
if duration_histogram:

packages/opentelemetry-instrumentation-replicate/opentelemetry/instrumentation/replicate/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,13 @@ def _wrap(
133133

134134
_handle_request(span, event_logger, args, kwargs)
135135

136-
response = wrapped(*args, **kwargs)
136+
try:
137+
response = wrapped(*args, **kwargs)
138+
except Exception as e:
139+
span.record_exception(e)
140+
span.set_status(Status(StatusCode.ERROR, str(e)))
141+
span.end()
142+
raise
137143

138144
if response:
139145
if is_streaming_response(response):

packages/opentelemetry-instrumentation-sagemaker/opentelemetry/instrumentation/sagemaker/__init__.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
SUPPRESS_LANGUAGE_MODEL_INSTRUMENTATION_KEY,
3232
)
3333
from opentelemetry.trace import SpanKind, get_tracer
34+
from opentelemetry.trace.status import Status, StatusCode
3435
from wrapt import wrap_function_wrapper
3536

3637
_instruments = ("boto3 >= 1.28.57",)
@@ -96,7 +97,12 @@ def with_instrumentation(*args, **kwargs):
9697
with tracer.start_as_current_span(
9798
"sagemaker.completion", kind=SpanKind.CLIENT
9899
) as span:
99-
response = fn(*args, **kwargs)
100+
try:
101+
response = fn(*args, **kwargs)
102+
except Exception as e:
103+
span.record_exception(e)
104+
span.set_status(Status(StatusCode.ERROR, str(e)))
105+
raise
100106
_handle_call(span, event_logger, kwargs, response)
101107

102108
return response
@@ -112,7 +118,13 @@ def with_instrumentation(*args, **kwargs):
112118

113119
span = tracer.start_span("sagemaker.completion", kind=SpanKind.CLIENT)
114120

115-
response = fn(*args, **kwargs)
121+
try:
122+
response = fn(*args, **kwargs)
123+
except Exception as e:
124+
span.record_exception(e)
125+
span.set_status(Status(StatusCode.ERROR, str(e)))
126+
span.end()
127+
raise
116128

117129
if span.is_recording():
118130
_handle_stream_call(span, event_logger, kwargs, response)

packages/opentelemetry-instrumentation-together/opentelemetry/instrumentation/together/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,13 @@ def _wrap(
122122
)
123123
_handle_input(span, event_logger, llm_request_type, kwargs)
124124

125-
response = wrapped(*args, **kwargs)
125+
try:
126+
response = wrapped(*args, **kwargs)
127+
except Exception as e:
128+
span.record_exception(e)
129+
span.set_status(Status(StatusCode.ERROR, str(e)))
130+
span.end()
131+
raise
126132

127133
if response:
128134
_handle_response(span, event_logger, llm_request_type, response)

0 commit comments

Comments
 (0)