Skip to content

Commit 52b7884

Browse files
committed
re-introduce http kind
1 parent cfc1f8b commit 52b7884

File tree

4 files changed

+52
-22
lines changed

4 files changed

+52
-22
lines changed

packages/cloudflare/src/request.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export function wrapRequestHandler(
3939
isolationScope.setClient(client);
4040

4141
const urlObject = parseStringToURLObject(request.url);
42-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'auto.http.cloudflare', request);
42+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'auto.http.cloudflare', request);
4343

4444
const contentLength = request.headers.get('content-length');
4545
if (contentLength) {

packages/cloudflare/test/request.test.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,13 @@ describe('withSentry', () => {
254254
data: {
255255
'sentry.origin': 'auto.http.cloudflare',
256256
'sentry.op': 'http.server',
257-
'sentry.source': 'url',
257+
'sentry.source': 'route',
258258
'http.request.method': 'GET',
259259
'url.full': 'https://example.com/',
260260
'server.address': 'example.com',
261261
'network.protocol.name': 'HTTP/1.1',
262-
'url.scheme': 'https',
262+
'url.scheme': 'https:',
263+
'url.path': '/',
263264
'sentry.sample_rate': 1,
264265
'http.response.status_code': 200,
265266
'http.request.body.size': 10,
@@ -269,6 +270,8 @@ describe('withSentry', () => {
269270
span_id: expect.stringMatching(/[a-f0-9]{16}/),
270271
status: 'ok',
271272
trace_id: expect.stringMatching(/[a-f0-9]{32}/),
273+
parent_span_id: undefined,
274+
links: undefined,
272275
});
273276
});
274277
});

packages/core/src/utils-hoist/url.ts

+13-5
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,18 @@ type PartialRequest = {
121121

122122
function getHttpSpanNameFromUrlObject(
123123
urlObject: URLObject | undefined,
124+
kind: 'server' | 'client',
124125
request?: PartialRequest,
125126
routeName?: string,
126127
): string {
127128
const method = request?.method?.toUpperCase() ?? 'GET';
128-
const route = routeName ? routeName : urlObject ? getSanitizedUrlStringFromUrlObject(urlObject) : '/';
129+
const route = routeName
130+
? routeName
131+
: urlObject
132+
? kind === 'client'
133+
? getSanitizedUrlStringFromUrlObject(urlObject)
134+
: urlObject.pathname
135+
: '/';
129136

130137
return `${method} ${route}`;
131138
}
@@ -138,14 +145,15 @@ function getHttpSpanNameFromUrlObject(
138145
* Follows https://opentelemetry.io/docs/specs/semconv/http/.
139146
*
140147
* @param urlObject - see {@link parseStringToURLObject}
141-
* @param httpType - The type of HTTP operation (server or client)
148+
* @param kind - The type of HTTP operation (server or client)
142149
* @param spanOrigin - The origin of the span
143150
* @param request - The request object, see {@link PartialRequest}
144151
* @param routeName - The name of the route, must be low cardinality
145152
* @returns The span name and attributes for the HTTP operation
146153
*/
147154
export function getHttpSpanDetailsFromUrlObject(
148155
urlObject: URLObject | undefined,
156+
kind: 'server' | 'client',
149157
spanOrigin: string,
150158
request?: PartialRequest,
151159
routeName?: string,
@@ -156,7 +164,7 @@ export function getHttpSpanDetailsFromUrlObject(
156164
};
157165

158166
if (routeName) {
159-
attributes['http.route'] = routeName;
167+
attributes[kind === 'client' ? 'http.route' : 'url.route'] = routeName;
160168
attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] = 'route';
161169
}
162170

@@ -187,12 +195,12 @@ export function getHttpSpanDetailsFromUrlObject(
187195
attributes['url.scheme'] = urlObject.protocol;
188196
}
189197
if (urlObject.hostname) {
190-
attributes['server.address'] = urlObject.hostname;
198+
attributes[kind === 'server' ? 'server.address' : 'url.domain'] = urlObject.hostname;
191199
}
192200
}
193201
}
194202

195-
return [getHttpSpanNameFromUrlObject(urlObject, request, routeName), attributes];
203+
return [getHttpSpanNameFromUrlObject(urlObject, kind, request, routeName), attributes];
196204
}
197205

