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

Fix @tag_args being off-by-one (ahead) #13452

Merged
merged 7 commits into from
Aug 4, 2022
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/13452.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix `@tag_args` being off-by-one with the arguments when tagging a span (tracing).
11 changes: 9 additions & 2 deletions synapse/logging/opentracing.py
Original file line number Diff line number Diff line change
Expand Up @@ -901,6 +901,11 @@ def trace(func: Callable[P, R]) -> Callable[P, R]:
def tag_args(func: Callable[P, R]) -> Callable[P, R]:
"""
Tags all of the args to the active span.

Args:
func: `func` is assumed to be a method taking a `self` parameter, or a
`classmethod` taking a `cls` parameter. In either case, a tag is not
created for this parameter.
"""

if not opentracing:
Expand All @@ -909,8 +914,10 @@ def tag_args(func: Callable[P, R]) -> Callable[P, R]:
@wraps(func)
def _tag_args_inner(*args: P.args, **kwargs: P.kwargs) -> R:
argspec = inspect.getfullargspec(func)
for i, arg in enumerate(argspec.args[1:]):
set_tag("ARG_" + arg, str(args[i])) # type: ignore[index]
# We use `[1:]` to skip the `self` object reference and `start=1` to
# make the index line up with `argspec.args`.
for i, arg in enumerate(args[1:], start=1): # type: ignore[index]
set_tag("ARG_" + argspec.args[i], str(arg))
set_tag("args", str(args[len(argspec.args) :])) # type: ignore[index]
MadLittleMods marked this conversation as resolved.
Show resolved Hide resolved
set_tag("kwargs", str(kwargs))
return func(*args, **kwargs)
Expand Down