parent
d6f6c60c16
commit
c54292fa08
|
|
@ -24,6 +24,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
([#3419](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3419))
|
([#3419](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3419))
|
||||||
- `opentelemetry-instrumentation` don't print duplicated conflict log error message
|
- `opentelemetry-instrumentation` don't print duplicated conflict log error message
|
||||||
([#3432](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3432))
|
([#3432](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3432))
|
||||||
|
- `opentelemetry-instrumentation-grpc` Check for None result in gRPC
|
||||||
|
([#3380](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3381))
|
||||||
|
|
||||||
## Version 1.32.0/0.53b0 (2025-04-10)
|
## Version 1.32.0/0.53b0 (2025-04-10)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -165,7 +165,7 @@ class OpenTelemetryClientInterceptor(
|
||||||
span.record_exception(exc)
|
span.record_exception(exc)
|
||||||
raise exc
|
raise exc
|
||||||
finally:
|
finally:
|
||||||
if not result:
|
if result is None:
|
||||||
span.end()
|
span.end()
|
||||||
return self._trace_result(span, rpc_info, result)
|
return self._trace_result(span, rpc_info, result)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,8 @@
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
# pylint:disable=cyclic-import
|
# pylint:disable=cyclic-import
|
||||||
|
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
import grpc
|
import grpc
|
||||||
|
|
||||||
import opentelemetry.instrumentation.grpc
|
import opentelemetry.instrumentation.grpc
|
||||||
|
|
@ -26,6 +28,7 @@ from opentelemetry.instrumentation.grpc.grpcext._interceptor import (
|
||||||
)
|
)
|
||||||
from opentelemetry.instrumentation.utils import suppress_instrumentation
|
from opentelemetry.instrumentation.utils import suppress_instrumentation
|
||||||
from opentelemetry.propagate import get_global_textmap, set_global_textmap
|
from opentelemetry.propagate import get_global_textmap, set_global_textmap
|
||||||
|
from opentelemetry.sdk.trace import Span as SdkSpan
|
||||||
from opentelemetry.semconv.trace import SpanAttributes
|
from opentelemetry.semconv.trace import SpanAttributes
|
||||||
from opentelemetry.test.mock_textmap import MockTextMapPropagator
|
from opentelemetry.test.mock_textmap import MockTextMapPropagator
|
||||||
from opentelemetry.test.test_base import TestBase
|
from opentelemetry.test.test_base import TestBase
|
||||||
|
|
@ -269,6 +272,32 @@ class TestClientProto(TestBase):
|
||||||
trace.StatusCode.ERROR,
|
trace.StatusCode.ERROR,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_client_interceptor_falsy_response(
|
||||||
|
self,
|
||||||
|
):
|
||||||
|
"""ensure that client interceptor closes the span only once even if the response is falsy."""
|
||||||
|
|
||||||
|
with mock.patch.object(SdkSpan, "end") as span_end_mock:
|
||||||
|
tracer_provider, _exporter = self.create_tracer_provider()
|
||||||
|
tracer = tracer_provider.get_tracer(__name__)
|
||||||
|
|
||||||
|
interceptor = OpenTelemetryClientInterceptor(tracer)
|
||||||
|
|
||||||
|
def invoker(_request, _metadata):
|
||||||
|
return {}
|
||||||
|
|
||||||
|
request = Request(client_id=1, request_data="data")
|
||||||
|
interceptor.intercept_unary(
|
||||||
|
request,
|
||||||
|
{},
|
||||||
|
_UnaryClientInfo(
|
||||||
|
full_method="/GRPCTestServer/SimpleMethod",
|
||||||
|
timeout=None,
|
||||||
|
),
|
||||||
|
invoker=invoker,
|
||||||
|
)
|
||||||
|
self.assertEqual(span_end_mock.call_count, 1)
|
||||||
|
|
||||||
def test_client_interceptor_trace_context_propagation(
|
def test_client_interceptor_trace_context_propagation(
|
||||||
self,
|
self,
|
||||||
): # pylint: disable=no-self-use
|
): # pylint: disable=no-self-use
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue