Files
2020-04-08 10:39:44 -07:00

103 lines
2.9 KiB
Python

# -*- coding: utf-8 -*-
import rediscluster
from ddtrace import Pin
from ddtrace.contrib.rediscluster.patch import patch, unpatch
from ..config import REDISCLUSTER_CONFIG
from ...test_tracer import get_dummy_tracer
from ...base import BaseTracerTestCase
class TestRedisPatch(BaseTracerTestCase):
TEST_SERVICE = 'rediscluster-patch'
TEST_HOST = REDISCLUSTER_CONFIG['host']
TEST_PORTS = REDISCLUSTER_CONFIG['ports']
def _get_test_client(self):
startup_nodes = [
{'host': self.TEST_HOST, 'port': int(port)}
for port in self.TEST_PORTS.split(',')
]
return rediscluster.StrictRedisCluster(startup_nodes=startup_nodes)
def setUp(self):
super(TestRedisPatch, self).setUp()
patch()
r = self._get_test_client()
r.flushall()
Pin.override(r, service=self.TEST_SERVICE, tracer=self.tracer)
self.r = r
def tearDown(self):
unpatch()
super(TestRedisPatch, self).tearDown()
def test_basics(self):
us = self.r.get('cheese')
assert us is None
spans = self.get_spans()
assert len(spans) == 1
span = spans[0]
assert span.service == self.TEST_SERVICE
assert span.name == 'redis.command'
assert span.span_type == 'redis'
assert span.error == 0
assert span.get_tag('redis.raw_command') == u'GET cheese'
assert span.get_metric('redis.args_length') == 2
assert span.resource == 'GET cheese'
def test_pipeline(self):
with self.r.pipeline(transaction=False) as p:
p.set('blah', 32)
p.rpush('foo', u'éé')
p.hgetall('xxx')
p.execute()
spans = self.get_spans()
assert len(spans) == 1
span = spans[0]
assert span.service == self.TEST_SERVICE
assert span.name == 'redis.command'
assert span.resource == u'SET blah 32\nRPUSH foo éé\nHGETALL xxx'
assert span.span_type == 'redis'
assert span.error == 0
assert span.get_tag('redis.raw_command') == u'SET blah 32\nRPUSH foo éé\nHGETALL xxx'
assert span.get_metric('redis.pipeline_length') == 3
def test_patch_unpatch(self):
tracer = get_dummy_tracer()
writer = tracer.writer
# Test patch idempotence
patch()
patch()
r = self._get_test_client()
Pin.get_from(r).clone(tracer=tracer).onto(r)
r.get('key')
spans = writer.pop()
assert spans, spans
assert len(spans) == 1
# Test unpatch
unpatch()
r = self._get_test_client()
r.get('key')
spans = writer.pop()
assert not spans, spans
# Test patch again
patch()
r = self._get_test_client()
Pin.get_from(r).clone(tracer=tracer).onto(r)
r.get('key')
spans = writer.pop()
assert spans, spans
assert len(spans) == 1