From 6a0d3e896720e068a56c16945b419ffab3380f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Cavaill=C3=A9?= Date: Wed, 6 Jul 2016 10:23:39 +0200 Subject: [PATCH] [trace/redis] inherit from the correct class If using something else than the recommended class StrictRedis, like the backwards-compatible redis.Redis, attaching a StrictPipeline to a redis.Redis leads to unexpected behavior. for instance: ``` r = redis.Redis() r.zadd(key, member, score) # fine but should be (key, score, member) in # StrictRedis p = r.pipeline() p.zadd(key, member, score) # does not work because it's strict... ``` --- ddtrace/contrib/redis/tracers.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ddtrace/contrib/redis/tracers.py b/ddtrace/contrib/redis/tracers.py index a3450690aa0..8898e45ccc9 100644 --- a/ddtrace/contrib/redis/tracers.py +++ b/ddtrace/contrib/redis/tracers.py @@ -24,7 +24,13 @@ def get_traced_redis_from(ddtracer, baseclass, service=DEFAULT_SERVICE, meta=Non # pylint: disable=protected-access def _get_traced_redis(ddtracer, baseclass, service, meta): - class TracedPipeline(StrictPipeline): + basepipeline = StrictPipeline + try: + basepipeline = baseclass().pipeline().__class__ + except: + pass + + class TracedPipeline(basepipeline): _datadog_tracer = ddtracer _datadog_service = service _datadog_meta = meta