Skip to content

Commit 9e56c74

Browse files
authored
fix(node): Suppress tracing for transport request execution rather than transport creation (#13491)
#13466 (comment) correctly points out that we are suppressing tracing for the transport creation instead of the transport execution. This PR wraps the code that is actually conducting the request with `suppressTracing` instead of the transport creation. Fixes #13466
1 parent 3158c21 commit 9e56c74

File tree

6 files changed

+89
-85
lines changed

6 files changed

+89
-85
lines changed

packages/browser/src/transports/fetch.ts

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export function makeFetchTransport(
4747
}
4848

4949
try {
50+
// TODO: This may need a `suppresTracing` call in the future when we switch the browser SDK to OTEL
5051
return nativeFetch(options.url, requestOptions).then(response => {
5152
pendingBodySize -= requestSize;
5253
pendingCount--;

packages/cloudflare/src/transport.ts

+11-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createTransport } from '@sentry/core';
1+
import { createTransport, suppressTracing } from '@sentry/core';
22
import type { BaseTransportOptions, Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';
33
import { SentryError } from '@sentry/utils';
44

@@ -89,14 +89,16 @@ export function makeCloudflareTransport(options: CloudflareTransportOptions): Tr
8989
...options.fetchOptions,
9090
};
9191

92-
return fetch(options.url, requestOptions).then(response => {
93-
return {
94-
statusCode: response.status,
95-
headers: {
96-
'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
97-
'retry-after': response.headers.get('Retry-After'),
98-
},
99-
};
92+
return suppressTracing(() => {
93+
return fetch(options.url, requestOptions).then(response => {
94+
return {
95+
statusCode: response.status,
96+
headers: {
97+
'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
98+
'retry-after': response.headers.get('Retry-After'),
99+
},
100+
};
101+
});
100102
});
101103
}
102104

packages/deno/src/transports/index.ts

+11-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createTransport } from '@sentry/core';
1+
import { createTransport, suppressTracing } from '@sentry/core';
22
import type { BaseTransportOptions, Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';
33
import { consoleSandbox, logger, rejectedSyncPromise } from '@sentry/utils';
44

@@ -37,14 +37,16 @@ export function makeFetchTransport(options: DenoTransportOptions): Transport {
3737
};
3838

3939
try {
40-
return fetch(options.url, requestOptions).then(response => {
41-
return {
42-
statusCode: response.status,
43-
headers: {
44-
'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
45-
'retry-after': response.headers.get('Retry-After'),
46-
},
47-
};
40+
return suppressTracing(() => {
41+
return fetch(options.url, requestOptions).then(response => {
42+
return {
43+
statusCode: response.status,
44+
headers: {
45+
'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
46+
'retry-after': response.headers.get('Retry-After'),
47+
},
48+
};
49+
});
4850
});
4951
} catch (e) {
5052
return rejectedSyncPromise(e);

packages/node/src/integrations/http.ts

-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
getCapturedScopesOnSpan,
1010
getCurrentScope,
1111
getIsolationScope,
12-
isSentryRequestUrl,
1312
setCapturedScopesOnSpan,
1413
} from '@sentry/core';
1514
import { getClient } from '@sentry/opentelemetry';
@@ -102,10 +101,6 @@ export const instrumentHttp = Object.assign(
102101
return false;
103102
}
104103

105-
if (isSentryRequestUrl(url, getClient())) {
106-
return true;
107-
}
108-
109104
const _ignoreOutgoingRequests = _httpOptions.ignoreOutgoingRequests;
110105
if (_ignoreOutgoingRequests && _ignoreOutgoingRequests(url, request)) {
111106
return true;

packages/node/src/transports/http.ts

+55-53
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,8 @@ export function makeNodeTransport(options: NodeTransportOptions): Transport {
7979
? (new HttpsProxyAgent(proxy) as http.Agent)
8080
: new nativeHttpModule.Agent({ keepAlive, maxSockets: 30, timeout: 2000 });
8181

82-
// This ensures we do not generate any spans in OpenTelemetry for the transport
83-
return suppressTracing(() => {
84-
const requestExecutor = createRequestExecutor(options, options.httpModule ?? nativeHttpModule, agent);
85-
return createTransport(options, requestExecutor);
86-
});
82+
const requestExecutor = createRequestExecutor(options, options.httpModule ?? nativeHttpModule, agent);
83+
return createTransport(options, requestExecutor);
8784
}
8885

8986
/**
@@ -122,54 +119,59 @@ function createRequestExecutor(
122119
const { hostname, pathname, port, protocol, search } = new URL(options.url);
123120
return function makeRequest(request: TransportRequest): Promise<TransportMakeRequestResponse> {
124121
return new Promise((resolve, reject) => {
125-
let body = streamFromBody(request.body);
126-
127-
const headers: Record<string, string> = { ...options.headers };
128-
129-
if (request.body.length > GZIP_THRESHOLD) {
130-
headers['content-encoding'] = 'gzip';
131-
body = body.pipe(createGzip());
132-
}
133-
134-
const req = httpModule.request(
135-
{
136-
method: 'POST',
137-
agent,
138-
headers,
139-
hostname,
140-
path: `${pathname}${search}`,
141-
port,
142-
protocol,
143-
ca: options.caCerts,
144-
},
145-
res => {
146-
res.on('data', () => {
147-
// Drain socket
148-
});
149-
150-
res.on('end', () => {
151-
// Drain socket
152-
});
153-
154-
res.setEncoding('utf8');
155-
156-
// "Key-value pairs of header names and values. Header names are lower-cased."
157-
// https://nodejs.org/api/http.html#http_message_headers
158-
const retryAfterHeader = res.headers['retry-after'] ?? null;
159-
const rateLimitsHeader = res.headers['x-sentry-rate-limits'] ?? null;
160-
161-
resolve({
162-
statusCode: res.statusCode,
163-
headers: {
164-
'retry-after': retryAfterHeader,
165-
'x-sentry-rate-limits': Array.isArray(rateLimitsHeader) ? rateLimitsHeader[0] || null : rateLimitsHeader,
166-
},
167-
});
168-
},
169-
);
170-
171-
req.on('error', reject);
172-
body.pipe(req);
122+
// This ensures we do not generate any spans in OpenTelemetry for the transport
123+
suppressTracing(() => {
124+
let body = streamFromBody(request.body);
125+
126+
const headers: Record<string, string> = { ...options.headers };
127+
128+
if (request.body.length > GZIP_THRESHOLD) {
129+
headers['content-encoding'] = 'gzip';
130+
body = body.pipe(createGzip());
131+
}
132+
133+
const req = httpModule.request(
134+
{
135+
method: 'POST',
136+
agent,
137+
headers,
138+
hostname,
139+
path: `${pathname}${search}`,
140+
port,
141+
protocol,
142+
ca: options.caCerts,
143+
},
144+
res => {
145+
res.on('data', () => {
146+
// Drain socket
147+
});
148+
149+
res.on('end', () => {
150+
// Drain socket
151+
});
152+
153+
res.setEncoding('utf8');
154+
155+
// "Key-value pairs of header names and values. Header names are lower-cased."
156+
// https://nodejs.org/api/http.html#http_message_headers
157+
const retryAfterHeader = res.headers['retry-after'] ?? null;
158+
const rateLimitsHeader = res.headers['x-sentry-rate-limits'] ?? null;
159+
160+
resolve({
161+
statusCode: res.statusCode,
162+
headers: {
163+
'retry-after': retryAfterHeader,
164+
'x-sentry-rate-limits': Array.isArray(rateLimitsHeader)
165+
? rateLimitsHeader[0] || null
166+
: rateLimitsHeader,
167+
},
168+
});
169+
},
170+
);
171+
172+
req.on('error', reject);
173+
body.pipe(req);
174+
});
173175
});
174176
};
175177
}

packages/vercel-edge/src/transports/index.ts

+11-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createTransport } from '@sentry/core';
1+
import { createTransport, suppressTracing } from '@sentry/core';
22
import type { BaseTransportOptions, Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';
33
import { SentryError } from '@sentry/utils';
44

@@ -89,14 +89,16 @@ export function makeEdgeTransport(options: VercelEdgeTransportOptions): Transpor
8989
...options.fetchOptions,
9090
};
9191

92-
return fetch(options.url, requestOptions).then(response => {
93-
return {
94-
statusCode: response.status,
95-
headers: {
96-
'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
97-
'retry-after': response.headers.get('Retry-After'),
98-
},
99-
};
92+
return suppressTracing(() => {
93+
return fetch(options.url, requestOptions).then(response => {
94+
return {
95+
statusCode: response.status,
96+
headers: {
97+
'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
98+
'retry-after': response.headers.get('Retry-After'),
99+
},
100+
};
101+
});
100102
});
101103
}
102104

0 commit comments

Comments
 (0)