Skip to content

Commit 763709f

Browse files
committed
Update pymemcache instrumentation to support pymemcache version >= 1.3.5
1 parent db47878 commit 763709f

File tree

6 files changed

+52
-21
lines changed

6 files changed

+52
-21
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5656
- `opentelemetry-instrumentation-kafka-python` Fix topic extraction
5757
([#949](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/949))
5858

59+
### Changed
60+
61+
- `opentelemetry-instrumentation-pymemcache` should run against newer versions of pymemcache.
62+
([#935](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/935))
63+
5964
## [1.9.1-0.28b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.9.1-0.28b1) - 2022-01-29
6065

6166
### Fixed

instrumentation/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
| [opentelemetry-instrumentation-mysql](./opentelemetry-instrumentation-mysql) | mysql-connector-python ~= 8.0 |
2424
| [opentelemetry-instrumentation-pika](./opentelemetry-instrumentation-pika) | pika >= 0.12.0 |
2525
| [opentelemetry-instrumentation-psycopg2](./opentelemetry-instrumentation-psycopg2) | psycopg2 >= 2.7.3.1 |
26-
| [opentelemetry-instrumentation-pymemcache](./opentelemetry-instrumentation-pymemcache) | pymemcache ~= 1.3 |
26+
| [opentelemetry-instrumentation-pymemcache](./opentelemetry-instrumentation-pymemcache) | pymemcache >= 1.3.5, < 4 |
2727
| [opentelemetry-instrumentation-pymongo](./opentelemetry-instrumentation-pymongo) | pymongo >= 3.1, < 5.0 |
2828
| [opentelemetry-instrumentation-pymysql](./opentelemetry-instrumentation-pymysql) | PyMySQL < 2 |
2929
| [opentelemetry-instrumentation-pyramid](./opentelemetry-instrumentation-pyramid) | pyramid >= 1.7 |

instrumentation/opentelemetry-instrumentation-pymemcache/src/opentelemetry/instrumentation/pymemcache/package.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# limitations under the License.
1414

1515

16-
_instruments = ("pymemcache ~= 1.3",)
16+
_instruments = ("pymemcache >= 1.3.5, < 4",)

instrumentation/opentelemetry-instrumentation-pymemcache/tests/test_pymemcache.py

+36-14
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
from unittest import mock
1515

1616
import pymemcache
17+
from packaging import version as get_package_version
18+
from pymemcache import __version__ as pymemcache_package_version
1719
from pymemcache.exceptions import (
1820
MemcacheClientError,
1921
MemcacheIllegalInputError,
@@ -33,6 +35,14 @@
3335
TEST_HOST = "localhost"
3436
TEST_PORT = 117711
3537

38+
pymemcache_version = get_package_version.parse(pymemcache_package_version)
39+
pymemcache_version_lt_2 = pymemcache_version < get_package_version.parse(
40+
"2.0.0"
41+
)
42+
pymemcache_version_gt_341 = pymemcache_version > get_package_version.parse(
43+
"3.4.1"
44+
)
45+
3646

3747
class PymemcacheClientTestCase(
3848
TestBase
@@ -126,11 +136,13 @@ def test_set_multi_success(self):
126136
client = self.make_client([b"STORED\r\n"])
127137
# Alias for set_many, a convienance function that calls set for every key
128138
result = client.set_multi({b"key": b"value"}, noreply=False)
129-
self.assertTrue(result)
130-
131139
spans = self.memory_exporter.get_finished_spans()
132-
133-
self.check_spans(spans, 2, ["set key", "set_multi key"])
140+
if pymemcache_version_lt_2:
141+
self.assertTrue(result)
142+
self.check_spans(spans, 2, ["set key", "set_multi key"])
143+
else:
144+
assert len(result) == 0
145+
self.check_spans(spans, 1, ["set_multi key"])
134146

135147
def test_delete_not_found(self):
136148
client = self.make_client([b"NOT_FOUND\r\n"])
@@ -191,19 +203,26 @@ def test_delete_many_found(self):
191203

192204
spans = self.memory_exporter.get_finished_spans()
193205

194-
self.check_spans(
195-
spans, 3, ["add key", "delete key", "delete_many key"]
196-
)
206+
if pymemcache_version_lt_2:
207+
self.check_spans(
208+
spans, 3, ["add key", "delete key", "delete_many key"]
209+
)
210+
else:
211+
self.check_spans(spans, 2, ["add key", "delete_many key"])
197212

198213
def test_set_many_success(self):
199214
client = self.make_client([b"STORED\r\n"])
200215
# a convienance function that calls set for every key
201216
result = client.set_many({b"key": b"value"}, noreply=False)
202-
self.assertTrue(result)
203217

204218
spans = self.memory_exporter.get_finished_spans()
205219

206-
self.check_spans(spans, 2, ["set key", "set_many key"])
220+
if pymemcache_version_lt_2:
221+
self.assertTrue(result)
222+
self.check_spans(spans, 2, ["set key", "set_many key"])
223+
else:
224+
assert len(result) == 0
225+
self.check_spans(spans, 1, ["set_many key"])
207226

208227
def test_set_get(self):
209228
client = self.make_client(
@@ -243,7 +262,7 @@ def test_prepend_stored(self):
243262

244263
def test_cas_stored(self):
245264
client = self.make_client([b"STORED\r\n"])
246-
result = client.cas(b"key", b"value", b"cas", noreply=False)
265+
result = client.cas(b"key", b"value", b"1", noreply=False)
247266
self.assertTrue(result)
248267

249268
spans = self.memory_exporter.get_finished_spans()
@@ -252,7 +271,7 @@ def test_cas_stored(self):
252271

253272
def test_cas_exists(self):
254273
client = self.make_client([b"EXISTS\r\n"])
255-
result = client.cas(b"key", b"value", b"cas", noreply=False)
274+
result = client.cas(b"key", b"value", b"1", noreply=False)
256275
assert result is False
257276

258277
spans = self.memory_exporter.get_finished_spans()
@@ -261,7 +280,7 @@ def test_cas_exists(self):
261280

262281
def test_cas_not_found(self):
263282
client = self.make_client([b"NOT_FOUND\r\n"])
264-
result = client.cas(b"key", b"value", b"cas", noreply=False)
283+
result = client.cas(b"key", b"value", b"1", noreply=False)
265284
assert result is None
266285

267286
spans = self.memory_exporter.get_finished_spans()
@@ -445,7 +464,11 @@ def test_version_success(self):
445464
def test_stats(self):
446465
client = self.make_client([b"STAT fake_stats 1\r\n", b"END\r\n"])
447466
result = client.stats()
448-
assert client.sock.send_bufs == [b"stats \r\n"]
467+
468+
if pymemcache_version_gt_341:
469+
assert client.sock.send_bufs == [b"stats\r\n"]
470+
else:
471+
assert client.sock.send_bufs == [b"stats \r\n"]
449472
assert result == {b"fake_stats": 1}
450473

451474
spans = self.memory_exporter.get_finished_spans()
@@ -544,5 +567,4 @@ def test_delete_many_found(self):
544567
self.assertTrue(result)
545568

546569
spans = self.memory_exporter.get_finished_spans()
547-
548570
self.check_spans(spans, 2, ["add key", "delete key"])

opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
"instrumentation": "opentelemetry-instrumentation-psycopg2==0.29b0",
9494
},
9595
"pymemcache": {
96-
"library": "pymemcache ~= 1.3",
96+
"library": "pymemcache >= 1.3.5, < 4",
9797
"instrumentation": "opentelemetry-instrumentation-pymemcache==0.29b0",
9898
},
9999
"pymongo": {

tox.ini

+8-4
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ envlist =
111111
; ext-psycopg2 intentionally excluded from pypy3
112112

113113
; opentelemetry-instrumentation-pymemcache
114-
py3{6,7,8,9,10}-test-instrumentation-pymemcache
115-
pypy3-test-instrumentation-pymemcache
114+
py3{6,7,8,9,10}-test-instrumentation-pymemcache{135,200,340,350}
115+
pypy3-test-instrumentation-pymemcache{135,200,300,342}
116116

117117
; opentelemetry-instrumentation-pymongo
118118
py3{6,7,8,9,10}-test-instrumentation-pymongo
@@ -222,6 +222,10 @@ deps =
222222
sqlalchemy14: sqlalchemy~=1.4
223223
pika0: pika>=0.12.0,<1.0.0
224224
pika1: pika>=1.0.0
225+
pymemcache135: pymemcache ==1.3.5
226+
pymemcache200: pymemcache >2.0.0,<3.0.0
227+
pymemcache300: pymemcache >3.0.0,<3.4.2
228+
pymemcache342: pymemcache ==3.4.2
225229
httpx18: httpx>=0.18.0,<0.19.0
226230
httpx18: respx~=0.17.0
227231
httpx21: httpx>=0.19.0
@@ -262,7 +266,7 @@ changedir =
262266
test-instrumentation-mysql: instrumentation/opentelemetry-instrumentation-mysql/tests
263267
test-instrumentation-pika{0,1}: instrumentation/opentelemetry-instrumentation-pika/tests
264268
test-instrumentation-psycopg2: instrumentation/opentelemetry-instrumentation-psycopg2/tests
265-
test-instrumentation-pymemcache: instrumentation/opentelemetry-instrumentation-pymemcache/tests
269+
test-instrumentation-pymemcache{135,200,300,342}: instrumentation/opentelemetry-instrumentation-pymemcache/tests
266270
test-instrumentation-pymongo: instrumentation/opentelemetry-instrumentation-pymongo/tests
267271
test-instrumentation-pymysql: instrumentation/opentelemetry-instrumentation-pymysql/tests
268272
test-instrumentation-pyramid: instrumentation/opentelemetry-instrumentation-pyramid/tests
@@ -332,7 +336,7 @@ commands_pre =
332336

333337
mysql: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-dbapi {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql[test]
334338

335-
pymemcache: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache[test]
339+
pymemcache{135,200,300,342}: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache[test]
336340

337341
pymongo: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-pymongo[test]
338342

0 commit comments

Comments
 (0)