From 856665009fe953b4e427912ff293e4162b9181b3 Mon Sep 17 00:00:00 2001 From: Jimmy Yeung Date: Tue, 24 Feb 2026 14:32:33 +0800 Subject: [PATCH] fix(grpc): Read method from handler_call_details for grpcio >= 1.76 compat grpcio 1.76 introduced registered method handlers which resolve RPC methods at the C-core level. For these methods, `context._rpc_event.call_details.method` is empty, breaking tracing. This fix captures `handler_call_details.method` in the closure scope to avoid both the grpcio 1.76 issue and race conditions from shared instance state in the ThreadPoolExecutor. Fixes #5520 --- sentry_sdk/integrations/grpc/server.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/sentry_sdk/integrations/grpc/server.py b/sentry_sdk/integrations/grpc/server.py index 9edf9ea29e..7c06fd405a 100644 --- a/sentry_sdk/integrations/grpc/server.py +++ b/sentry_sdk/integrations/grpc/server.py @@ -22,7 +22,7 @@ def __init__( self: "ServerInterceptor", find_name: "Optional[Callable[[ServicerContext], str]]" = None, ) -> None: - self._find_method_name = find_name or ServerInterceptor._find_name + self._custom_find_name = find_name super().__init__() @@ -35,9 +35,12 @@ def intercept_service( if not handler or not handler.unary_unary: return handler + method_name = handler_call_details.method + custom_find_name = self._custom_find_name + def behavior(request: "Message", context: "ServicerContext") -> "Message": with sentry_sdk.isolation_scope(): - name = self._find_method_name(context) + name = custom_find_name(context) if custom_find_name else method_name if name: metadata = dict(context.invocation_metadata()) @@ -63,7 +66,3 @@ def behavior(request: "Message", context: "ServicerContext") -> "Message": request_deserializer=handler.request_deserializer, response_serializer=handler.response_serializer, ) - - @staticmethod - def _find_name(context: "ServicerContext") -> str: - return context._rpc_event.call_details.method.decode()