From 9868322a011e83a2805fbfe8d518d3fffe486b2e Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 20 May 2025 11:28:43 +0200 Subject: [PATCH 1/4] fix(grpc): Fix AttributeError when instrumenting with OTel --- sentry_sdk/integrations/grpc/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/grpc/__init__.py b/sentry_sdk/integrations/grpc/__init__.py index d9dcdddb55..de152f64e3 100644 --- a/sentry_sdk/integrations/grpc/__init__.py +++ b/sentry_sdk/integrations/grpc/__init__.py @@ -127,7 +127,7 @@ def patched_aio_server( # type: ignore **kwargs: P.kwargs, ) -> Server: server_interceptor = AsyncServerInterceptor() - interceptors = (server_interceptor, *(interceptors or [])) + interceptors = [server_interceptor, *(interceptors or [])] return func(*args, interceptors=interceptors, **kwargs) # type: ignore return patched_aio_server # type: ignore From b4e85992e3911ccbd5c5efb314261bf85c6d6aa5 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 20 May 2025 11:52:39 +0200 Subject: [PATCH 2/4] add compat --- sentry_sdk/integrations/grpc/__init__.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sentry_sdk/integrations/grpc/__init__.py b/sentry_sdk/integrations/grpc/__init__.py index de152f64e3..bf2443c941 100644 --- a/sentry_sdk/integrations/grpc/__init__.py +++ b/sentry_sdk/integrations/grpc/__init__.py @@ -6,6 +6,7 @@ from grpc.aio import Server as AsyncServer from sentry_sdk.integrations import Integration +from sentry_sdk.utils import parse_version from .client import ClientInterceptor from .server import ServerInterceptor @@ -128,6 +129,17 @@ def patched_aio_server( # type: ignore ) -> Server: server_interceptor = AsyncServerInterceptor() interceptors = [server_interceptor, *(interceptors or [])] + + try: + # We prefer interceptors as a list because of compatibility with + # opentelemetry https://github.com/getsentry/sentry-python/issues/4389 + # However, prior to grpc 1.42.0, only tuples were accepted, so we + # have no choice there. + if parse_version(grpc.__version__) < (1, 42, 0): + interceptors = tuple(interceptors) + except Exception: + pass + return func(*args, interceptors=interceptors, **kwargs) # type: ignore return patched_aio_server # type: ignore From e83ab8c574d7b83ba92ada8e0a53d0d9229916a2 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 20 May 2025 11:59:53 +0200 Subject: [PATCH 3/4] . --- sentry_sdk/integrations/grpc/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/grpc/__init__.py b/sentry_sdk/integrations/grpc/__init__.py index bf2443c941..0bc81debf6 100644 --- a/sentry_sdk/integrations/grpc/__init__.py +++ b/sentry_sdk/integrations/grpc/__init__.py @@ -42,6 +42,8 @@ def __getitem__(self, _): P = ParamSpec("P") +GRPC_VERSION = parse_version(grpc.__version__) + def _wrap_channel_sync(func: Callable[P, Channel]) -> Callable[P, Channel]: "Wrapper for synchronous secure and insecure channel." @@ -135,7 +137,7 @@ def patched_aio_server( # type: ignore # opentelemetry https://github.com/getsentry/sentry-python/issues/4389 # However, prior to grpc 1.42.0, only tuples were accepted, so we # have no choice there. - if parse_version(grpc.__version__) < (1, 42, 0): + if GRPC_VERSION is not None and GRPC_VERSION < (1, 42, 0): interceptors = tuple(interceptors) except Exception: pass From 0f6585a933c00f5cf7392d0f169e55df0f7e69ec Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 20 May 2025 12:05:21 +0200 Subject: [PATCH 4/4] mypy --- sentry_sdk/integrations/grpc/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/grpc/__init__.py b/sentry_sdk/integrations/grpc/__init__.py index 0bc81debf6..4e15f95ae5 100644 --- a/sentry_sdk/integrations/grpc/__init__.py +++ b/sentry_sdk/integrations/grpc/__init__.py @@ -130,7 +130,10 @@ def patched_aio_server( # type: ignore **kwargs: P.kwargs, ) -> Server: server_interceptor = AsyncServerInterceptor() - interceptors = [server_interceptor, *(interceptors or [])] + interceptors = [ + server_interceptor, + *(interceptors or []), + ] # type: Sequence[grpc.ServerInterceptor] try: # We prefer interceptors as a list because of compatibility with