Skip to content

Commit 69e73ec

Browse files
fix(chromadb,pinecone,weaviate,lancedb,milvus): record exceptions on error spans
When vector DB calls raise exceptions, spans were left in UNSET state with no error information. Add span.record_exception() and StatusCode.ERROR to all wrapped call sites. Milvus already set ERROR_TYPE attribute; this completes the OTel span status. Fixes #412
1 parent 25189ad commit 69e73ec

File tree

5 files changed

+30
-4
lines changed
  • packages
    • opentelemetry-instrumentation-chromadb/opentelemetry/instrumentation/chromadb
    • opentelemetry-instrumentation-lancedb/opentelemetry/instrumentation/lancedb
    • opentelemetry-instrumentation-milvus/opentelemetry/instrumentation/milvus
    • opentelemetry-instrumentation-pinecone/opentelemetry/instrumentation/pinecone
    • opentelemetry-instrumentation-weaviate/opentelemetry/instrumentation/weaviate

5 files changed

+30
-4
lines changed

packages/opentelemetry-instrumentation-chromadb/opentelemetry/instrumentation/chromadb/wrapper.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
)
88
from opentelemetry.semconv_ai import EventAttributes, Events
99
from opentelemetry.semconv_ai import SpanAttributes as AISpanAttributes
10+
from opentelemetry.trace.status import Status, StatusCode
1011
import itertools
1112
import json
1213

@@ -61,7 +62,12 @@ def _wrap(tracer, to_wrap, wrapped, instance, args, kwargs):
6162
elif to_wrap.get("method") == "delete":
6263
_set_delete_attributes(span, kwargs)
6364

64-
return_value = wrapped(*args, **kwargs)
65+
try:
66+
return_value = wrapped(*args, **kwargs)
67+
except Exception as e:
68+
span.record_exception(e)
69+
span.set_status(Status(StatusCode.ERROR, str(e)))
70+
raise
6571
if to_wrap.get("method") == "query":
6672
_add_query_result_events(span, return_value)
6773

packages/opentelemetry-instrumentation-lancedb/opentelemetry/instrumentation/lancedb/wrapper.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
_SUPPRESS_INSTRUMENTATION_KEY,
77
)
88
from opentelemetry.semconv_ai import SpanAttributes as AISpanAttributes
9+
from opentelemetry.trace.status import Status, StatusCode
910

1011

1112
def _with_tracer_wrapper(func):
@@ -45,7 +46,12 @@ def _wrap(tracer, to_wrap, wrapped, instance, args, kwargs):
4546
elif to_wrap.get("method") == "delete":
4647
_set_delete_attributes(span, kwargs)
4748

48-
return_value = wrapped(*args, **kwargs)
49+
try:
50+
return_value = wrapped(*args, **kwargs)
51+
except Exception as e:
52+
span.record_exception(e)
53+
span.set_status(Status(StatusCode.ERROR, str(e)))
54+
raise
4955

5056
return return_value
5157

packages/opentelemetry-instrumentation-milvus/opentelemetry/instrumentation/milvus/wrapper.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from opentelemetry.semconv_ai import Events, EventAttributes
1010
from opentelemetry.semconv_ai import SpanAttributes as AISpanAttributes
1111

12+
from opentelemetry.trace.status import Status as SpanStatus, StatusCode
1213
from pymilvus.client.types import Status
1314
from pymilvus.exceptions import ErrorCode
1415

@@ -112,6 +113,8 @@ def _wrap(
112113
getattr(e, "code", None), type(e).__name__
113114
)
114115
span.set_attribute(ERROR_TYPE, error_type)
116+
span.record_exception(e)
117+
span.set_status(SpanStatus(StatusCode.ERROR, str(e)))
115118
raise
116119

117120
shared_attributes = {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,12 @@ def _wrap(
154154
shared_attributes["server.address"] = instance._config.host
155155

156156
start_time = time.time()
157-
response = wrapped(*args, **kwargs)
157+
try:
158+
response = wrapped(*args, **kwargs)
159+
except Exception as e:
160+
span.record_exception(e)
161+
span.set_status(Status(StatusCode.ERROR, str(e)))
162+
raise
158163
end_time = time.time()
159164

160165
duration = end_time - start_time

packages/opentelemetry-instrumentation-weaviate/opentelemetry/instrumentation/weaviate/wrapper.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY
77
from opentelemetry.instrumentation.weaviate.utils import dont_throw
88
from opentelemetry.semconv.trace import SpanAttributes
9+
from opentelemetry.trace.status import Status, StatusCode
910

1011

1112
logger = logging.getLogger(__name__)
@@ -46,7 +47,12 @@ def _wrap(tracer, to_wrap, wrapped, instance, args, kwargs):
4647
if instrumentor:
4748
instrumentor.instrument(to_wrap.get("method"), span, args, kwargs)
4849

49-
return_value = wrapped(*args, **kwargs)
50+
try:
51+
return_value = wrapped(*args, **kwargs)
52+
except Exception as e:
53+
span.record_exception(e)
54+
span.set_status(Status(StatusCode.ERROR, str(e)))
55+
raise
5056

5157
return return_value
5258

0 commit comments

Comments
 (0)