mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-07-31 22:23:12 +08:00
103 lines
2.9 KiB
Python
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
|