diff --git a/package-lock.json b/package-lock.json index 3c9b94edb0..05034ab0ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,8 +46,9 @@ "@hapi/hapi": "21.4.3", "@ibm/tekton-lint": "1.1.0", "@koa/router": "14.0.0", - "@redis/client": "5.8.3", + "@redis/client": "5.9.0", "@redis/client-v4": "npm:@redis/client@1.6.0", + "@redis/client-v583": "npm:@redis/client@5.8.3", "@types/chai": "4.3.0", "@types/detect-libc": "1.0.0", "@types/event-loop-lag": "1.0.30", @@ -161,9 +162,10 @@ "proxyquire": "2.1.3", "read-pkg-up": "7.0.1", "recursive-copy": "2.0.14", - "redis": "5.8.3", + "redis": "5.9.0", "redis-v3": "npm:redis@3.1.2", "redis-v4": "npm:redis@4.7.0", + "redis-v583": "npm:redis@5.8.3", "restify": "11.1.0", "rimraf": "3.0.2", "semver": "7.5.4", @@ -17845,22 +17847,22 @@ "dev": true }, "node_modules/@redis/bloom": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.8.3.tgz", - "integrity": "sha512-1eldTzHvdW3Oi0TReb8m1yiFt8ZwyF6rv1NpZyG5R4TpCwuAdKQetBKoCw7D96tNFgsVVd6eL+NaGZZCqhRg4g==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.9.0.tgz", + "integrity": "sha512-W9D8yfKTWl4tP8lkC3MRYkMz4OfbuzE/W8iObe0jFgoRmgMfkBV+Vj38gvIqZPImtY0WB34YZkX3amYuQebvRQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.3" + "@redis/client": "^5.9.0" } }, "node_modules/@redis/client": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.3.tgz", - "integrity": "sha512-MZVUE+l7LmMIYlIjubPosruJ9ltSLGFmJqsXApTqPLyHLjsJUSAbAJb/A3N34fEqean4ddiDkdWzNu4ZKPvRUg==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.9.0.tgz", + "integrity": "sha512-EI0Ti5pojD2p7TmcS7RRa+AJVahdQvP/urpcSbK/K9Rlk6+dwMJTQ354pCNGCwfke8x4yKr5+iH85wcERSkwLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17884,43 +17886,57 @@ "node": ">=14" } }, - "node_modules/@redis/json": { + "node_modules/@redis/client-v583": { + "name": "@redis/client", "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.8.3.tgz", - "integrity": "sha512-DRR09fy/u8gynHGJ4gzXYeM7D8nlS6EMv5o+h20ndTJiAc7RGR01fdk2FNjnn1Nz5PjgGGownF+s72bYG4nZKQ==", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.3.tgz", + "integrity": "sha512-MZVUE+l7LmMIYlIjubPosruJ9ltSLGFmJqsXApTqPLyHLjsJUSAbAJb/A3N34fEqean4ddiDkdWzNu4ZKPvRUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cluster-key-slot": "1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@redis/json": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.9.0.tgz", + "integrity": "sha512-Bm2jjLYaXdUWPb9RaEywxnjmzw7dWKDZI4MS79mTWPV16R982jVWBj6lY2ZGelJbwxHtEVg4/FSVgYDkuO/MxA==", "dev": true, "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.3" + "@redis/client": "^5.9.0" } }, "node_modules/@redis/search": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.8.3.tgz", - "integrity": "sha512-EMIvEeGRR2I0BJEz4PV88DyCuPmMT1rDtznlsHY3cKSDcc9vj0Q411jUnX0iU2vVowUgWn/cpySKjpXdZ8m+5g==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.9.0.tgz", + "integrity": "sha512-jdk2csmJ29DlpvCIb2ySjix2co14/0iwIT3C0I+7ZaToXgPbgBMB+zfEilSuncI2F9JcVxHki0YtLA0xX3VdpA==", "dev": true, "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.3" + "@redis/client": "^5.9.0" } }, "node_modules/@redis/time-series": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.8.3.tgz", - "integrity": "sha512-5Jwy3ilsUYQjzpE7WZ1lEeG1RkqQ5kHtwV1p8yxXHSEmyUbC/T/AVgyjMcm52Olj/Ov/mhDKjx6ndYUi14bXsw==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.9.0.tgz", + "integrity": "sha512-W6ILxcyOqhnI7ELKjJXOktIg3w4+aBHugDbVpgVLPZ+YDjObis1M0v7ZzwlpXhlpwsfePfipeSK+KWNuymk52w==", "dev": true, "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.3" + "@redis/client": "^5.9.0" } }, "node_modules/@sec-ant/readable-stream": { @@ -43152,17 +43168,17 @@ } }, "node_modules/redis": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/redis/-/redis-5.8.3.tgz", - "integrity": "sha512-MfSrfV6+tEfTw8c4W0yFp6XWX8Il4laGU7Bx4kvW4uiYM1AuZ3KGqEGt1LdQHeD1nEyLpIWetZ/SpY3kkbgrYw==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.9.0.tgz", + "integrity": "sha512-E8dQVLSyH6UE/C9darFuwq4usOPrqfZ1864kI4RFbr5Oj9ioB9qPF0oJMwX7s8mf6sPYrz84x/Dx1PGF3/0EaQ==", "dev": true, "license": "MIT", "dependencies": { - "@redis/bloom": "5.8.3", - "@redis/client": "5.8.3", - "@redis/json": "5.8.3", - "@redis/search": "5.8.3", - "@redis/time-series": "5.8.3" + "@redis/bloom": "5.9.0", + "@redis/client": "5.9.0", + "@redis/json": "5.9.0", + "@redis/search": "5.9.0", + "@redis/time-series": "5.9.0" }, "engines": { "node": ">= 18" @@ -43298,6 +43314,89 @@ "@redis/client": "^1.0.0" } }, + "node_modules/redis-v583": { + "name": "redis", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.8.3.tgz", + "integrity": "sha512-MfSrfV6+tEfTw8c4W0yFp6XWX8Il4laGU7Bx4kvW4uiYM1AuZ3KGqEGt1LdQHeD1nEyLpIWetZ/SpY3kkbgrYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redis/bloom": "5.8.3", + "@redis/client": "5.8.3", + "@redis/json": "5.8.3", + "@redis/search": "5.8.3", + "@redis/time-series": "5.8.3" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/redis-v583/node_modules/@redis/bloom": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.8.3.tgz", + "integrity": "sha512-1eldTzHvdW3Oi0TReb8m1yiFt8ZwyF6rv1NpZyG5R4TpCwuAdKQetBKoCw7D96tNFgsVVd6eL+NaGZZCqhRg4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.8.3" + } + }, + "node_modules/redis-v583/node_modules/@redis/client": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.3.tgz", + "integrity": "sha512-MZVUE+l7LmMIYlIjubPosruJ9ltSLGFmJqsXApTqPLyHLjsJUSAbAJb/A3N34fEqean4ddiDkdWzNu4ZKPvRUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cluster-key-slot": "1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/redis-v583/node_modules/@redis/json": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.8.3.tgz", + "integrity": "sha512-DRR09fy/u8gynHGJ4gzXYeM7D8nlS6EMv5o+h20ndTJiAc7RGR01fdk2FNjnn1Nz5PjgGGownF+s72bYG4nZKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.8.3" + } + }, + "node_modules/redis-v583/node_modules/@redis/search": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.8.3.tgz", + "integrity": "sha512-EMIvEeGRR2I0BJEz4PV88DyCuPmMT1rDtznlsHY3cKSDcc9vj0Q411jUnX0iU2vVowUgWn/cpySKjpXdZ8m+5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.8.3" + } + }, + "node_modules/redis-v583/node_modules/@redis/time-series": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.8.3.tgz", + "integrity": "sha512-5Jwy3ilsUYQjzpE7WZ1lEeG1RkqQ5kHtwV1p8yxXHSEmyUbC/T/AVgyjMcm52Olj/Ov/mhDKjx6ndYUi14bXsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.8.3" + } + }, "node_modules/reflect-metadata": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", diff --git a/package.json b/package.json index e512484d03..d330012f04 100644 --- a/package.json +++ b/package.json @@ -113,8 +113,9 @@ "@hapi/hapi": "21.4.3", "@ibm/tekton-lint": "1.1.0", "@koa/router": "14.0.0", - "@redis/client": "5.8.3", + "@redis/client": "5.9.0", "@redis/client-v4": "npm:@redis/client@1.6.0", + "@redis/client-v583": "npm:@redis/client@5.8.3", "@types/chai": "4.3.0", "@types/detect-libc": "1.0.0", "@types/event-loop-lag": "1.0.30", @@ -228,9 +229,10 @@ "proxyquire": "2.1.3", "read-pkg-up": "7.0.1", "recursive-copy": "2.0.14", - "redis": "5.8.3", + "redis": "5.9.0", "redis-v3": "npm:redis@3.1.2", "redis-v4": "npm:redis@4.7.0", + "redis-v583": "npm:redis@5.8.3", "restify": "11.1.0", "rimraf": "3.0.2", "semver": "7.5.4", diff --git a/packages/collector/test/tracing/databases/redis/app.js b/packages/collector/test/tracing/databases/redis/app.js index d7e7e68389..cd2c419f7c 100644 --- a/packages/collector/test/tracing/databases/redis/app.js +++ b/packages/collector/test/tracing/databases/redis/app.js @@ -146,8 +146,8 @@ app.get('/blocking', async (req, res) => { }); app.get('/scan-iterator', async (req, res) => { - if (redisVersion === 'latest') { - // v5: SCAN iterators return collection of keys, enabling multi-key commands like mGet + // v5: SCAN iterators return collection of keys, enabling multi-key commands like mGet + if (redisVersion === 'latest' || redisVersion === 'v583') { // eslint-disable-next-line no-restricted-syntax for await (const keys of connection.scanIterator()) { try { diff --git a/packages/collector/test/tracing/databases/redis/test.js b/packages/collector/test/tracing/databases/redis/test.js index 65f2b4fec8..91dd68ab9c 100644 --- a/packages/collector/test/tracing/databases/redis/test.js +++ b/packages/collector/test/tracing/databases/redis/test.js @@ -28,6 +28,7 @@ const globalAgent = require('../../../globalAgent'); // Clustering support was officially introduced in v4 // Redis Sentinel support was added in v5. const legacyVersion = 'v3'; +const versionsSinceV5 = ['latest', 'v583']; /** * Supported Redis setups for local testing: @@ -52,7 +53,7 @@ const allSetupTypes = ['default', 'cluster', 'sentinel']; const selectedSetupType = false; const setupTypesToRun = allSetupTypes.includes(selectedSetupType) ? [selectedSetupType] : allSetupTypes; -const allVersions = ['latest', 'v4', 'v3']; +const allVersions = ['latest', 'v583', 'v4', 'v3']; const selectedVersion = false; const versionsToRun = allVersions.includes(selectedVersion) ? [selectedVersion] : allVersions; @@ -68,7 +69,7 @@ setupTypesToRun.forEach(setupType => { const shouldSkipCluster = setupType === 'cluster' && redisVersion === legacyVersion; // NOTE: sentinel support added in v5(latest). - const shouldSkipSentinel = setupType === 'sentinel' && redisVersion !== 'latest'; + const shouldSkipSentinel = setupType === 'sentinel' && !versionsSinceV5.includes(redisVersion); if (shouldSkipCluster || shouldSkipSentinel) { mochaSuiteFn = describe.skip; @@ -127,7 +128,7 @@ setupTypesToRun.forEach(setupType => { // In v5, Redis moved “Isolation Pool” into RedisClientPool. // see: https://github.com/redis/node-redis/blob/master/docs/pool.md // Only for this test the connection is established via the pool. - if (redisVersion === 'latest' && setupType === 'default') { + if (versionsSinceV5.includes(redisVersion) && setupType === 'default') { mochaSuiteFn('When connected via clientpool', function () { globalAgent.setUpCleanUpHooks(); let controls; @@ -801,8 +802,8 @@ setupTypesToRun.forEach(setupType => { ]); // NOTE: v5 SCAN iterators yield collection of keys, enabling multi-key commands like MGET. // See: https://github.com/redis/node-redis/blob/master/docs/v4-to-v5.md#scan-iterators - const expectedSpanCount = redisVersion === 'latest' ? 1 : 4; - const expectedRedisCommand = redisVersion === 'latest' ? 'mGet' : 'get'; + const expectedSpanCount = versionsSinceV5.includes(redisVersion) ? 1 : 4; + const expectedRedisCommand = versionsSinceV5.includes(redisVersion) ? 'mGet' : 'get'; expectExactlyNMatching(spans, expectedSpanCount, [ span => expect(span.t).to.equal(entrySpan.t), @@ -828,7 +829,7 @@ setupTypesToRun.forEach(setupType => { // The "Isolation Pool" was introduced via RedisClientPool in v5. // This new pool type requires a different connection mechanism. // As a result, this test is being skipped. - if (redisVersion !== 'latest') { + if (!versionsSinceV5.includes(redisVersion)) { it('blocking', () => testBlockingCommand(controls, setupType)); } } diff --git a/packages/core/src/tracing/instrumentation/databases/redis.js b/packages/core/src/tracing/instrumentation/databases/redis.js index 390b859985..c78294e3a9 100644 --- a/packages/core/src/tracing/instrumentation/databases/redis.js +++ b/packages/core/src/tracing/instrumentation/databases/redis.js @@ -131,19 +131,17 @@ function instrument(redis) { }; }; - const creatPoolWrap = originalCreatePool => { + const createPoolWrap = originalCreatePool => { return function instrumentedCreateRedisPool(poolOptions) { const redisPoolInstance = originalCreatePool.apply(this, arguments); const redisUrl = poolOptions?.url; - const redisPoolPrototype = Object.getPrototypeOf(redisPoolInstance); - shimAllCommands(redisPoolPrototype, redisUrl, false, redisCommandList); + shimAllCommands(redisPoolInstance, redisUrl, false, redisCommandList); - if (typeof redisPoolPrototype.multi === 'function') { - shimmer.wrap(redisPoolPrototype, 'multi', wrapMulti(redisUrl, false)); + if (typeof redisPoolInstance.multi === 'function') { + shimmer.wrap(redisPoolInstance, 'multi', wrapMulti(redisUrl, false)); } - - return redisPoolPrototype; + return redisPoolInstance; }; }; @@ -191,11 +189,11 @@ function instrument(redis) { configurable: true, enumerable: true, get() { - return creatPoolWrap(poolDescriptor.get.call(this)); + return createPoolWrap(poolDescriptor.get.call(this)); } }); } else { - shimmer.wrap(redis, 'createClientPool', creatPoolWrap); + shimmer.wrap(redis, 'createClientPool', createPoolWrap); } } };