Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 860fdd9

Browse files
Fix @tag_args being off-by-one (ahead) (#13452)
Fix @tag_args being off-by-one (ahead) Example: ``` argspec.args=[ 'self', 'room_id' ] args=( <synapse.storage.databases.main.DataStore object at 0x10d0b8d00>, '!HBehERstyQBxyJDLfR:my.synapse.server' ) ``` --- The previous logic was also flawed and we can end up in a situation like this: ``` argspec.args=['self', 'dest', 'room_id', 'limit', 'extremities'] args=(<synapse.federation.federation_client.FederationClient object at 0x7f1651c18160>, 'hs1', '!jAEHKIubyIfuLOdfpY:hs1') ``` From this source: ```py async def backfill( self, dest: str, room_id: str, limit: int, extremities: Collection[str] ) -> Optional[List[EventBase]]: ``` And this usage: ```py events = await self._federation_client.backfill( dest, room_id, limit=limit, extremities=extremities ) ``` which would previously cause this error: ``` synapse_main | 2022-08-04 06:13:12,051 - synapse.handlers.federation - 424 - ERROR - GET-5 - Failed to backfill from hs1 because tuple index out of range synapse_main | Traceback (most recent call last): synapse_main | File "/usr/local/lib/python3.9/site-packages/synapse/handlers/federation.py", line 392, in try_backfill synapse_main | await self._federation_event_handler.backfill( synapse_main | File "/usr/local/lib/python3.9/site-packages/synapse/logging/tracing.py", line 828, in _wrapper synapse_main | return await func(*args, **kwargs) synapse_main | File "/usr/local/lib/python3.9/site-packages/synapse/handlers/federation_event.py", line 593, in backfill synapse_main | events = await self._federation_client.backfill( synapse_main | File "/usr/local/lib/python3.9/site-packages/synapse/logging/tracing.py", line 828, in _wrapper synapse_main | return await func(*args, **kwargs) synapse_main | File "/usr/local/lib/python3.9/site-packages/synapse/logging/tracing.py", line 827, in _wrapper synapse_main | with wrapping_logic(func, *args, **kwargs): synapse_main | File "/usr/local/lib/python3.9/contextlib.py", line 119, in __enter__ synapse_main | return next(self.gen) synapse_main | File "/usr/local/lib/python3.9/site-packages/synapse/logging/tracing.py", line 922, in _wrapping_logic synapse_main | set_attribute("ARG_" + arg, str(args[i + 1])) # type: ignore[index] synapse_main | IndexError: tuple index out of range ```
1 parent ec24813 commit 860fdd9

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

changelog.d/13452.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix `@tag_args` being off-by-one with the arguments when tagging a span (tracing).

synapse/logging/opentracing.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,11 @@ def trace(func: Callable[P, R]) -> Callable[P, R]:
901901
def tag_args(func: Callable[P, R]) -> Callable[P, R]:
902902
"""
903903
Tags all of the args to the active span.
904+
905+
Args:
906+
func: `func` is assumed to be a method taking a `self` parameter, or a
907+
`classmethod` taking a `cls` parameter. In either case, a tag is not
908+
created for this parameter.
904909
"""
905910

906911
if not opentracing:
@@ -909,8 +914,14 @@ def tag_args(func: Callable[P, R]) -> Callable[P, R]:
909914
@wraps(func)
910915
def _tag_args_inner(*args: P.args, **kwargs: P.kwargs) -> R:
911916
argspec = inspect.getfullargspec(func)
912-
for i, arg in enumerate(argspec.args[1:]):
913-
set_tag("ARG_" + arg, str(args[i])) # type: ignore[index]
917+
# We use `[1:]` to skip the `self` object reference and `start=1` to
918+
# make the index line up with `argspec.args`.
919+
#
920+
# FIXME: We could update this handle any type of function by ignoring the
921+
# first argument only if it's named `self` or `cls`. This isn't fool-proof
922+
# but handles the idiomatic cases.
923+
for i, arg in enumerate(args[1:], start=1): # type: ignore[index]
924+
set_tag("ARG_" + argspec.args[i], str(arg))
914925
set_tag("args", str(args[len(argspec.args) :])) # type: ignore[index]
915926
set_tag("kwargs", str(kwargs))
916927
return func(*args, **kwargs)

0 commit comments

Comments
 (0)