We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
AttributeError: 'coroutine' object has no attribute 'add_done_callback'

### Which version of dd-trace-py are you using?

ddtrace 0.57.1

### Which version of pip are you using?

pip 21.3.1

### Which version of the libraries are you using?

aioredis 1.3.1

### What is the result that you get?

```
  File "aioredis/commands/list.py", line 97, in lrange
    return self.execute(b'LRANGE', key, start, stop, encoding=encoding)
  File "ddtrace/contrib/aioredis/patch.py", line 147, in traced_13_execute_command
    task.add_done_callback(_finish_span)
```

### What is the result that you expected?

No errors



--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `ddtrace/contrib/aioredis/patch.py`
Content:
```
1 import sys
2 
3 import aioredis
4 
5 from ddtrace import config
6 from ddtrace.internal.utils.wrappers import unwrap as _u
7 from ddtrace.pin import Pin
8 from ddtrace.vendor.wrapt import wrap_function_wrapper as _w
9 
10 from .. import trace_utils
11 from ...constants import ANALYTICS_SAMPLE_RATE_KEY
12 from ...constants import SPAN_MEASURED_KEY
13 from ...ext import SpanTypes
14 from ...ext import net
15 from ...ext import redis as redisx
16 from ..redis.util import _trace_redis_cmd
17 from ..redis.util import _trace_redis_execute_pipeline
18 from ..redis.util import format_command_args
19 
20 
21 try:
22     from aioredis.commands.transaction import _RedisBuffer
23 except ImportError:
24     _RedisBuffer = None
25 
26 config._add("aioredis", dict(_default_service="redis"))
27 
28 aioredis_version_str = getattr(aioredis, "__version__", "0.0.0")
29 aioredis_version = tuple([int(i) for i in aioredis_version_str.split(".")])
30 
31 
32 def patch():
33     if getattr(aioredis, "_datadog_patch", False):
34         return
35     setattr(aioredis, "_datadog_patch", True)
36     pin = Pin()
37     if aioredis_version >= (2, 0):
38         _w("aioredis.client", "Redis.execute_command", traced_execute_command)
39         _w("aioredis.client", "Redis.pipeline", traced_pipeline)
40         _w("aioredis.client", "Pipeline.execute", traced_execute_pipeline)
41         pin.onto(aioredis.client.Redis)
42     else:
43         _w("aioredis", "Redis.execute", traced_13_execute_command)
44         _w("aioredis", "Redis.pipeline", traced_13_pipeline)
45         _w("aioredis.commands.transaction", "Pipeline.execute", traced_13_execute_pipeline)
46         pin.onto(aioredis.Redis)
47 
48 
49 def unpatch():
50     if not getattr(aioredis, "_datadog_patch", False):
51         return
52 
53     setattr(aioredis, "_datadog_patch", False)
54     if aioredis_version >= (2, 0):
55         _u(aioredis.client.Redis, "execute_command")
56         _u(aioredis.client.Redis, "pipeline")
57         _u(aioredis.client.Pipeline, "execute")
58     else:
59         _u(aioredis.Redis, "execute")
60         _u(aioredis.Redis, "pipeline")
61         _u(aioredis.commands.transaction.Pipeline, "execute")
62 
63 
64 async def traced_execute_command(func, instance, args, kwargs):
65     pin = Pin.get_from(instance)
66     if not pin or not pin.enabled():
67         return await func(*args, **kwargs)
68 
69     with _trace_redis_cmd(pin, config.aioredis, instance, args):
70         return await func(*args, **kwargs)
71 
72 
73 def traced_pipeline(func, instance, args, kwargs):
74     pipeline = func(*args, **kwargs)
75     pin = Pin.get_from(instance)
76     if pin:
77         pin.onto(pipeline)
78     return pipeline
79 
80 
81 async def traced_execute_pipeline(func, instance, args, kwargs):
82     pin = Pin.get_from(instance)
83     if not pin or not pin.enabled():
84         return await func(*args, **kwargs)
85 
86     cmds = [format_command_args(c) for c, _ in instance.command_stack]
87     resource = "\n".join(cmds)
88     with _trace_redis_execute_pipeline(pin, config.aioredis, resource, instance):
89         return await func(*args, **kwargs)
90 
91 
92 def traced_13_pipeline(func, instance, args, kwargs):
93     pipeline = func(*args, **kwargs)
94     pin = Pin.get_from(instance)
95     if pin:
96         pin.onto(pipeline)
97     return pipeline
98 
99 
100 def traced_13_execute_command(func, instance, args, kwargs):
101     # If we have a _RedisBuffer then we are in a pipeline
102     if isinstance(instance.connection, _RedisBuffer):
103         return func(*args, **kwargs)
104 
105     pin = Pin.get_from(instance)
106     if not pin or not pin.enabled():
107         return func(*args, **kwargs)
108 
109     # Don't activate the span since this operation is performed as a future which concludes sometime later on in
110     # execution so subsequent operations in the stack are not necessarily semantically related
111     # (we don't want this span to be the parent of all other spans created before the future is resolved)
112     span = pin.tracer.start_span(
113         redisx.CMD, service=trace_utils.ext_service(pin, config.aioredis), span_type=SpanTypes.REDIS, activate=False
114     )
115 
116     span.set_tag(SPAN_MEASURED_KEY)
117     query = format_command_args(args)
118     span.resource = query
119     span.set_tag(redisx.RAWCMD, query)
120     if pin.tags:
121         span.set_tags(pin.tags)
122 
123     span.set_tags(
124         {
125             net.TARGET_HOST: instance.address[0],
126             net.TARGET_PORT: instance.address[1],
127             redisx.DB: instance.db or 0,
128         }
129     )
130     span.set_metric(redisx.ARGS_LEN, len(args))
131     # set analytics sample rate if enabled
132     span.set_tag(ANALYTICS_SAMPLE_RATE_KEY, config.aioredis.get_analytics_sample_rate())
133 
134     def _finish_span(future):
135         try:
136             # Accessing the result will raise an exception if:
137             #   - The future was cancelled
138             #   - There was an error executing the future (`future.exception()`)
139             #   - The future is in an invalid state
140             future.result()
141         except Exception:
142             span.set_exc_info(*sys.exc_info())
143         finally:
144             span.finish()
145 
146     task = func(*args, **kwargs)
147     task.add_done_callback(_finish_span)
148     return task
149 
150 
151 async def traced_13_execute_pipeline(func, instance, args, kwargs):
152     pin = Pin.get_from(instance)
153     if not pin or not pin.enabled():
154         return await func(*args, **kwargs)
155 
156     cmds = []
157     for _, cmd, cmd_args, _ in instance._pipeline:
158         parts = [cmd]
159         parts.extend(cmd_args)
160         cmds.append(format_command_args(parts))
161     resource = "\n".join(cmds)
162     with pin.tracer.trace(
163         redisx.CMD,
164         resource=resource,
165         service=trace_utils.ext_service(pin, config.aioredis),
166         span_type=SpanTypes.REDIS,
167     ) as span:
168 
169         span.set_tags(
170             {
171                 net.TARGET_HOST: instance._pool_or_conn.address[0],
172                 net.TARGET_PORT: instance._pool_or_conn.address[1],
173                 redisx.DB: instance._pool_or_conn.db or 0,
174             }
175         )
176 
177         span.set_tag(SPAN_MEASURED_KEY)
178         span.set_tag(redisx.RAWCMD, resource)
179         span.set_metric(redisx.PIPELINE_LEN, len(instance._pipeline))
180         # set analytics sample rate if enabled
181         span.set_tag(ANALYTICS_SAMPLE_RATE_KEY, config.aioredis.get_analytics_sample_rate())
182 
183         return await func(*args, **kwargs)
184
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/ddtrace/contrib/aioredis/patch.py b/ddtrace/contrib/aioredis/patch.py
--- a/ddtrace/contrib/aioredis/patch.py
+++ b/ddtrace/contrib/aioredis/patch.py
@@ -1,3 +1,4 @@
+import asyncio
 import sys
 
 import aioredis
@@ -144,6 +145,9 @@
             span.finish()
 
     task = func(*args, **kwargs)
+    # Execute command returns a coroutine when no free connections are available
+    # https://github.com/aio-libs/aioredis-py/blob/v1.3.1/aioredis/pool.py#L191
+    task = asyncio.ensure_future(task)
     task.add_done_callback(_finish_span)
     return task

{"golden_diff": "diff --git a/ddtrace/contrib/aioredis/patch.py b/ddtrace/contrib/aioredis/patch.py\n--- a/ddtrace/contrib/aioredis/patch.py\n+++ b/ddtrace/contrib/aioredis/patch.py\n@@ -1,3 +1,4 @@\n+import asyncio\n import sys\n \n import aioredis\n@@ -144,6 +145,9 @@\n             span.finish()\n \n     task = func(*args, **kwargs)\n+    # Execute command returns a coroutine when no free connections are available\n+    # https://github.com/aio-libs/aioredis-py/blob/v1.3.1/aioredis/pool.py#L191\n+    task = asyncio.ensure_future(task)\n     task.add_done_callback(_finish_span)\n     return task\n", "issue": "AttributeError: 'coroutine' object has no attribute 'add_done_callback'\n\r\n### Which version of dd-trace-py are you using?\r\n\r\nddtrace 0.57.1\r\n\r\n### Which version of pip are you using?\r\n\r\npip 21.3.1\r\n\r\n### Which version of the libraries are you using?\r\n\r\naioredis 1.3.1\r\n\r\n### What is the result that you get?\r\n\r\n```\r\n  File \"aioredis/commands/list.py\", line 97, in lrange\r\n    return self.execute(b'LRANGE', key, start, stop, encoding=encoding)\r\n  File \"ddtrace/contrib/aioredis/patch.py\", line 147, in traced_13_execute_command\r\n    task.add_done_callback(_finish_span)\r\n```\r\n\r\n### What is the result that you expected?\r\n\r\nNo errors\r\n\r\n\n", "before_files": [{"content": "import sys\n\nimport aioredis\n\nfrom ddtrace import config\nfrom ddtrace.internal.utils.wrappers import unwrap as _u\nfrom ddtrace.pin import Pin\nfrom ddtrace.vendor.wrapt import wrap_function_wrapper as _w\n\nfrom .. import trace_utils\nfrom ...constants import ANALYTICS_SAMPLE_RATE_KEY\nfrom ...constants import SPAN_MEASURED_KEY\nfrom ...ext import SpanTypes\nfrom ...ext import net\nfrom ...ext import redis as redisx\nfrom ..redis.util import _trace_redis_cmd\nfrom ..redis.util import _trace_redis_execute_pipeline\nfrom ..redis.util import format_command_args\n\n\ntry:\n    from aioredis.commands.transaction import _RedisBuffer\nexcept ImportError:\n    _RedisBuffer = None\n\nconfig._add(\"aioredis\", dict(_default_service=\"redis\"))\n\naioredis_version_str = getattr(aioredis, \"__version__\", \"0.0.0\")\naioredis_version = tuple([int(i) for i in aioredis_version_str.split(\".\")])\n\n\ndef patch():\n    if getattr(aioredis, \"_datadog_patch\", False):\n        return\n    setattr(aioredis, \"_datadog_patch\", True)\n    pin = Pin()\n    if aioredis_version >= (2, 0):\n        _w(\"aioredis.client\", \"Redis.execute_command\", traced_execute_command)\n        _w(\"aioredis.client\", \"Redis.pipeline\", traced_pipeline)\n        _w(\"aioredis.client\", \"Pipeline.execute\", traced_execute_pipeline)\n        pin.onto(aioredis.client.Redis)\n    else:\n        _w(\"aioredis\", \"Redis.execute\", traced_13_execute_command)\n        _w(\"aioredis\", \"Redis.pipeline\", traced_13_pipeline)\n        _w(\"aioredis.commands.transaction\", \"Pipeline.execute\", traced_13_execute_pipeline)\n        pin.onto(aioredis.Redis)\n\n\ndef unpatch():\n    if not getattr(aioredis, \"_datadog_patch\", False):\n        return\n\n    setattr(aioredis, \"_datadog_patch\", False)\n    if aioredis_version >= (2, 0):\n        _u(aioredis.client.Redis, \"execute_command\")\n        _u(aioredis.client.Redis, \"pipeline\")\n        _u(aioredis.client.Pipeline, \"execute\")\n    else:\n        _u(aioredis.Redis, \"execute\")\n        _u(aioredis.Redis, \"pipeline\")\n        _u(aioredis.commands.transaction.Pipeline, \"execute\")\n\n\nasync def traced_execute_command(func, instance, args, kwargs):\n    pin = Pin.get_from(instance)\n    if not pin or not pin.enabled():\n        return await func(*args, **kwargs)\n\n    with _trace_redis_cmd(pin, config.aioredis, instance, args):\n        return await func(*args, **kwargs)\n\n\ndef traced_pipeline(func, instance, args, kwargs):\n    pipeline = func(*args, **kwargs)\n    pin = Pin.get_from(instance)\n    if pin:\n        pin.onto(pipeline)\n    return pipeline\n\n\nasync def traced_execute_pipeline(func, instance, args, kwargs):\n    pin = Pin.get_from(instance)\n    if not pin or not pin.enabled():\n        return await func(*args, **kwargs)\n\n    cmds = [format_command_args(c) for c, _ in instance.command_stack]\n    resource = \"\\n\".join(cmds)\n    with _trace_redis_execute_pipeline(pin, config.aioredis, resource, instance):\n        return await func(*args, **kwargs)\n\n\ndef traced_13_pipeline(func, instance, args, kwargs):\n    pipeline = func(*args, **kwargs)\n    pin = Pin.get_from(instance)\n    if pin:\n        pin.onto(pipeline)\n    return pipeline\n\n\ndef traced_13_execute_command(func, instance, args, kwargs):\n    # If we have a _RedisBuffer then we are in a pipeline\n    if isinstance(instance.connection, _RedisBuffer):\n        return func(*args, **kwargs)\n\n    pin = Pin.get_from(instance)\n    if not pin or not pin.enabled():\n        return func(*args, **kwargs)\n\n    # Don't activate the span since this operation is performed as a future which concludes sometime later on in\n    # execution so subsequent operations in the stack are not necessarily semantically related\n    # (we don't want this span to be the parent of all other spans created before the future is resolved)\n    span = pin.tracer.start_span(\n        redisx.CMD, service=trace_utils.ext_service(pin, config.aioredis), span_type=SpanTypes.REDIS, activate=False\n    )\n\n    span.set_tag(SPAN_MEASURED_KEY)\n    query = format_command_args(args)\n    span.resource = query\n    span.set_tag(redisx.RAWCMD, query)\n    if pin.tags:\n        span.set_tags(pin.tags)\n\n    span.set_tags(\n        {\n            net.TARGET_HOST: instance.address[0],\n            net.TARGET_PORT: instance.address[1],\n            redisx.DB: instance.db or 0,\n        }\n    )\n    span.set_metric(redisx.ARGS_LEN, len(args))\n    # set analytics sample rate if enabled\n    span.set_tag(ANALYTICS_SAMPLE_RATE_KEY, config.aioredis.get_analytics_sample_rate())\n\n    def _finish_span(future):\n        try:\n            # Accessing the result will raise an exception if:\n            #   - The future was cancelled\n            #   - There was an error executing the future (`future.exception()`)\n            #   - The future is in an invalid state\n            future.result()\n        except Exception:\n            span.set_exc_info(*sys.exc_info())\n        finally:\n            span.finish()\n\n    task = func(*args, **kwargs)\n    task.add_done_callback(_finish_span)\n    return task\n\n\nasync def traced_13_execute_pipeline(func, instance, args, kwargs):\n    pin = Pin.get_from(instance)\n    if not pin or not pin.enabled():\n        return await func(*args, **kwargs)\n\n    cmds = []\n    for _, cmd, cmd_args, _ in instance._pipeline:\n        parts = [cmd]\n        parts.extend(cmd_args)\n        cmds.append(format_command_args(parts))\n    resource = \"\\n\".join(cmds)\n    with pin.tracer.trace(\n        redisx.CMD,\n        resource=resource,\n        service=trace_utils.ext_service(pin, config.aioredis),\n        span_type=SpanTypes.REDIS,\n    ) as span:\n\n        span.set_tags(\n            {\n                net.TARGET_HOST: instance._pool_or_conn.address[0],\n                net.TARGET_PORT: instance._pool_or_conn.address[1],\n                redisx.DB: instance._pool_or_conn.db or 0,\n            }\n        )\n\n        span.set_tag(SPAN_MEASURED_KEY)\n        span.set_tag(redisx.RAWCMD, resource)\n        span.set_metric(redisx.PIPELINE_LEN, len(instance._pipeline))\n        # set analytics sample rate if enabled\n        span.set_tag(ANALYTICS_SAMPLE_RATE_KEY, config.aioredis.get_analytics_sample_rate())\n\n        return await func(*args, **kwargs)\n", "path": "ddtrace/contrib/aioredis/patch.py"}], "after_files": [{"content": "import asyncio\nimport sys\n\nimport aioredis\n\nfrom ddtrace import config\nfrom ddtrace.internal.utils.wrappers import unwrap as _u\nfrom ddtrace.pin import Pin\nfrom ddtrace.vendor.wrapt import wrap_function_wrapper as _w\n\nfrom .. import trace_utils\nfrom ...constants import ANALYTICS_SAMPLE_RATE_KEY\nfrom ...constants import SPAN_MEASURED_KEY\nfrom ...ext import SpanTypes\nfrom ...ext import net\nfrom ...ext import redis as redisx\nfrom ..redis.util import _trace_redis_cmd\nfrom ..redis.util import _trace_redis_execute_pipeline\nfrom ..redis.util import format_command_args\n\n\ntry:\n    from aioredis.commands.transaction import _RedisBuffer\nexcept ImportError:\n    _RedisBuffer = None\n\nconfig._add(\"aioredis\", dict(_default_service=\"redis\"))\n\naioredis_version_str = getattr(aioredis, \"__version__\", \"0.0.0\")\naioredis_version = tuple([int(i) for i in aioredis_version_str.split(\".\")])\n\n\ndef patch():\n    if getattr(aioredis, \"_datadog_patch\", False):\n        return\n    setattr(aioredis, \"_datadog_patch\", True)\n    pin = Pin()\n    if aioredis_version >= (2, 0):\n        _w(\"aioredis.client\", \"Redis.execute_command\", traced_execute_command)\n        _w(\"aioredis.client\", \"Redis.pipeline\", traced_pipeline)\n        _w(\"aioredis.client\", \"Pipeline.execute\", traced_execute_pipeline)\n        pin.onto(aioredis.client.Redis)\n    else:\n        _w(\"aioredis\", \"Redis.execute\", traced_13_execute_command)\n        _w(\"aioredis\", \"Redis.pipeline\", traced_13_pipeline)\n        _w(\"aioredis.commands.transaction\", \"Pipeline.execute\", traced_13_execute_pipeline)\n        pin.onto(aioredis.Redis)\n\n\ndef unpatch():\n    if not getattr(aioredis, \"_datadog_patch\", False):\n        return\n\n    setattr(aioredis, \"_datadog_patch\", False)\n    if aioredis_version >= (2, 0):\n        _u(aioredis.client.Redis, \"execute_command\")\n        _u(aioredis.client.Redis, \"pipeline\")\n        _u(aioredis.client.Pipeline, \"execute\")\n    else:\n        _u(aioredis.Redis, \"execute\")\n        _u(aioredis.Redis, \"pipeline\")\n        _u(aioredis.commands.transaction.Pipeline, \"execute\")\n\n\nasync def traced_execute_command(func, instance, args, kwargs):\n    pin = Pin.get_from(instance)\n    if not pin or not pin.enabled():\n        return await func(*args, **kwargs)\n\n    with _trace_redis_cmd(pin, config.aioredis, instance, args):\n        return await func(*args, **kwargs)\n\n\ndef traced_pipeline(func, instance, args, kwargs):\n    pipeline = func(*args, **kwargs)\n    pin = Pin.get_from(instance)\n    if pin:\n        pin.onto(pipeline)\n    return pipeline\n\n\nasync def traced_execute_pipeline(func, instance, args, kwargs):\n    pin = Pin.get_from(instance)\n    if not pin or not pin.enabled():\n        return await func(*args, **kwargs)\n\n    cmds = [format_command_args(c) for c, _ in instance.command_stack]\n    resource = \"\\n\".join(cmds)\n    with _trace_redis_execute_pipeline(pin, config.aioredis, resource, instance):\n        return await func(*args, **kwargs)\n\n\ndef traced_13_pipeline(func, instance, args, kwargs):\n    pipeline = func(*args, **kwargs)\n    pin = Pin.get_from(instance)\n    if pin:\n        pin.onto(pipeline)\n    return pipeline\n\n\ndef traced_13_execute_command(func, instance, args, kwargs):\n    # If we have a _RedisBuffer then we are in a pipeline\n    if isinstance(instance.connection, _RedisBuffer):\n        return func(*args, **kwargs)\n\n    pin = Pin.get_from(instance)\n    if not pin or not pin.enabled():\n        return func(*args, **kwargs)\n\n    # Don't activate the span since this operation is performed as a future which concludes sometime later on in\n    # execution so subsequent operations in the stack are not necessarily semantically related\n    # (we don't want this span to be the parent of all other spans created before the future is resolved)\n    span = pin.tracer.start_span(\n        redisx.CMD, service=trace_utils.ext_service(pin, config.aioredis), span_type=SpanTypes.REDIS, activate=False\n    )\n\n    span.set_tag(SPAN_MEASURED_KEY)\n    query = format_command_args(args)\n    span.resource = query\n    span.set_tag(redisx.RAWCMD, query)\n    if pin.tags:\n        span.set_tags(pin.tags)\n\n    span.set_tags(\n        {\n            net.TARGET_HOST: instance.address[0],\n            net.TARGET_PORT: instance.address[1],\n            redisx.DB: instance.db or 0,\n        }\n    )\n    span.set_metric(redisx.ARGS_LEN, len(args))\n    # set analytics sample rate if enabled\n    span.set_tag(ANALYTICS_SAMPLE_RATE_KEY, config.aioredis.get_analytics_sample_rate())\n\n    def _finish_span(future):\n        try:\n            # Accessing the result will raise an exception if:\n            #   - The future was cancelled\n            #   - There was an error executing the future (`future.exception()`)\n            #   - The future is in an invalid state\n            future.result()\n        except Exception:\n            span.set_exc_info(*sys.exc_info())\n        finally:\n            span.finish()\n\n    task = func(*args, **kwargs)\n    # Execute command returns a coroutine when no free connections are available\n    # https://github.com/aio-libs/aioredis-py/blob/v1.3.1/aioredis/pool.py#L191\n    task = asyncio.ensure_future(task)\n    task.add_done_callback(_finish_span)\n    return task\n\n\nasync def traced_13_execute_pipeline(func, instance, args, kwargs):\n    pin = Pin.get_from(instance)\n    if not pin or not pin.enabled():\n        return await func(*args, **kwargs)\n\n    cmds = []\n    for _, cmd, cmd_args, _ in instance._pipeline:\n        parts = [cmd]\n        parts.extend(cmd_args)\n        cmds.append(format_command_args(parts))\n    resource = \"\\n\".join(cmds)\n    with pin.tracer.trace(\n        redisx.CMD,\n        resource=resource,\n        service=trace_utils.ext_service(pin, config.aioredis),\n        span_type=SpanTypes.REDIS,\n    ) as span:\n\n        span.set_tags(\n            {\n                net.TARGET_HOST: instance._pool_or_conn.address[0],\n                net.TARGET_PORT: instance._pool_or_conn.address[1],\n                redisx.DB: instance._pool_or_conn.db or 0,\n            }\n        )\n\n        span.set_tag(SPAN_MEASURED_KEY)\n        span.set_tag(redisx.RAWCMD, resource)\n        span.set_metric(redisx.PIPELINE_LEN, len(instance._pipeline))\n        # set analytics sample rate if enabled\n        span.set_tag(ANALYTICS_SAMPLE_RATE_KEY, config.aioredis.get_analytics_sample_rate())\n\n        return await func(*args, **kwargs)\n", "path": "ddtrace/contrib/aioredis/patch.py"}]}