198206
/**

packages/core/test/utils-hoist/url.test.ts

+33-14
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ describe('getSanitizedUrlStringFromUrlObject', () => {
398398

399399
describe('getHttpSpanDetailsFromUrlObject', () => {
400400
it('handles undefined URL object', () => {
401-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(undefined, 'test-origin');
401+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(undefined, 'server', 'test-origin');
402402
expect(name).toBe('GET /');
403403
expect(attributes).toEqual({
404404
'sentry.origin': 'test-origin',
@@ -408,7 +408,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
408408

409409
it('handles relative URL object', () => {
410410
const urlObject = parseStringToURLObject('/api/users')!;
411-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin');
411+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin');
412412
expect(name).toBe('GET /api/users');
413413
expect(attributes).toEqual({
414414
'sentry.origin': 'test-origin',
@@ -419,7 +419,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
419419

420420
it('handles absolute URL object', () => {
421421
const urlObject = parseStringToURLObject('https://example.com/api/users?q=test#section')!;
422-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin');
422+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin');
423423
expect(name).toBe('GET https://example.com/api/users');
424424
expect(attributes).toEqual({
425425
'sentry.origin': 'test-origin',
@@ -435,7 +435,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
435435

436436
it('handles URL object with request method', () => {
437437
const urlObject = parseStringToURLObject('https://example.com/api/users')!;
438-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin', { method: 'POST' });
438+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin', { method: 'POST' });
439439
expect(name).toBe('POST https://example.com/api/users');
440440
expect(attributes).toEqual({
441441
'sentry.origin': 'test-origin',
@@ -450,7 +450,13 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
450450

451451
it('handles URL object with route name', () => {
452452
const urlObject = parseStringToURLObject('https://example.com/api/users')!;
453-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin', undefined, '/api/users/:id');
453+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(
454+
urlObject,
455+
'server',
456+
'test-origin',
457+
undefined,
458+
'/api/users/:id',
459+
);
454460
expect(name).toBe('GET /api/users/:id');
455461
expect(attributes).toEqual({
456462
'sentry.origin': 'test-origin',
@@ -465,7 +471,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
465471

466472
it('handles root path URL', () => {
467473
const urlObject = parseStringToURLObject('https://example.com/')!;
468-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin');
474+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin');
469475
expect(name).toBe('GET https://example.com/');
470476
expect(attributes).toEqual({
471477
'sentry.origin': 'test-origin',
@@ -479,7 +485,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
479485

480486
it('handles URL with port', () => {
481487
const urlObject = parseStringToURLObject('https://example.com:8080/api/users')!;
482-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin');
488+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin');
483489
expect(name).toBe('GET https://example.com:8080/api/users');
484490
expect(attributes).toEqual({
485491
'sentry.origin': 'test-origin',
@@ -494,7 +500,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
494500

495501
it('handles URL with non-standard port and request method', () => {
496502
const urlObject = parseStringToURLObject('https://example.com:3000/api/users')!;
497-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin', { method: 'PUT' });
503+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin', { method: 'PUT' });
498504
expect(name).toBe('PUT https://example.com:3000/api/users');
499505
expect(attributes).toEqual({
500506
'sentry.origin': 'test-origin',
@@ -512,6 +518,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
512518
const urlObject = parseStringToURLObject('https://example.com/api/users/123')!;
513519
const [name, attributes] = getHttpSpanDetailsFromUrlObject(
514520
urlObject,
521+
'server',
515522
'test-origin',
516523
{ method: 'PATCH' },
517524
'/api/users/:id',
@@ -531,7 +538,13 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
531538

532539
it('handles URL with query params and route name', () => {
533540
const urlObject = parseStringToURLObject('https://example.com/api/search?q=test&page=1')!;
534-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin', undefined, '/api/search');
541+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(
542+
urlObject,
543+
'server',
544+
'test-origin',
545+
undefined,
546+
'/api/search',
547+
);
535548
expect(name).toBe('GET /api/search');
536549
expect(attributes).toEqual({
537550
'sentry.origin': 'test-origin',
@@ -547,7 +560,13 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
547560

548561
it('handles URL with fragment and route name', () => {
549562
const urlObject = parseStringToURLObject('https://example.com/api/docs#section-1')!;
550-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin', undefined, '/api/docs');
563+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(
564+
urlObject,
565+
'server',
566+
'test-origin',
567+
undefined,
568+
'/api/docs',
569+
);
551570
expect(name).toBe('GET /api/docs');
552571
expect(attributes).toEqual({
553572
'sentry.origin': 'test-origin',
@@ -563,7 +582,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
563582

564583
it('handles URL with auth credentials', () => {
565584
const urlObject = parseStringToURLObject('https://user:[email protected]/api/users')!;
566-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin');
585+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin');
567586
expect(name).toBe('GET https://%filtered%:%filtered%@example.com/api/users');
568587
expect(attributes).toEqual({
569588
'sentry.origin': 'test-origin',
@@ -577,7 +596,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
577596

578597
it('handles URL with IPv4 address', () => {
579598
const urlObject = parseStringToURLObject('https://192.168.1.1:8080/api/users')!;
580-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin');
599+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin');
581600
expect(name).toBe('GET https://192.168.1.1:8080/api/users');
582601
expect(attributes).toEqual({
583602
'sentry.origin': 'test-origin',
@@ -592,7 +611,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
592611

593612
it('handles URL with IPv6 address', () => {
594613
const urlObject = parseStringToURLObject('https://[2001:db8::1]:8080/api/users')!;
595-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin');
614+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin');
596615
expect(name).toBe('GET https://[2001:db8::1]:8080/api/users');
597616
expect(attributes).toEqual({
598617
'sentry.origin': 'test-origin',
@@ -607,7 +626,7 @@ describe('getHttpSpanDetailsFromUrlObject', () => {
607626

608627
it('handles URL with subdomain', () => {
609628
const urlObject = parseStringToURLObject('https://api.example.com/users')!;
610-
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'test-origin');
629+
const [name, attributes] = getHttpSpanDetailsFromUrlObject(urlObject, 'server', 'test-origin');
611630
expect(name).toBe('GET https://api.example.com/users');
612631
expect(attributes).toEqual({
613632
'sentry.origin': 'test-origin',

0 commit comments

Comments
 (0)