Skip to content

Commit dc87bd3

Browse files
authored
Add support for redis v5. (#895)
* Instrumentat methods added in redis v5 release. * Update metrics in redis tests.
1 parent 238b64d commit dc87bd3

File tree

8 files changed

+126
-95
lines changed

8 files changed

+126
-95
lines changed

newrelic/hooks/datastore_redis.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@
161161
"cluster_reset",
162162
"cluster_save_config",
163163
"cluster_set_config_epoch",
164+
"client_setinfo",
164165
"cluster_setslot",
165166
"cluster_slaves",
166167
"cluster_slots",
@@ -219,6 +220,7 @@
219220
"function_load",
220221
"function_restore",
221222
"function_stats",
223+
"gears_refresh_cluster",
222224
"geoadd",
223225
"geodist",
224226
"geohash",
@@ -320,6 +322,8 @@
320322
"pubsub_channels",
321323
"pubsub_numpat",
322324
"pubsub_numsub",
325+
"pubsub_shardchannels",
326+
"pubsub_shardnumsub",
323327
"punsubscribe",
324328
"quantile",
325329
"query",
@@ -374,6 +378,7 @@
374378
"smismember",
375379
"smove",
376380
"spellcheck",
381+
"spublish",
377382
"srem",
378383
"sscan_iter",
379384
"sscan",
@@ -393,6 +398,11 @@
393398
"syndump",
394399
"synupdate",
395400
"tagvals",
401+
"tfcall",
402+
"tfcall_async",
403+
"tfunction_delete",
404+
"tfunction_list",
405+
"tfunction_load",
396406
"time",
397407
"toggle",
398408
"touch",

tests/datastore_redis/test_asyncio.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,27 @@
2828
# Settings
2929

3030
DB_SETTINGS = redis_settings()[0]
31-
REDIS_VERSION = get_package_version_tuple("redis")
31+
REDIS_PY_VERSION = get_package_version_tuple("redis")
3232

3333
# Metrics
3434

35-
_enable_scoped_metrics = [("Datastore/operation/Redis/publish", 3)]
35+
_base_scoped_metrics = [("Datastore/operation/Redis/publish", 3)]
3636

37-
_enable_rollup_metrics = [
38-
("Datastore/all", 3),
39-
("Datastore/allOther", 3),
40-
("Datastore/Redis/all", 3),
41-
("Datastore/Redis/allOther", 3),
37+
if REDIS_PY_VERSION >= (5, 0):
38+
_base_scoped_metrics.append(('Datastore/operation/Redis/client_setinfo', 2),)
39+
40+
datastore_all_metric_count = 5 if REDIS_PY_VERSION >= (5, 0) else 3
41+
42+
_base_rollup_metrics = [
43+
("Datastore/all", datastore_all_metric_count),
44+
("Datastore/allOther", datastore_all_metric_count),
45+
("Datastore/Redis/all", datastore_all_metric_count),
46+
("Datastore/Redis/allOther", datastore_all_metric_count),
4247
("Datastore/operation/Redis/publish", 3),
43-
("Datastore/instance/Redis/%s/%s" % (instance_hostname(DB_SETTINGS["host"]), DB_SETTINGS["port"]), 3),
48+
("Datastore/instance/Redis/%s/%s" % (instance_hostname(DB_SETTINGS["host"]), DB_SETTINGS["port"]), datastore_all_metric_count),
4449
]
50+
if REDIS_PY_VERSION >= (5, 0):
51+
_base_rollup_metrics.append(('Datastore/operation/Redis/client_setinfo', 2),)
4552

4653
# Tests
4754

@@ -53,7 +60,7 @@ def client(loop): # noqa
5360
return loop.run_until_complete(redis.asyncio.Redis(host=DB_SETTINGS["host"], port=DB_SETTINGS["port"], db=0))
5461

5562

56-
@pytest.mark.skipif(REDIS_VERSION < (4, 2), reason="This functionality exists in Redis 4.2+")
63+
@pytest.mark.skipif(REDIS_PY_VERSION < (4, 2), reason="This functionality exists in Redis 4.2+")
5764
@validate_transaction_metrics("test_asyncio:test_async_pipeline", background_task=True)
5865
@background_task()
5966
def test_async_pipeline(client, loop): # noqa
@@ -65,11 +72,11 @@ async def _test_pipeline(client):
6572
loop.run_until_complete(_test_pipeline(client))
6673

6774

68-
@pytest.mark.skipif(REDIS_VERSION < (4, 2), reason="This functionality exists in Redis 4.2+")
75+
@pytest.mark.skipif(REDIS_PY_VERSION < (4, 2), reason="This functionality exists in Redis 4.2+")
6976
@validate_transaction_metrics(
7077
"test_asyncio:test_async_pubsub",
71-
scoped_metrics=_enable_scoped_metrics,
72-
rollup_metrics=_enable_rollup_metrics,
78+
scoped_metrics=_base_scoped_metrics,
79+
rollup_metrics=_base_rollup_metrics,
7380
background_task=True,
7481
)
7582
@background_task()

tests/datastore_redis/test_custom_conn_pool.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,16 @@
2121
import redis
2222

2323
from newrelic.api.background_task import background_task
24+
from newrelic.common.package_version_utils import get_package_version_tuple
2425

2526
from testing_support.fixtures import override_application_settings
2627
from testing_support.validators.validate_transaction_metrics import validate_transaction_metrics
2728
from testing_support.db_settings import redis_settings
2829
from testing_support.util import instance_hostname
2930

31+
3032
DB_SETTINGS = redis_settings()[0]
31-
REDIS_PY_VERSION = redis.VERSION
33+
REDIS_PY_VERSION = get_package_version_tuple("redis")
3234

3335

3436
class FakeConnectionPool(object):
@@ -56,39 +58,41 @@ def release(self, connection):
5658

5759
# We don't record instance metrics when using redis blaster,
5860
# so we just check for base metrics.
61+
datastore_all_metric_count = 5 if REDIS_PY_VERSION >= (5, 0) else 3
5962

60-
_base_scoped_metrics = (
63+
_base_scoped_metrics = [
6164
('Datastore/operation/Redis/get', 1),
6265
('Datastore/operation/Redis/set', 1),
6366
('Datastore/operation/Redis/client_list', 1),
64-
)
65-
66-
_base_rollup_metrics = (
67-
('Datastore/all', 3),
68-
('Datastore/allOther', 3),
69-
('Datastore/Redis/all', 3),
70-
('Datastore/Redis/allOther', 3),
67+
]
68+
# client_setinfo was introduced in v5.0.0 and assigns info displayed in client_list output
69+
if REDIS_PY_VERSION >= (5, 0):
70+
_base_scoped_metrics.append(('Datastore/operation/Redis/client_setinfo', 2),)
71+
72+
_base_rollup_metrics = [
73+
('Datastore/all', datastore_all_metric_count),
74+
('Datastore/allOther', datastore_all_metric_count),
75+
('Datastore/Redis/all', datastore_all_metric_count),
76+
('Datastore/Redis/allOther', datastore_all_metric_count),
7177
('Datastore/operation/Redis/get', 1),
7278
('Datastore/operation/Redis/set', 1),
7379
('Datastore/operation/Redis/client_list', 1),
74-
)
75-
76-
_disable_scoped_metrics = list(_base_scoped_metrics)
77-
_disable_rollup_metrics = list(_base_rollup_metrics)
78-
79-
_enable_scoped_metrics = list(_base_scoped_metrics)
80-
_enable_rollup_metrics = list(_base_rollup_metrics)
80+
]
81+
if REDIS_PY_VERSION >= (5, 0):
82+
_base_rollup_metrics.append(('Datastore/operation/Redis/client_setinfo', 2),)
8183

8284
_host = instance_hostname(DB_SETTINGS['host'])
8385
_port = DB_SETTINGS['port']
8486

8587
_instance_metric_name = 'Datastore/instance/Redis/%s/%s' % (_host, _port)
8688

87-
_enable_rollup_metrics.append(
88-
(_instance_metric_name, 3)
89+
instance_metric_count = 5 if REDIS_PY_VERSION >= (5, 0) else 3
90+
91+
_enable_rollup_metrics = _base_rollup_metrics.append(
92+
(_instance_metric_name, instance_metric_count)
8993
)
9094

91-
_disable_rollup_metrics.append(
95+
_disable_rollup_metrics = _base_rollup_metrics.append(
9296
(_instance_metric_name, None)
9397
)
9498

@@ -106,7 +110,7 @@ def exercise_redis(client):
106110
@override_application_settings(_enable_instance_settings)
107111
@validate_transaction_metrics(
108112
'test_custom_conn_pool:test_fake_conn_pool_enable_instance',
109-
scoped_metrics=_enable_scoped_metrics,
113+
scoped_metrics=_base_scoped_metrics,
110114
rollup_metrics=_enable_rollup_metrics,
111115
background_task=True)
112116
@background_task()
@@ -132,7 +136,7 @@ def test_fake_conn_pool_enable_instance():
132136
@override_application_settings(_disable_instance_settings)
133137
@validate_transaction_metrics(
134138
'test_custom_conn_pool:test_fake_conn_pool_disable_instance',
135-
scoped_metrics=_disable_scoped_metrics,
139+
scoped_metrics=_base_scoped_metrics,
136140
rollup_metrics=_disable_rollup_metrics,
137141
background_task=True)
138142
@background_task()

tests/datastore_redis/test_execute_command.py

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@
1616
import redis
1717

1818
from newrelic.api.background_task import background_task
19+
from newrelic.common.package_version_utils import get_package_version_tuple
1920

2021
from testing_support.fixtures import override_application_settings
2122
from testing_support.validators.validate_transaction_metrics import validate_transaction_metrics
2223
from testing_support.db_settings import redis_settings
2324
from testing_support.util import instance_hostname
2425

2526
DB_SETTINGS = redis_settings()[0]
26-
REDIS_PY_VERSION = redis.VERSION
27+
REDIS_PY_VERSION = get_package_version_tuple("redis")
28+
2729

2830
# Settings
2931

@@ -36,34 +38,34 @@
3638

3739
# Metrics
3840

39-
_base_scoped_metrics = (
41+
_base_scoped_metrics = [
4042
('Datastore/operation/Redis/client_list', 1),
41-
)
42-
43-
_base_rollup_metrics = (
44-
('Datastore/all', 1),
45-
('Datastore/allOther', 1),
46-
('Datastore/Redis/all', 1),
47-
('Datastore/Redis/allOther', 1),
43+
]
44+
if REDIS_PY_VERSION >= (5, 0):
45+
_base_scoped_metrics.append(('Datastore/operation/Redis/client_setinfo', 2),)
46+
47+
_base_rollup_metrics = [
48+
('Datastore/all', 3),
49+
('Datastore/allOther', 3),
50+
('Datastore/Redis/all', 3),
51+
('Datastore/Redis/allOther', 3),
4852
('Datastore/operation/Redis/client_list', 1),
49-
)
50-
51-
_disable_scoped_metrics = list(_base_scoped_metrics)
52-
_disable_rollup_metrics = list(_base_rollup_metrics)
53-
54-
_enable_scoped_metrics = list(_base_scoped_metrics)
55-
_enable_rollup_metrics = list(_base_rollup_metrics)
53+
]
54+
if REDIS_PY_VERSION >= (5, 0):
55+
_base_rollup_metrics.append(('Datastore/operation/Redis/client_setinfo', 2),)
5656

5757
_host = instance_hostname(DB_SETTINGS['host'])
5858
_port = DB_SETTINGS['port']
5959

6060
_instance_metric_name = 'Datastore/instance/Redis/%s/%s' % (_host, _port)
6161

62-
_enable_rollup_metrics.append(
63-
(_instance_metric_name, 1)
62+
instance_metric_count = 3 if REDIS_PY_VERSION >= (5, 0) else 1
63+
64+
_enable_rollup_metrics = _base_rollup_metrics.append(
65+
(_instance_metric_name, instance_metric_count)
6466
)
6567

66-
_disable_rollup_metrics.append(
68+
_disable_rollup_metrics = _base_rollup_metrics.append(
6769
(_instance_metric_name, None)
6870
)
6971

@@ -76,7 +78,7 @@ def exercise_redis_single_arg(client):
7678
@override_application_settings(_enable_instance_settings)
7779
@validate_transaction_metrics(
7880
'test_execute_command:test_strict_redis_execute_command_two_args_enable',
79-
scoped_metrics=_enable_scoped_metrics,
81+
scoped_metrics=_base_scoped_metrics,
8082
rollup_metrics=_enable_rollup_metrics,
8183
background_task=True)
8284
@background_task()
@@ -88,7 +90,7 @@ def test_strict_redis_execute_command_two_args_enable():
8890
@override_application_settings(_disable_instance_settings)
8991
@validate_transaction_metrics(
9092
'test_execute_command:test_strict_redis_execute_command_two_args_disabled',
91-
scoped_metrics=_disable_scoped_metrics,
93+
scoped_metrics=_base_scoped_metrics,
9294
rollup_metrics=_disable_rollup_metrics,
9395
background_task=True)
9496
@background_task()
@@ -100,7 +102,7 @@ def test_strict_redis_execute_command_two_args_disabled():
100102
@override_application_settings(_enable_instance_settings)
101103
@validate_transaction_metrics(
102104
'test_execute_command:test_redis_execute_command_two_args_enable',
103-
scoped_metrics=_enable_scoped_metrics,
105+
scoped_metrics=_base_scoped_metrics,
104106
rollup_metrics=_enable_rollup_metrics,
105107
background_task=True)
106108
@background_task()
@@ -112,7 +114,7 @@ def test_redis_execute_command_two_args_enable():
112114
@override_application_settings(_disable_instance_settings)
113115
@validate_transaction_metrics(
114116
'test_execute_command:test_redis_execute_command_two_args_disabled',
115-
scoped_metrics=_disable_scoped_metrics,
117+
scoped_metrics=_base_scoped_metrics,
116118
rollup_metrics=_disable_rollup_metrics,
117119
background_task=True)
118120
@background_task()
@@ -126,7 +128,7 @@ def test_redis_execute_command_two_args_disabled():
126128
@override_application_settings(_enable_instance_settings)
127129
@validate_transaction_metrics(
128130
'test_execute_command:test_strict_redis_execute_command_as_one_arg_enable',
129-
scoped_metrics=_enable_scoped_metrics,
131+
scoped_metrics=_base_scoped_metrics,
130132
rollup_metrics=_enable_rollup_metrics,
131133
background_task=True)
132134
@background_task()
@@ -140,7 +142,7 @@ def test_strict_redis_execute_command_as_one_arg_enable():
140142
@override_application_settings(_disable_instance_settings)
141143
@validate_transaction_metrics(
142144
'test_execute_command:test_strict_redis_execute_command_as_one_arg_disabled',
143-
scoped_metrics=_disable_scoped_metrics,
145+
scoped_metrics=_base_scoped_metrics,
144146
rollup_metrics=_disable_rollup_metrics,
145147
background_task=True)
146148
@background_task()
@@ -154,7 +156,7 @@ def test_strict_redis_execute_command_as_one_arg_disabled():
154156
@override_application_settings(_enable_instance_settings)
155157
@validate_transaction_metrics(
156158
'test_execute_command:test_redis_execute_command_as_one_arg_enable',
157-
scoped_metrics=_enable_scoped_metrics,
159+
scoped_metrics=_base_scoped_metrics,
158160
rollup_metrics=_enable_rollup_metrics,
159161
background_task=True)
160162
@background_task()
@@ -168,7 +170,7 @@ def test_redis_execute_command_as_one_arg_enable():
168170
@override_application_settings(_disable_instance_settings)
169171
@validate_transaction_metrics(
170172
'test_execute_command:test_redis_execute_command_as_one_arg_disabled',
171-
scoped_metrics=_disable_scoped_metrics,
173+
scoped_metrics=_base_scoped_metrics,
172174
rollup_metrics=_disable_rollup_metrics,
173175
background_task=True)
174176
@background_task()

tests/datastore_redis/test_get_and_set.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,7 @@
4848
('Datastore/operation/Redis/set', 1),
4949
)
5050

51-
_disable_scoped_metrics = list(_base_scoped_metrics)
5251
_disable_rollup_metrics = list(_base_rollup_metrics)
53-
54-
_enable_scoped_metrics = list(_base_scoped_metrics)
5552
_enable_rollup_metrics = list(_base_rollup_metrics)
5653

5754
_host = instance_hostname(DB_SETTINGS['host'])
@@ -78,7 +75,7 @@ def exercise_redis(client):
7875
@override_application_settings(_enable_instance_settings)
7976
@validate_transaction_metrics(
8077
'test_get_and_set:test_strict_redis_operation_enable_instance',
81-
scoped_metrics=_enable_scoped_metrics,
78+
scoped_metrics=_base_scoped_metrics,
8279
rollup_metrics=_enable_rollup_metrics,
8380
background_task=True)
8481
@background_task()
@@ -90,7 +87,7 @@ def test_strict_redis_operation_enable_instance():
9087
@override_application_settings(_disable_instance_settings)
9188
@validate_transaction_metrics(
9289
'test_get_and_set:test_strict_redis_operation_disable_instance',
93-
scoped_metrics=_disable_scoped_metrics,
90+
scoped_metrics=_base_scoped_metrics,
9491
rollup_metrics=_disable_rollup_metrics,
9592
background_task=True)
9693
@background_task()
@@ -102,7 +99,7 @@ def test_strict_redis_operation_disable_instance():
10299
@override_application_settings(_enable_instance_settings)
103100
@validate_transaction_metrics(
104101
'test_get_and_set:test_redis_operation_enable_instance',
105-
scoped_metrics=_enable_scoped_metrics,
102+
scoped_metrics=_base_scoped_metrics,
106103
rollup_metrics=_enable_rollup_metrics,
107104
background_task=True)
108105
@background_task()
@@ -114,7 +111,7 @@ def test_redis_operation_enable_instance():
114111
@override_application_settings(_disable_instance_settings)
115112
@validate_transaction_metrics(
116113
'test_get_and_set:test_redis_operation_disable_instance',
117-
scoped_metrics=_disable_scoped_metrics,
114+
scoped_metrics=_base_scoped_metrics,
118115
rollup_metrics=_disable_rollup_metrics,
119116
background_task=True)
120117
@background_task()

0 commit comments

Comments
 (0)