@sentry/node 10.51.0 → 10.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/index.js +4 -4
- package/build/cjs/integrations/http.js +18 -145
- package/build/cjs/integrations/http.js.map +1 -1
- package/build/cjs/integrations/tracing/index.js +21 -22
- package/build/cjs/integrations/tracing/index.js.map +1 -1
- package/build/cjs/integrations/tracing/{redis.js → redis/index.js} +18 -10
- package/build/cjs/integrations/tracing/redis/index.js.map +1 -0
- package/build/cjs/integrations/tracing/redis/redis-dc-subscriber.js +186 -0
- package/build/cjs/integrations/tracing/redis/redis-dc-subscriber.js.map +1 -0
- package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js +255 -0
- package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -0
- package/build/cjs/integrations/tracing/redis/vendored/redis-common.js +74 -0
- package/build/cjs/integrations/tracing/redis/vendored/redis-common.js.map +1 -0
- package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js +685 -0
- package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -0
- package/build/cjs/integrations/tracing/redis/vendored/semconv.js +47 -0
- package/build/cjs/integrations/tracing/redis/vendored/semconv.js.map +1 -0
- package/build/cjs/utils/redisCache.js.map +1 -1
- package/build/esm/index.js +1 -1
- package/build/esm/integrations/http.js +21 -146
- package/build/esm/integrations/http.js.map +1 -1
- package/build/esm/integrations/tracing/index.js +2 -3
- package/build/esm/integrations/tracing/index.js.map +1 -1
- package/build/esm/integrations/tracing/{redis.js → redis/index.js} +17 -9
- package/build/esm/integrations/tracing/redis/index.js.map +1 -0
- package/build/esm/integrations/tracing/redis/redis-dc-subscriber.js +184 -0
- package/build/esm/integrations/tracing/redis/redis-dc-subscriber.js.map +1 -0
- package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js +253 -0
- package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -0
- package/build/esm/integrations/tracing/redis/vendored/redis-common.js +72 -0
- package/build/esm/integrations/tracing/redis/vendored/redis-common.js.map +1 -0
- package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js +683 -0
- package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -0
- package/build/esm/integrations/tracing/redis/vendored/semconv.js +39 -0
- package/build/esm/integrations/tracing/redis/vendored/semconv.js.map +1 -0
- package/build/esm/package.json +1 -1
- package/build/esm/utils/redisCache.js.map +1 -1
- package/build/types/integrations/http.d.ts +8 -15
- package/build/types/integrations/http.d.ts.map +1 -1
- package/build/types/integrations/tracing/index.d.ts.map +1 -1
- package/build/types/integrations/tracing/{redis.d.ts → redis/index.d.ts} +3 -3
- package/build/types/integrations/tracing/redis/index.d.ts.map +1 -0
- package/build/types/integrations/tracing/redis/redis-dc-subscriber.d.ts +17 -0
- package/build/types/integrations/tracing/redis/redis-dc-subscriber.d.ts.map +1 -0
- package/build/types/integrations/tracing/redis/vendored/ioredis-instrumentation.d.ts +15 -0
- package/build/types/integrations/tracing/redis/vendored/ioredis-instrumentation.d.ts.map +1 -0
- package/build/types/integrations/tracing/redis/vendored/redis-common.d.ts +6 -0
- package/build/types/integrations/tracing/redis/vendored/redis-common.d.ts.map +1 -0
- package/build/types/integrations/tracing/redis/vendored/redis-instrumentation.d.ts +16 -0
- package/build/types/integrations/tracing/redis/vendored/redis-instrumentation.d.ts.map +1 -0
- package/build/types/integrations/tracing/redis/vendored/semconv.d.ts +8 -0
- package/build/types/integrations/tracing/redis/vendored/semconv.d.ts.map +1 -0
- package/build/types/integrations/tracing/redis/vendored/types.d.ts +58 -0
- package/build/types/integrations/tracing/redis/vendored/types.d.ts.map +1 -0
- package/build/types/utils/redisCache.d.ts +1 -1
- package/build/types/utils/redisCache.d.ts.map +1 -1
- package/build/types-ts3.8/integrations/http.d.ts +8 -15
- package/build/types-ts3.8/integrations/tracing/{redis.d.ts → redis/index.d.ts} +3 -3
- package/build/types-ts3.8/integrations/tracing/redis/redis-dc-subscriber.d.ts +17 -0
- package/build/types-ts3.8/integrations/tracing/redis/vendored/ioredis-instrumentation.d.ts +15 -0
- package/build/types-ts3.8/integrations/tracing/redis/vendored/redis-common.d.ts +6 -0
- package/build/types-ts3.8/integrations/tracing/redis/vendored/redis-instrumentation.d.ts +16 -0
- package/build/types-ts3.8/integrations/tracing/redis/vendored/semconv.d.ts +8 -0
- package/build/types-ts3.8/integrations/tracing/redis/vendored/types.d.ts +58 -0
- package/build/types-ts3.8/utils/redisCache.d.ts +1 -1
- package/package.json +4 -6
- package/build/cjs/integrations/tracing/redis.js.map +0 -1
- package/build/esm/integrations/tracing/redis.js.map +0 -1
- package/build/types/integrations/tracing/redis.d.ts.map +0 -1
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const core = require('@sentry/core');
|
|
4
|
+
const tracingChannel = require('@sentry/opentelemetry/tracing-channel');
|
|
5
|
+
const redisCommon = require('./vendored/redis-common.js');
|
|
6
|
+
const semconv = require('./vendored/semconv.js');
|
|
7
|
+
|
|
8
|
+
// Channel names as published by node-redis >= 5.12.0.
|
|
9
|
+
// Hardcoded so we don't import `redis` at module-load time.
|
|
10
|
+
const CHANNEL_COMMAND = 'node-redis:command';
|
|
11
|
+
const CHANNEL_BATCH = 'node-redis:batch';
|
|
12
|
+
const CHANNEL_CONNECT = 'node-redis:connect';
|
|
13
|
+
|
|
14
|
+
const ORIGIN = 'auto.db.redis.diagnostic_channel';
|
|
15
|
+
|
|
16
|
+
const NOOP = () => {};
|
|
17
|
+
|
|
18
|
+
let subscribed = false;
|
|
19
|
+
let currentResponseHook;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Subscribe Sentry handlers to node-redis diagnostics_channel events (>= 5.12.0).
|
|
23
|
+
*
|
|
24
|
+
* Uses `@sentry/opentelemetry/tracing-channel` so OTel AsyncLocalStorage context propagates
|
|
25
|
+
* automatically via `bindStore` — without it, spans created in `start` would not become
|
|
26
|
+
* the active context for subsequent operations.
|
|
27
|
+
*
|
|
28
|
+
* Safe on every runtime that exposes `node:diagnostics_channel` (Node, Bun, Deno, Workers).
|
|
29
|
+
* In node-redis < 5.12.0 the channels are never published to, so subscribers are inert and
|
|
30
|
+
* there is no double-instrumentation against the IITM-based patcher (gated to < 5.12.0).
|
|
31
|
+
*/
|
|
32
|
+
function subscribeRedisDiagnosticChannels(responseHook) {
|
|
33
|
+
currentResponseHook = responseHook;
|
|
34
|
+
if (subscribed) return;
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
setupCommandChannel();
|
|
38
|
+
setupBatchChannel();
|
|
39
|
+
setupConnectChannel();
|
|
40
|
+
subscribed = true;
|
|
41
|
+
} catch {
|
|
42
|
+
// tracingChannel from @sentry/opentelemetry requires `node:diagnostics_channel`.
|
|
43
|
+
// On runtimes where it isn't available, fail closed.
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function setupCommandChannel() {
|
|
48
|
+
const channel = tracingChannel.tracingChannel(CHANNEL_COMMAND, data => {
|
|
49
|
+
// node-redis >= 5.12.0 includes the command name as args[0] in the DC payload.
|
|
50
|
+
// Strip it so serialization and cache key extraction see only the actual arguments.
|
|
51
|
+
const actualArgs = data.args.slice(1);
|
|
52
|
+
const statement = safeSerialize(data.command, actualArgs);
|
|
53
|
+
return core.startSpanManual(
|
|
54
|
+
{
|
|
55
|
+
name: `redis-${data.command}`,
|
|
56
|
+
attributes: {
|
|
57
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,
|
|
58
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db.redis',
|
|
59
|
+
[semconv.ATTR_DB_SYSTEM]: semconv.DB_SYSTEM_VALUE_REDIS,
|
|
60
|
+
...(statement != null ? { [semconv.ATTR_DB_STATEMENT]: statement } : {}),
|
|
61
|
+
...(data.serverAddress != null ? { [semconv.ATTR_NET_PEER_NAME]: data.serverAddress } : {}),
|
|
62
|
+
...(data.serverPort != null ? { [semconv.ATTR_NET_PEER_PORT]: data.serverPort } : {}),
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
span => span,
|
|
66
|
+
) ;
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
channel.subscribe({
|
|
70
|
+
start: NOOP,
|
|
71
|
+
asyncStart: NOOP,
|
|
72
|
+
end: NOOP,
|
|
73
|
+
asyncEnd: data => {
|
|
74
|
+
const span = data._sentrySpan;
|
|
75
|
+
// only end if error handler isn't going to
|
|
76
|
+
if (!span || data.error) return;
|
|
77
|
+
// Same slice: strip command name from args before passing to the response hook.
|
|
78
|
+
runResponseHook(span, data.command, data.args.slice(1), data.result);
|
|
79
|
+
span.end();
|
|
80
|
+
},
|
|
81
|
+
error: data => {
|
|
82
|
+
const span = data._sentrySpan;
|
|
83
|
+
if (!span) return;
|
|
84
|
+
if (data.error) {
|
|
85
|
+
span.setStatus({ code: core.SPAN_STATUS_ERROR, message: data.error.message });
|
|
86
|
+
}
|
|
87
|
+
span.end();
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function setupBatchChannel() {
|
|
93
|
+
const channel = tracingChannel.tracingChannel(CHANNEL_BATCH, data => {
|
|
94
|
+
const operationName = data.batchMode === 'PIPELINE' ? 'PIPELINE' : 'MULTI';
|
|
95
|
+
|
|
96
|
+
return core.startSpanManual(
|
|
97
|
+
{
|
|
98
|
+
name: operationName,
|
|
99
|
+
attributes: {
|
|
100
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,
|
|
101
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db.redis',
|
|
102
|
+
[semconv.ATTR_DB_SYSTEM]: semconv.DB_SYSTEM_VALUE_REDIS,
|
|
103
|
+
...(data.batchSize != null ? { 'db.redis.batch_size': data.batchSize } : {}),
|
|
104
|
+
...(data.serverAddress != null ? { [semconv.ATTR_NET_PEER_NAME]: data.serverAddress } : {}),
|
|
105
|
+
...(data.serverPort != null ? { [semconv.ATTR_NET_PEER_PORT]: data.serverPort } : {}),
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
span => span,
|
|
109
|
+
) ;
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
channel.subscribe({
|
|
113
|
+
start: NOOP,
|
|
114
|
+
asyncStart: NOOP,
|
|
115
|
+
end: NOOP,
|
|
116
|
+
asyncEnd: data => {
|
|
117
|
+
// only end if the error handler isn't going to
|
|
118
|
+
if (!data.error) data._sentrySpan?.end();
|
|
119
|
+
},
|
|
120
|
+
error: data => {
|
|
121
|
+
const span = data._sentrySpan;
|
|
122
|
+
if (!span) return;
|
|
123
|
+
if (data.error) {
|
|
124
|
+
span.setStatus({ code: core.SPAN_STATUS_ERROR, message: data.error.message });
|
|
125
|
+
}
|
|
126
|
+
span.end();
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function setupConnectChannel() {
|
|
132
|
+
const channel = tracingChannel.tracingChannel(CHANNEL_CONNECT, data => {
|
|
133
|
+
return core.startSpanManual(
|
|
134
|
+
{
|
|
135
|
+
name: 'redis-connect',
|
|
136
|
+
attributes: {
|
|
137
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,
|
|
138
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db.redis.connect',
|
|
139
|
+
[semconv.ATTR_DB_SYSTEM]: semconv.DB_SYSTEM_VALUE_REDIS,
|
|
140
|
+
...(data.serverAddress != null ? { [semconv.ATTR_NET_PEER_NAME]: data.serverAddress } : {}),
|
|
141
|
+
...(data.serverPort != null ? { [semconv.ATTR_NET_PEER_PORT]: data.serverPort } : {}),
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
span => span,
|
|
145
|
+
) ;
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
channel.subscribe({
|
|
149
|
+
start: NOOP,
|
|
150
|
+
asyncStart: NOOP,
|
|
151
|
+
end: NOOP,
|
|
152
|
+
asyncEnd: data => {
|
|
153
|
+
// only end if the error handler isn't going to
|
|
154
|
+
if (!data.error) data._sentrySpan?.end();
|
|
155
|
+
},
|
|
156
|
+
error: data => {
|
|
157
|
+
const span = data._sentrySpan;
|
|
158
|
+
if (!span) return;
|
|
159
|
+
if (data.error) {
|
|
160
|
+
span.setStatus({ code: core.SPAN_STATUS_ERROR, message: data.error.message });
|
|
161
|
+
}
|
|
162
|
+
span.end();
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function runResponseHook(span, command, args, result) {
|
|
168
|
+
const hook = currentResponseHook;
|
|
169
|
+
if (!hook) return;
|
|
170
|
+
try {
|
|
171
|
+
hook(span, command, args , result);
|
|
172
|
+
} catch {
|
|
173
|
+
// never let user hooks break instrumentation
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function safeSerialize(command, args) {
|
|
178
|
+
try {
|
|
179
|
+
return redisCommon.defaultDbStatementSerializer(command, args);
|
|
180
|
+
} catch {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
exports.subscribeRedisDiagnosticChannels = subscribeRedisDiagnosticChannels;
|
|
186
|
+
//# sourceMappingURL=redis-dc-subscriber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-dc-subscriber.js","sources":["../../../../../src/integrations/tracing/redis/redis-dc-subscriber.ts"],"sourcesContent":["import type { Span } from '@opentelemetry/api';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_STATUS_ERROR,\n startSpanManual,\n} from '@sentry/core';\nimport { tracingChannel, type TracingChannelContextWithSpan } from '@sentry/opentelemetry/tracing-channel';\nimport { defaultDbStatementSerializer } from './vendored/redis-common';\nimport {\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n DB_SYSTEM_VALUE_REDIS,\n} from './vendored/semconv';\nimport type { IORedisInstrumentationConfig } from './vendored/types';\n\n// Channel names as published by node-redis >= 5.12.0.\n// Hardcoded so we don't import `redis` at module-load time.\nconst CHANNEL_COMMAND = 'node-redis:command';\nconst CHANNEL_BATCH = 'node-redis:batch';\nconst CHANNEL_CONNECT = 'node-redis:connect';\n\nconst ORIGIN = 'auto.db.redis.diagnostic_channel';\n\ninterface CommandData {\n command: string;\n args: Array<string | Buffer>;\n database?: number;\n serverAddress?: string;\n serverPort?: number;\n result?: unknown;\n error?: Error;\n}\n\ninterface BatchData {\n batchMode?: 'MULTI' | 'PIPELINE';\n batchSize?: number;\n database?: number;\n clientId?: string | number;\n serverAddress?: string;\n serverPort?: number;\n result?: unknown[];\n error?: Error;\n}\n\ninterface ConnectData {\n serverAddress?: string;\n serverPort?: number;\n url?: string;\n error?: Error;\n}\n\nconst NOOP = (): void => {};\n\nlet subscribed = false;\nlet currentResponseHook: IORedisInstrumentationConfig['responseHook'] | undefined;\n\n/**\n * Subscribe Sentry handlers to node-redis diagnostics_channel events (>= 5.12.0).\n *\n * Uses `@sentry/opentelemetry/tracing-channel` so OTel AsyncLocalStorage context propagates\n * automatically via `bindStore` — without it, spans created in `start` would not become\n * the active context for subsequent operations.\n *\n * Safe on every runtime that exposes `node:diagnostics_channel` (Node, Bun, Deno, Workers).\n * In node-redis < 5.12.0 the channels are never published to, so subscribers are inert and\n * there is no double-instrumentation against the IITM-based patcher (gated to < 5.12.0).\n */\nexport function subscribeRedisDiagnosticChannels(responseHook?: IORedisInstrumentationConfig['responseHook']): void {\n currentResponseHook = responseHook;\n if (subscribed) return;\n\n try {\n setupCommandChannel();\n setupBatchChannel();\n setupConnectChannel();\n subscribed = true;\n } catch {\n // tracingChannel from @sentry/opentelemetry requires `node:diagnostics_channel`.\n // On runtimes where it isn't available, fail closed.\n }\n}\n\nfunction setupCommandChannel(): void {\n const channel = tracingChannel<CommandData>(CHANNEL_COMMAND, data => {\n // node-redis >= 5.12.0 includes the command name as args[0] in the DC payload.\n // Strip it so serialization and cache key extraction see only the actual arguments.\n const actualArgs = data.args.slice(1);\n const statement = safeSerialize(data.command, actualArgs);\n return startSpanManual(\n {\n name: `redis-${data.command}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db.redis',\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_REDIS,\n ...(statement != null ? { [ATTR_DB_STATEMENT]: statement } : {}),\n ...(data.serverAddress != null ? { [ATTR_NET_PEER_NAME]: data.serverAddress } : {}),\n ...(data.serverPort != null ? { [ATTR_NET_PEER_PORT]: data.serverPort } : {}),\n },\n },\n span => span,\n ) as Span;\n });\n\n channel.subscribe({\n start: NOOP,\n asyncStart: NOOP,\n end: NOOP,\n asyncEnd: data => {\n const span = data._sentrySpan;\n // only end if error handler isn't going to\n if (!span || data.error) return;\n // Same slice: strip command name from args before passing to the response hook.\n runResponseHook(span, data.command, data.args.slice(1), data.result);\n span.end();\n },\n error: data => {\n const span = data._sentrySpan;\n if (!span) return;\n if (data.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: data.error.message });\n }\n span.end();\n },\n });\n}\n\nfunction setupBatchChannel(): void {\n const channel = tracingChannel<BatchData>(CHANNEL_BATCH, data => {\n const operationName = data.batchMode === 'PIPELINE' ? 'PIPELINE' : 'MULTI';\n\n return startSpanManual(\n {\n name: operationName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db.redis',\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_REDIS,\n ...(data.batchSize != null ? { 'db.redis.batch_size': data.batchSize } : {}),\n ...(data.serverAddress != null ? { [ATTR_NET_PEER_NAME]: data.serverAddress } : {}),\n ...(data.serverPort != null ? { [ATTR_NET_PEER_PORT]: data.serverPort } : {}),\n },\n },\n span => span,\n ) as Span;\n });\n\n channel.subscribe({\n start: NOOP,\n asyncStart: NOOP,\n end: NOOP,\n asyncEnd: data => {\n // only end if the error handler isn't going to\n if (!data.error) data._sentrySpan?.end();\n },\n error: data => {\n const span = data._sentrySpan;\n if (!span) return;\n if (data.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: data.error.message });\n }\n span.end();\n },\n });\n}\n\nfunction setupConnectChannel(): void {\n const channel = tracingChannel<ConnectData>(CHANNEL_CONNECT, data => {\n return startSpanManual(\n {\n name: 'redis-connect',\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db.redis.connect',\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_REDIS,\n ...(data.serverAddress != null ? { [ATTR_NET_PEER_NAME]: data.serverAddress } : {}),\n ...(data.serverPort != null ? { [ATTR_NET_PEER_PORT]: data.serverPort } : {}),\n },\n },\n span => span,\n ) as Span;\n });\n\n channel.subscribe({\n start: NOOP,\n asyncStart: NOOP,\n end: NOOP,\n asyncEnd: data => {\n // only end if the error handler isn't going to\n if (!data.error) data._sentrySpan?.end();\n },\n error: data => {\n const span = data._sentrySpan;\n if (!span) return;\n if (data.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: data.error.message });\n }\n span.end();\n },\n });\n}\n\nfunction runResponseHook(span: Span, command: string, args: Array<string | Buffer>, result: unknown): void {\n const hook = currentResponseHook;\n if (!hook) return;\n try {\n hook(span, command, args as unknown as Parameters<typeof hook>[2], result);\n } catch {\n // never let user hooks break instrumentation\n }\n}\n\nfunction safeSerialize(command: string, args: Array<string | Buffer>): string | undefined {\n try {\n return defaultDbStatementSerializer(command, args);\n } catch {\n return undefined;\n }\n}\n\n// Test-only helper.\nexport function _resetRedisDiagnosticChannelsForTesting(): void {\n subscribed = false;\n currentResponseHook = undefined;\n}\n\n// Suppress unused-import lint when only used in types.\nexport type { TracingChannelContextWithSpan };\n"],"names":["tracingChannel","startSpanManual","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_OP","ATTR_DB_SYSTEM","DB_SYSTEM_VALUE_REDIS","ATTR_DB_STATEMENT","ATTR_NET_PEER_NAME","ATTR_NET_PEER_PORT","SPAN_STATUS_ERROR","defaultDbStatementSerializer"],"mappings":"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"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const api = require('@opentelemetry/api');
|
|
4
|
+
const core = require('@sentry/core');
|
|
5
|
+
const instrumentation = require('@opentelemetry/instrumentation');
|
|
6
|
+
const semanticConventions = require('@opentelemetry/semantic-conventions');
|
|
7
|
+
const redisCommon = require('./redis-common.js');
|
|
8
|
+
const semconv = require('./semconv.js');
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* Copyright The OpenTelemetry Authors
|
|
12
|
+
*
|
|
13
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
14
|
+
* you may not use this file except in compliance with the License.
|
|
15
|
+
* You may obtain a copy of the License at
|
|
16
|
+
*
|
|
17
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
18
|
+
*
|
|
19
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
20
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
21
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
22
|
+
* See the License for the specific language governing permissions and
|
|
23
|
+
* limitations under the License.
|
|
24
|
+
*
|
|
25
|
+
* NOTICE from the Sentry authors:
|
|
26
|
+
* - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/instrumentation-ioredis-v0.62.0/packages/instrumentation-ioredis
|
|
27
|
+
* - Upstream version: @opentelemetry/instrumentation-ioredis@0.62.0
|
|
28
|
+
* - Minor TypeScript adjustments for this repository's compiler settings
|
|
29
|
+
*/
|
|
30
|
+
/* eslint-disable -- vendored @opentelemetry/instrumentation-ioredis */
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
const PACKAGE_NAME = '@opentelemetry/instrumentation-ioredis';
|
|
34
|
+
const PACKAGE_VERSION = '0.62.0';
|
|
35
|
+
|
|
36
|
+
// ---- utils ----
|
|
37
|
+
|
|
38
|
+
function endSpan(span, err) {
|
|
39
|
+
if (err) {
|
|
40
|
+
span.recordException(err);
|
|
41
|
+
span.setStatus({
|
|
42
|
+
code: api.SpanStatusCode.ERROR,
|
|
43
|
+
message: err.message,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
span.end();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ---- IORedisInstrumentation ----
|
|
50
|
+
|
|
51
|
+
const DEFAULT_CONFIG = {
|
|
52
|
+
requireParentSpan: true,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
class IORedisInstrumentation extends instrumentation.InstrumentationBase {
|
|
56
|
+
|
|
57
|
+
constructor(config = {}) {
|
|
58
|
+
super(PACKAGE_NAME, PACKAGE_VERSION, { ...DEFAULT_CONFIG, ...config });
|
|
59
|
+
this._setSemconvStabilityFromEnv();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
_setSemconvStabilityFromEnv() {
|
|
63
|
+
this._netSemconvStability = instrumentation.semconvStabilityFromStr('http', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);
|
|
64
|
+
this._dbSemconvStability = instrumentation.semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
setConfig(config = {}) {
|
|
68
|
+
super.setConfig({ ...DEFAULT_CONFIG, ...config });
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
init() {
|
|
72
|
+
return [
|
|
73
|
+
new instrumentation.InstrumentationNodeModuleDefinition(
|
|
74
|
+
'ioredis',
|
|
75
|
+
['>=2.0.0 <6'],
|
|
76
|
+
(module, moduleVersion) => {
|
|
77
|
+
const moduleExports =
|
|
78
|
+
module[Symbol.toStringTag] === 'Module'
|
|
79
|
+
? module.default // ESM
|
|
80
|
+
: module; // CommonJS
|
|
81
|
+
if (instrumentation.isWrapped(moduleExports.prototype.sendCommand)) {
|
|
82
|
+
this._unwrap(moduleExports.prototype, 'sendCommand');
|
|
83
|
+
}
|
|
84
|
+
this._wrap(moduleExports.prototype, 'sendCommand', this._patchSendCommand(moduleVersion));
|
|
85
|
+
if (instrumentation.isWrapped(moduleExports.prototype.connect)) {
|
|
86
|
+
this._unwrap(moduleExports.prototype, 'connect');
|
|
87
|
+
}
|
|
88
|
+
this._wrap(moduleExports.prototype, 'connect', this._patchConnection());
|
|
89
|
+
return module;
|
|
90
|
+
},
|
|
91
|
+
(module) => {
|
|
92
|
+
if (module === undefined) return;
|
|
93
|
+
const moduleExports =
|
|
94
|
+
module[Symbol.toStringTag] === 'Module'
|
|
95
|
+
? module.default // ESM
|
|
96
|
+
: module; // CommonJS
|
|
97
|
+
this._unwrap(moduleExports.prototype, 'sendCommand');
|
|
98
|
+
this._unwrap(moduleExports.prototype, 'connect');
|
|
99
|
+
},
|
|
100
|
+
),
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
_patchSendCommand(moduleVersion) {
|
|
105
|
+
return (original) => {
|
|
106
|
+
return this._traceSendCommand(original, moduleVersion);
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
_patchConnection() {
|
|
111
|
+
return (original) => {
|
|
112
|
+
return this._traceConnection(original);
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
_traceSendCommand(original, moduleVersion) {
|
|
117
|
+
const instrumentation$1 = this;
|
|
118
|
+
return function ( cmd) {
|
|
119
|
+
if (arguments.length < 1 || typeof cmd !== 'object') {
|
|
120
|
+
return original.apply(this, arguments);
|
|
121
|
+
}
|
|
122
|
+
const config = instrumentation$1.getConfig();
|
|
123
|
+
const dbStatementSerializer = config.dbStatementSerializer || redisCommon.defaultDbStatementSerializer;
|
|
124
|
+
const hasNoParentSpan = api.trace.getSpan(api.context.active()) === undefined;
|
|
125
|
+
if (config.requireParentSpan === true && hasNoParentSpan) {
|
|
126
|
+
return original.apply(this, arguments);
|
|
127
|
+
}
|
|
128
|
+
const attributes = {};
|
|
129
|
+
const { host, port } = this.options;
|
|
130
|
+
const dbQueryText = dbStatementSerializer(cmd.name, cmd.args);
|
|
131
|
+
if (instrumentation$1._dbSemconvStability & instrumentation.SemconvStability.OLD) {
|
|
132
|
+
attributes[semconv.ATTR_DB_SYSTEM] = semconv.DB_SYSTEM_VALUE_REDIS;
|
|
133
|
+
attributes[semconv.ATTR_DB_STATEMENT] = dbQueryText;
|
|
134
|
+
attributes[semconv.ATTR_DB_CONNECTION_STRING] = `redis://${host}:${port}`;
|
|
135
|
+
}
|
|
136
|
+
if (instrumentation$1._dbSemconvStability & instrumentation.SemconvStability.STABLE) {
|
|
137
|
+
attributes[semanticConventions.ATTR_DB_SYSTEM_NAME] = semconv.DB_SYSTEM_NAME_VALUE_REDIS;
|
|
138
|
+
attributes[semanticConventions.ATTR_DB_QUERY_TEXT] = dbQueryText;
|
|
139
|
+
}
|
|
140
|
+
if (instrumentation$1._netSemconvStability & instrumentation.SemconvStability.OLD) {
|
|
141
|
+
attributes[semconv.ATTR_NET_PEER_NAME] = host;
|
|
142
|
+
attributes[semconv.ATTR_NET_PEER_PORT] = port;
|
|
143
|
+
}
|
|
144
|
+
if (instrumentation$1._netSemconvStability & instrumentation.SemconvStability.STABLE) {
|
|
145
|
+
attributes[semanticConventions.ATTR_SERVER_ADDRESS] = host;
|
|
146
|
+
attributes[semanticConventions.ATTR_SERVER_PORT] = port;
|
|
147
|
+
}
|
|
148
|
+
attributes[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
|
|
149
|
+
const span = instrumentation$1.tracer.startSpan(cmd.name, {
|
|
150
|
+
kind: api.SpanKind.CLIENT,
|
|
151
|
+
attributes,
|
|
152
|
+
});
|
|
153
|
+
const { requestHook } = config;
|
|
154
|
+
if (requestHook) {
|
|
155
|
+
instrumentation.safeExecuteInTheMiddle(
|
|
156
|
+
() =>
|
|
157
|
+
requestHook(span, {
|
|
158
|
+
moduleVersion,
|
|
159
|
+
cmdName: cmd.name,
|
|
160
|
+
cmdArgs: cmd.args,
|
|
161
|
+
}),
|
|
162
|
+
(e) => {
|
|
163
|
+
if (e) {
|
|
164
|
+
api.diag.error('ioredis instrumentation: request hook failed', e);
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
true,
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const result = original.apply(this, arguments);
|
|
172
|
+
const origResolve = cmd.resolve;
|
|
173
|
+
cmd.resolve = function (result) {
|
|
174
|
+
instrumentation.safeExecuteInTheMiddle(
|
|
175
|
+
() => config.responseHook?.(span, cmd.name, cmd.args, result),
|
|
176
|
+
(e) => {
|
|
177
|
+
if (e) {
|
|
178
|
+
api.diag.error('ioredis instrumentation: response hook failed', e);
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
true,
|
|
182
|
+
);
|
|
183
|
+
endSpan(span, null);
|
|
184
|
+
origResolve(result);
|
|
185
|
+
};
|
|
186
|
+
const origReject = cmd.reject;
|
|
187
|
+
cmd.reject = function (err) {
|
|
188
|
+
endSpan(span, err);
|
|
189
|
+
origReject(err);
|
|
190
|
+
};
|
|
191
|
+
return result;
|
|
192
|
+
} catch (error) {
|
|
193
|
+
endSpan(span, error );
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
_traceConnection(original) {
|
|
200
|
+
const instrumentation$1 = this;
|
|
201
|
+
return function () {
|
|
202
|
+
const hasNoParentSpan = api.trace.getSpan(api.context.active()) === undefined;
|
|
203
|
+
if (instrumentation$1.getConfig().requireParentSpan === true && hasNoParentSpan) {
|
|
204
|
+
return original.apply(this, arguments);
|
|
205
|
+
}
|
|
206
|
+
const attributes = {};
|
|
207
|
+
const { host, port } = this.options;
|
|
208
|
+
if (instrumentation$1._dbSemconvStability & instrumentation.SemconvStability.OLD) {
|
|
209
|
+
attributes[semconv.ATTR_DB_SYSTEM] = semconv.DB_SYSTEM_VALUE_REDIS;
|
|
210
|
+
attributes[semconv.ATTR_DB_STATEMENT] = 'connect';
|
|
211
|
+
attributes[semconv.ATTR_DB_CONNECTION_STRING] = `redis://${host}:${port}`;
|
|
212
|
+
}
|
|
213
|
+
if (instrumentation$1._dbSemconvStability & instrumentation.SemconvStability.STABLE) {
|
|
214
|
+
attributes[semanticConventions.ATTR_DB_SYSTEM_NAME] = semconv.DB_SYSTEM_NAME_VALUE_REDIS;
|
|
215
|
+
attributes[semanticConventions.ATTR_DB_QUERY_TEXT] = 'connect';
|
|
216
|
+
}
|
|
217
|
+
if (instrumentation$1._netSemconvStability & instrumentation.SemconvStability.OLD) {
|
|
218
|
+
attributes[semconv.ATTR_NET_PEER_NAME] = host;
|
|
219
|
+
attributes[semconv.ATTR_NET_PEER_PORT] = port;
|
|
220
|
+
}
|
|
221
|
+
if (instrumentation$1._netSemconvStability & instrumentation.SemconvStability.STABLE) {
|
|
222
|
+
attributes[semanticConventions.ATTR_SERVER_ADDRESS] = host;
|
|
223
|
+
attributes[semanticConventions.ATTR_SERVER_PORT] = port;
|
|
224
|
+
}
|
|
225
|
+
attributes[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
|
|
226
|
+
const span = instrumentation$1.tracer.startSpan('connect', {
|
|
227
|
+
kind: api.SpanKind.CLIENT,
|
|
228
|
+
attributes,
|
|
229
|
+
});
|
|
230
|
+
try {
|
|
231
|
+
const result = original.apply(this, arguments);
|
|
232
|
+
if (typeof result?.then === 'function') {
|
|
233
|
+
return result.then(
|
|
234
|
+
(value) => {
|
|
235
|
+
endSpan(span, null);
|
|
236
|
+
return value;
|
|
237
|
+
},
|
|
238
|
+
(error) => {
|
|
239
|
+
endSpan(span, error);
|
|
240
|
+
return Promise.reject(error);
|
|
241
|
+
},
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
endSpan(span, null);
|
|
245
|
+
return result;
|
|
246
|
+
} catch (error) {
|
|
247
|
+
endSpan(span, error );
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
exports.IORedisInstrumentation = IORedisInstrumentation;
|
|
255
|
+
//# sourceMappingURL=ioredis-instrumentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ioredis-instrumentation.js","sources":["../../../../../../src/integrations/tracing/redis/vendored/ioredis-instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/instrumentation-ioredis-v0.62.0/packages/instrumentation-ioredis\n * - Upstream version: @opentelemetry/instrumentation-ioredis@0.62.0\n * - Minor TypeScript adjustments for this repository's compiler settings\n */\n/* eslint-disable -- vendored @opentelemetry/instrumentation-ioredis */\n\nimport { context, diag, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';\nimport type { Span } from '@opentelemetry/api';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport {\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\n\nimport { defaultDbStatementSerializer } from './redis-common';\nimport {\n ATTR_DB_CONNECTION_STRING,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n DB_SYSTEM_NAME_VALUE_REDIS,\n DB_SYSTEM_VALUE_REDIS,\n} from './semconv';\nimport type { IORedisInstrumentationConfig } from './types';\n\nconst PACKAGE_NAME = '@opentelemetry/instrumentation-ioredis';\nconst PACKAGE_VERSION = '0.62.0';\n\n// ---- utils ----\n\nfunction endSpan(span: Span, err: Error | null | undefined): void {\n if (err) {\n span.recordException(err);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message,\n });\n }\n span.end();\n}\n\n// ---- IORedisInstrumentation ----\n\nconst DEFAULT_CONFIG: IORedisInstrumentationConfig = {\n requireParentSpan: true,\n};\n\nexport class IORedisInstrumentation extends InstrumentationBase<IORedisInstrumentationConfig> {\n _netSemconvStability!: SemconvStability;\n _dbSemconvStability!: SemconvStability;\n\n constructor(config: IORedisInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, { ...DEFAULT_CONFIG, ...config });\n this._setSemconvStabilityFromEnv();\n }\n\n _setSemconvStabilityFromEnv(): void {\n this._netSemconvStability = semconvStabilityFromStr('http', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n this._dbSemconvStability = semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n override setConfig(config: IORedisInstrumentationConfig = {}): void {\n super.setConfig({ ...DEFAULT_CONFIG, ...config });\n }\n\n init() {\n return [\n new InstrumentationNodeModuleDefinition(\n 'ioredis',\n ['>=2.0.0 <6'],\n (module: any, moduleVersion?: string) => {\n const moduleExports =\n module[Symbol.toStringTag] === 'Module'\n ? module.default // ESM\n : module; // CommonJS\n if (isWrapped(moduleExports.prototype.sendCommand)) {\n this._unwrap(moduleExports.prototype, 'sendCommand');\n }\n this._wrap(moduleExports.prototype, 'sendCommand', this._patchSendCommand(moduleVersion));\n if (isWrapped(moduleExports.prototype.connect)) {\n this._unwrap(moduleExports.prototype, 'connect');\n }\n this._wrap(moduleExports.prototype, 'connect', this._patchConnection());\n return module;\n },\n (module: any) => {\n if (module === undefined) return;\n const moduleExports =\n module[Symbol.toStringTag] === 'Module'\n ? module.default // ESM\n : module; // CommonJS\n this._unwrap(moduleExports.prototype, 'sendCommand');\n this._unwrap(moduleExports.prototype, 'connect');\n },\n ),\n ];\n }\n\n private _patchSendCommand(moduleVersion?: string) {\n return (original: Function) => {\n return this._traceSendCommand(original, moduleVersion);\n };\n }\n\n private _patchConnection() {\n return (original: Function) => {\n return this._traceConnection(original);\n };\n }\n\n private _traceSendCommand(original: Function, moduleVersion?: string) {\n const instrumentation = this;\n return function (this: any, cmd: any) {\n if (arguments.length < 1 || typeof cmd !== 'object') {\n return original.apply(this, arguments);\n }\n const config = instrumentation.getConfig();\n const dbStatementSerializer = config.dbStatementSerializer || defaultDbStatementSerializer;\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (config.requireParentSpan === true && hasNoParentSpan) {\n return original.apply(this, arguments);\n }\n const attributes: Record<string, any> = {};\n const { host, port } = this.options;\n const dbQueryText = dbStatementSerializer(cmd.name, cmd.args);\n if (instrumentation._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_SYSTEM] = DB_SYSTEM_VALUE_REDIS;\n attributes[ATTR_DB_STATEMENT] = dbQueryText;\n attributes[ATTR_DB_CONNECTION_STRING] = `redis://${host}:${port}`;\n }\n if (instrumentation._dbSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_SYSTEM_NAME] = DB_SYSTEM_NAME_VALUE_REDIS;\n attributes[ATTR_DB_QUERY_TEXT] = dbQueryText;\n }\n if (instrumentation._netSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_NET_PEER_NAME] = host;\n attributes[ATTR_NET_PEER_PORT] = port;\n }\n if (instrumentation._netSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_SERVER_ADDRESS] = host;\n attributes[ATTR_SERVER_PORT] = port;\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = instrumentation.tracer.startSpan(cmd.name, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n const { requestHook } = config;\n if (requestHook) {\n safeExecuteInTheMiddle(\n () =>\n requestHook(span, {\n moduleVersion,\n cmdName: cmd.name,\n cmdArgs: cmd.args,\n }),\n (e: Error | undefined) => {\n if (e) {\n diag.error('ioredis instrumentation: request hook failed', e);\n }\n },\n true,\n );\n }\n try {\n const result = original.apply(this, arguments);\n const origResolve = cmd.resolve;\n cmd.resolve = function (result: unknown) {\n safeExecuteInTheMiddle(\n () => config.responseHook?.(span, cmd.name, cmd.args, result),\n (e: Error | undefined) => {\n if (e) {\n diag.error('ioredis instrumentation: response hook failed', e);\n }\n },\n true,\n );\n endSpan(span, null);\n origResolve(result);\n };\n const origReject = cmd.reject;\n cmd.reject = function (err: Error) {\n endSpan(span, err);\n origReject(err);\n };\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n };\n }\n\n private _traceConnection(original: Function) {\n const instrumentation = this;\n return function (this: any) {\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (instrumentation.getConfig().requireParentSpan === true && hasNoParentSpan) {\n return original.apply(this, arguments);\n }\n const attributes: Record<string, any> = {};\n const { host, port } = this.options;\n if (instrumentation._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_SYSTEM] = DB_SYSTEM_VALUE_REDIS;\n attributes[ATTR_DB_STATEMENT] = 'connect';\n attributes[ATTR_DB_CONNECTION_STRING] = `redis://${host}:${port}`;\n }\n if (instrumentation._dbSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_SYSTEM_NAME] = DB_SYSTEM_NAME_VALUE_REDIS;\n attributes[ATTR_DB_QUERY_TEXT] = 'connect';\n }\n if (instrumentation._netSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_NET_PEER_NAME] = host;\n attributes[ATTR_NET_PEER_PORT] = port;\n }\n if (instrumentation._netSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_SERVER_ADDRESS] = host;\n attributes[ATTR_SERVER_PORT] = port;\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = instrumentation.tracer.startSpan('connect', {\n kind: SpanKind.CLIENT,\n attributes,\n });\n try {\n const result = original.apply(this, arguments);\n if (typeof result?.then === 'function') {\n return result.then(\n (value: unknown) => {\n endSpan(span, null);\n return value;\n },\n (error: Error) => {\n endSpan(span, error);\n return Promise.reject(error);\n },\n );\n }\n endSpan(span, null);\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n };\n }\n}\n"],"names":["SpanStatusCode","InstrumentationBase","semconvStabilityFromStr","InstrumentationNodeModuleDefinition","isWrapped","instrumentation","defaultDbStatementSerializer","trace","context","SemconvStability","ATTR_DB_SYSTEM","DB_SYSTEM_VALUE_REDIS","ATTR_DB_STATEMENT","ATTR_DB_CONNECTION_STRING","ATTR_DB_SYSTEM_NAME","DB_SYSTEM_NAME_VALUE_REDIS","ATTR_DB_QUERY_TEXT","ATTR_NET_PEER_NAME","ATTR_NET_PEER_PORT","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SpanKind","safeExecuteInTheMiddle","diag"],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Copyright The OpenTelemetry Authors
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*
|
|
18
|
+
* NOTICE from the Sentry authors:
|
|
19
|
+
* - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/instrumentation-redis-v0.62.0/packages/redis-common
|
|
20
|
+
* - Upstream version: @opentelemetry/redis-common@0.38.2
|
|
21
|
+
* - Minor TypeScript adjustments for this repository's compiler settings
|
|
22
|
+
*/
|
|
23
|
+
/* eslint-disable -- vendored @opentelemetry/redis-common */
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* List of regexes and the number of arguments that should be serialized for matching commands.
|
|
27
|
+
* For example, HSET should serialize which key and field it's operating on, but not its value.
|
|
28
|
+
* Setting the subset to -1 will serialize all arguments.
|
|
29
|
+
* Commands without a match will have their first argument serialized.
|
|
30
|
+
*
|
|
31
|
+
* Refer to https://redis.io/commands/ for the full list.
|
|
32
|
+
*/
|
|
33
|
+
const serializationSubsets = [
|
|
34
|
+
{
|
|
35
|
+
regex: /^ECHO/i,
|
|
36
|
+
args: 0,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
regex: /^(LPUSH|MSET|PFA|PUBLISH|RPUSH|SADD|SET|SPUBLISH|XADD|ZADD)/i,
|
|
40
|
+
args: 1,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
regex: /^(HSET|HMSET|LSET|LINSERT)/i,
|
|
44
|
+
args: 2,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
regex:
|
|
48
|
+
/^(ACL|BIT|B[LRZ]|CLIENT|CLUSTER|CONFIG|COMMAND|DECR|DEL|EVAL|EX|FUNCTION|GEO|GET|HINCR|HMGET|HSCAN|INCR|L[TRLM]|MEMORY|P[EFISTU]|RPOP|S[CDIMORSU]|XACK|X[CDGILPRT]|Z[CDILMPRS])/i,
|
|
49
|
+
args: -1,
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Given the redis command name and arguments, return a combination of the
|
|
55
|
+
* command name + the allowed arguments according to `serializationSubsets`.
|
|
56
|
+
*/
|
|
57
|
+
const defaultDbStatementSerializer = (
|
|
58
|
+
cmdName,
|
|
59
|
+
cmdArgs,
|
|
60
|
+
) => {
|
|
61
|
+
if (Array.isArray(cmdArgs) && cmdArgs.length) {
|
|
62
|
+
const nArgsToSerialize = serializationSubsets.find(({ regex }) => regex.test(cmdName))?.args ?? 0;
|
|
63
|
+
const argsToSerialize =
|
|
64
|
+
nArgsToSerialize >= 0 ? cmdArgs.slice(0, nArgsToSerialize) : cmdArgs.slice();
|
|
65
|
+
if (cmdArgs.length > argsToSerialize.length) {
|
|
66
|
+
argsToSerialize.push(`[${cmdArgs.length - nArgsToSerialize} other arguments]`);
|
|
67
|
+
}
|
|
68
|
+
return `${cmdName} ${argsToSerialize.join(' ')}`;
|
|
69
|
+
}
|
|
70
|
+
return cmdName;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
exports.defaultDbStatementSerializer = defaultDbStatementSerializer;
|
|
74
|
+
//# sourceMappingURL=redis-common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-common.js","sources":["../../../../../../src/integrations/tracing/redis/vendored/redis-common.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/instrumentation-redis-v0.62.0/packages/redis-common\n * - Upstream version: @opentelemetry/redis-common@0.38.2\n * - Minor TypeScript adjustments for this repository's compiler settings\n */\n/* eslint-disable -- vendored @opentelemetry/redis-common */\n\n/**\n * List of regexes and the number of arguments that should be serialized for matching commands.\n * For example, HSET should serialize which key and field it's operating on, but not its value.\n * Setting the subset to -1 will serialize all arguments.\n * Commands without a match will have their first argument serialized.\n *\n * Refer to https://redis.io/commands/ for the full list.\n */\nconst serializationSubsets = [\n {\n regex: /^ECHO/i,\n args: 0,\n },\n {\n regex: /^(LPUSH|MSET|PFA|PUBLISH|RPUSH|SADD|SET|SPUBLISH|XADD|ZADD)/i,\n args: 1,\n },\n {\n regex: /^(HSET|HMSET|LSET|LINSERT)/i,\n args: 2,\n },\n {\n regex:\n /^(ACL|BIT|B[LRZ]|CLIENT|CLUSTER|CONFIG|COMMAND|DECR|DEL|EVAL|EX|FUNCTION|GEO|GET|HINCR|HMGET|HSCAN|INCR|L[TRLM]|MEMORY|P[EFISTU]|RPOP|S[CDIMORSU]|XACK|X[CDGILPRT]|Z[CDILMPRS])/i,\n args: -1,\n },\n];\n\n/**\n * Given the redis command name and arguments, return a combination of the\n * command name + the allowed arguments according to `serializationSubsets`.\n */\nexport const defaultDbStatementSerializer = (\n cmdName: string,\n cmdArgs: Array<string | Buffer | number | any[]>,\n): string => {\n if (Array.isArray(cmdArgs) && cmdArgs.length) {\n const nArgsToSerialize = serializationSubsets.find(({ regex }) => regex.test(cmdName))?.args ?? 0;\n const argsToSerialize: Array<string | Buffer | number | any[]> =\n nArgsToSerialize >= 0 ? cmdArgs.slice(0, nArgsToSerialize) : cmdArgs.slice();\n if (cmdArgs.length > argsToSerialize.length) {\n argsToSerialize.push(`[${cmdArgs.length - nArgsToSerialize} other arguments]`);\n }\n return `${cmdName} ${argsToSerialize.join(' ')}`;\n }\n return cmdName;\n};\n"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uBAAuB;AAC7B,EAAE;AACF,IAAI,KAAK,EAAE,QAAQ;AACnB,IAAI,IAAI,EAAE,CAAC;AACX,GAAG;AACH,EAAE;AACF,IAAI,KAAK,EAAE,8DAA8D;AACzE,IAAI,IAAI,EAAE,CAAC;AACX,GAAG;AACH,EAAE;AACF,IAAI,KAAK,EAAE,6BAA6B;AACxC,IAAI,IAAI,EAAE,CAAC;AACX,GAAG;AACH,EAAE;AACF,IAAI,KAAK;AACT,MAAM,kLAAkL;AACxL,IAAI,IAAI,EAAE,EAAE;AACZ,GAAG;AACH,CAAC;;AAED;AACA;AACA;AACA;AACO,MAAM,+BAA+B;AAC5C,EAAE,OAAO;AACT,EAAE,OAAO;AACT,KAAa;AACb,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAA,IAAK,OAAO,CAAC,MAAM,EAAE;AAChD,IAAI,MAAM,mBAAmB,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,KAAA,EAAO,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAA,IAAQ,CAAC;AACrG,IAAI,MAAM,eAAe;AACzB,MAAM,oBAAoB,CAAA,GAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAA,GAAI,OAAO,CAAC,KAAK,EAAE;AAClF,IAAI,IAAI,OAAO,CAAC,SAAS,eAAe,CAAC,MAAM,EAAE;AACjD,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;AACpF,IAAI;AACJ,IAAI,OAAO,CAAC,EAAA,OAAA,CAAA,CAAA,EAAA,eAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA,CAAA;AACA,EAAA;AACA,EAAA,OAAA,OAAA;AACA;;;;"}
|