Skip to content

Commit 0af75dc

Browse files
committed
set op to cache.remove for redis delete commands
1 parent 93a9dab commit 0af75dc

7 files changed

Lines changed: 51 additions & 6 deletions

File tree

dev-packages/node-integration-tests/suites/tracing/redis-cache/scenario-ioredis.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ async function run() {
2222
await redis.get('ioredis-cache:unavailable-data');
2323

2424
await redis.mget('test-key', 'ioredis-cache:test-key', 'ioredis-cache:unavailable-data');
25+
26+
await redis.del('ioredis-cache:test-key');
2527
} finally {
2628
await redis.disconnect();
2729
}

dev-packages/node-integration-tests/suites/tracing/redis-cache/scenario-redis-4.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ async function run() {
2727

2828
await redisClient.mGet(['redis-test-key', 'redis-cache:test-key', 'redis-cache:unavailable-data']);
2929

30+
await redisClient.del('redis-cache:test-key');
31+
3032
// MULTI/EXEC produces one span per queued command, all ended together on exec
3133
await redisClient.multi().set('redis-multi-key', 'multi-value').get('redis-multi-key').exec();
3234

dev-packages/node-integration-tests/suites/tracing/redis-cache/scenario-redis-5.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ async function run() {
2323

2424
await redisClient.mGet(['redis-5-test-key', 'redis-5-cache:test-key', 'redis-5-cache:unavailable-data']);
2525

26+
await redisClient.del('redis-5-cache:test-key');
27+
2628
// MULTI/EXEC produces one span per queued command, all ended together on exec
2729
await redisClient.multi().set('redis-5-multi-key', 'multi-value').get('redis-5-multi-key').exec();
2830

dev-packages/node-integration-tests/suites/tracing/redis-cache/test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,19 @@ describeWithDockerCompose('redis cache auto instrumentation', { workingDirectory
136136
'network.peer.port': 6383,
137137
}),
138138
}),
139+
// DEL
140+
expect.objectContaining({
141+
description: 'ioredis-cache:test-key',
142+
op: 'cache.remove',
143+
origin: redisOrigin,
144+
data: expect.objectContaining({
145+
'sentry.origin': redisOrigin,
146+
'db.statement': 'del ioredis-cache:test-key',
147+
'cache.key': ['ioredis-cache:test-key'],
148+
'network.peer.address': 'localhost',
149+
'network.peer.port': 6383,
150+
}),
151+
}),
139152
]),
140153
};
141154

@@ -258,6 +271,17 @@ describeWithDockerCompose('redis cache auto instrumentation', { workingDirectory
258271
'cache.key': ['redis-test-key', 'redis-cache:test-key', 'redis-cache:unavailable-data'],
259272
}),
260273
}),
274+
// DEL
275+
expect.objectContaining({
276+
description: 'redis-cache:test-key',
277+
op: 'cache.remove',
278+
origin: redisOrigin,
279+
data: expect.objectContaining({
280+
'sentry.origin': redisOrigin,
281+
'db.statement': 'DEL redis-cache:test-key',
282+
'cache.key': ['redis-cache:test-key'],
283+
}),
284+
}),
261285
...batchSpans,
262286
// a failing command produces a span with an error status
263287
expect.objectContaining({
@@ -400,6 +424,17 @@ describeWithDockerCompose('redis cache auto instrumentation', { workingDirectory
400424
'cache.key': ['redis-5-test-key', 'redis-5-cache:test-key', 'redis-5-cache:unavailable-data'],
401425
}),
402426
}),
427+
// DEL
428+
expect.objectContaining({
429+
description: 'redis-5-cache:test-key',
430+
op: 'cache.remove',
431+
origin: redisOrigin,
432+
data: expect.objectContaining({
433+
'sentry.origin': redisOrigin,
434+
'db.statement': 'DEL redis-5-cache:test-key',
435+
'cache.key': ['redis-5-cache:test-key'],
436+
}),
437+
}),
403438
...batchSpans,
404439
// a failing command produces a span with an error status
405440
expect.objectContaining({

packages/node/src/integrations/tracing/redis/cache.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
getCacheKeySafely,
1515
getCacheOperation,
1616
isInCommands,
17+
REMOVE_COMMANDS,
1718
shouldConsiderForCache,
1819
} from '../../../utils/redisCache';
1920
import type { IORedisResponseCustomAttributeFunction } from './vendored/types';
@@ -79,7 +80,8 @@ export const cacheResponseHook: IORedisResponseCustomAttributeFunction = (
7980
span.setAttributes({ 'network.peer.address': networkPeerAddress, 'network.peer.port': networkPeerPort });
8081
}
8182

82-
const cacheItemSize = calculateCacheItemSize(response);
83+
// A remove response is a delete-count, not a cached value, so its size is meaningless.
84+
const cacheItemSize = isInCommands(REMOVE_COMMANDS, redisCommand) ? undefined : calculateCacheItemSize(response);
8385

8486
if (cacheItemSize) {
8587
span.setAttribute(SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE, cacheItemSize);

packages/node/src/utils/redisCache.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ const SINGLE_ARG_COMMANDS = ['get', 'set', 'setex'];
44

55
export const GET_COMMANDS = ['get', 'mget'];
66
export const SET_COMMANDS = ['set', 'setex'];
7-
// todo: del, expire
7+
export const REMOVE_COMMANDS = ['del', 'unlink'];
8+
// todo: expire (no matching cache convention op yet)
89

910
/** Checks if a given command is in the list of redis commands.
1011
* Useful because commands can come in lowercase or uppercase (depending on the library). */
@@ -13,13 +14,13 @@ export function isInCommands(redisCommands: string[], command: string): boolean
1314
}
1415

1516
/** Determine cache operation based on redis statement */
16-
export function getCacheOperation(
17-
command: string,
18-
): 'cache.get' | 'cache.put' | 'cache.remove' | 'cache.flush' | undefined {
17+
export function getCacheOperation(command: string): 'cache.get' | 'cache.put' | 'cache.remove' | undefined {
1918
if (isInCommands(GET_COMMANDS, command)) {
2019
return 'cache.get';
2120
} else if (isInCommands(SET_COMMANDS, command)) {
2221
return 'cache.put';
22+
} else if (isInCommands(REMOVE_COMMANDS, command)) {
23+
return 'cache.remove';
2324
} else {
2425
return undefined;
2526
}

packages/node/test/integrations/tracing/redis.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
calculateCacheItemSize,
55
GET_COMMANDS,
66
getCacheKeySafely,
7+
REMOVE_COMMANDS,
78
SET_COMMANDS,
89
shouldConsiderForCache,
910
} from '../../../src/utils/redisCache';
@@ -256,7 +257,7 @@ describe('Redis', () => {
256257
expect(result).toBe(false);
257258
});
258259

259-
GET_COMMANDS.concat(SET_COMMANDS).forEach(command => {
260+
GET_COMMANDS.concat(SET_COMMANDS, REMOVE_COMMANDS).forEach(command => {
260261
it(`should return true for ${command} command with matching prefix`, () => {
261262
const key = ['cache:test-key'];
262263
const result = shouldConsiderForCache(command, key, prefixes);

0 commit comments

Comments
 (0)