Skip to content

Commit 79b06a4

Browse files
authored
feat: improve http span name (#3603)
1 parent abfe059 commit 79b06a4

File tree

9 files changed

+55
-33
lines changed

9 files changed

+55
-33
lines changed

experimental/CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ All notable changes to experimental packages in this project will be documented
66

77
### :boom: Breaking Change
88

9+
* feat: remove HTTP/HTTPS prefix from span name [#3603](https://github.com/open-telemetry/opentelemetry-js/pull/3603) @Flarna
10+
911
### :rocket: (Enhancement)
1012

13+
* feat: use HTTP_ROUTE in span name [#3603](https://github.com/open-telemetry/opentelemetry-js/pull/3603) @Flarna
1114
* feat: add HTTP_ROUTE attribute to http incoming metrics if present [#3581](https://github.com/open-telemetry/opentelemetry-js/pull/3581) @hermogenes
1215
* feat(sdk-node): install diag logger with OTEL_LOG_LEVEL [#3627](https://github.com/open-telemetry/opentelemetry-js/pull/3627) @legendecas
1316

experimental/packages/opentelemetry-instrumentation-http/src/http.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import {
5858
} from '@opentelemetry/instrumentation';
5959
import { RPCMetadata, RPCType, setRPCMetadata } from '@opentelemetry/core';
6060
import { errorMonitor } from 'events';
61+
import { SemanticAttributes } from '@opentelemetry/semantic-conventions';
6162

6263
/**
6364
* Http instrumentation instrumentation for Opentelemetry
@@ -489,11 +490,7 @@ export class HttpInstrumentation extends InstrumentationBase<Http> {
489490
utils.getIncomingRequestMetricAttributes(spanAttributes);
490491

491492
const ctx = propagation.extract(ROOT_CONTEXT, headers);
492-
const span = instrumentation._startHttpSpan(
493-
`${component.toLocaleUpperCase()} ${method}`,
494-
spanOptions,
495-
ctx
496-
);
493+
const span = instrumentation._startHttpSpan(method, spanOptions, ctx);
497494
const rpcMetadata: RPCMetadata = {
498495
type: RPCType.HTTP,
499496
span,
@@ -622,7 +619,6 @@ export class HttpInstrumentation extends InstrumentationBase<Http> {
622619
return original.apply(this, [optionsParsed, ...args]);
623620
}
624621

625-
const operationName = `${component.toUpperCase()} ${method}`;
626622
const { hostname, port } = utils.extractHostnameAndPort(optionsParsed);
627623

628624
const attributes = utils.getOutgoingRequestAttributes(optionsParsed, {
@@ -643,7 +639,7 @@ export class HttpInstrumentation extends InstrumentationBase<Http> {
643639
kind: SpanKind.CLIENT,
644640
attributes,
645641
};
646-
const span = instrumentation._startHttpSpan(operationName, spanOptions);
642+
const span = instrumentation._startHttpSpan(method, spanOptions);
647643

648644
const parentContext = context.active();
649645
const requestContext = trace.setSpan(parentContext, span);
@@ -717,6 +713,11 @@ export class HttpInstrumentation extends InstrumentationBase<Http> {
717713
code: utils.parseResponseStatus(SpanKind.SERVER, response.statusCode),
718714
});
719715

716+
const route = attributes[SemanticAttributes.HTTP_ROUTE];
717+
if (route) {
718+
span.updateName(`${request.method || 'GET'} ${route}`);
719+
}
720+
720721
if (this._getConfig().applyCustomAttributesOnSpan) {
721722
safeExecuteInTheMiddle(
722723
() =>

experimental/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts

+24-3
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,13 @@ describe('HttpInstrumentation', () => {
272272
if (request.url?.includes('/ignored')) {
273273
provider.getTracer('test').startSpan('some-span').end();
274274
}
275+
if (request.url?.includes('/setroute')) {
276+
const rpcData = getRPCMetadata(context.active());
277+
assert.ok(rpcData != null);
278+
assert.strictEqual(rpcData.type, RPCType.HTTP);
279+
assert.strictEqual(rpcData.route, undefined);
280+
rpcData.route = 'TheRoute';
281+
}
275282
response.end('Test Server Response');
276283
});
277284

@@ -339,6 +346,20 @@ describe('HttpInstrumentation', () => {
339346
});
340347
});
341348

349+
it('should respect HTTP_ROUTE', async () => {
350+
await httpRequest.get(
351+
`${protocol}://${hostname}:${serverPort}/setroute`
352+
);
353+
const span = memoryExporter.getFinishedSpans()[0];
354+
355+
assert.strictEqual(span.kind, SpanKind.SERVER);
356+
assert.strictEqual(
357+
span.attributes[SemanticAttributes.HTTP_ROUTE],
358+
'TheRoute'
359+
);
360+
assert.strictEqual(span.name, 'GET TheRoute');
361+
});
362+
342363
const httpErrorCodes = [
343364
400, 401, 403, 404, 429, 501, 503, 504, 500, 505, 597,
344365
];
@@ -404,7 +425,7 @@ describe('HttpInstrumentation', () => {
404425

405426
assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0);
406427
assert.strictEqual(spans.length, 2);
407-
assert.strictEqual(reqSpan.name, 'HTTP GET');
428+
assert.strictEqual(reqSpan.name, 'GET');
408429
assert.strictEqual(
409430
localSpan.spanContext().traceId,
410431
reqSpan.spanContext().traceId
@@ -449,7 +470,7 @@ describe('HttpInstrumentation', () => {
449470

450471
assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0);
451472
assert.strictEqual(spans.length, 2);
452-
assert.strictEqual(reqSpan.name, 'HTTP GET');
473+
assert.strictEqual(reqSpan.name, 'GET');
453474
assert.strictEqual(
454475
localSpan.spanContext().traceId,
455476
reqSpan.spanContext().traceId
@@ -474,7 +495,7 @@ describe('HttpInstrumentation', () => {
474495
for (let i = 0; i < num; i++) {
475496
await httpRequest.get(`${protocol}://${hostname}${testPath}`);
476497
const spans = memoryExporter.getFinishedSpans();
477-
assert.strictEqual(spans[i].name, 'HTTP GET');
498+
assert.strictEqual(spans[i].name, 'GET');
478499
assert.strictEqual(
479500
span.spanContext().traceId,
480501
spans[i].spanContext().traceId

experimental/packages/opentelemetry-instrumentation-http/test/functionals/http-package.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ describe('Packages', () => {
119119
};
120120

121121
assert.strictEqual(spans.length, 1);
122-
assert.strictEqual(span.name, 'HTTP GET');
122+
assert.strictEqual(span.name, 'GET');
123123

124124
switch (name) {
125125
case 'axios':

experimental/packages/opentelemetry-instrumentation-http/test/functionals/https-enable.test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ describe('HttpsInstrumentation', () => {
356356

357357
assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0);
358358
assert.strictEqual(spans.length, 2);
359-
assert.strictEqual(reqSpan.name, 'HTTPS GET');
359+
assert.strictEqual(reqSpan.name, 'GET');
360360
assert.strictEqual(
361361
localSpan.spanContext().traceId,
362362
reqSpan.spanContext().traceId
@@ -401,7 +401,7 @@ describe('HttpsInstrumentation', () => {
401401

402402
assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0);
403403
assert.strictEqual(spans.length, 2);
404-
assert.strictEqual(reqSpan.name, 'HTTPS GET');
404+
assert.strictEqual(reqSpan.name, 'GET');
405405
assert.strictEqual(
406406
localSpan.spanContext().traceId,
407407
reqSpan.spanContext().traceId
@@ -426,7 +426,7 @@ describe('HttpsInstrumentation', () => {
426426
for (let i = 0; i < num; i++) {
427427
await httpsRequest.get(`${protocol}://${hostname}${testPath}`);
428428
const spans = memoryExporter.getFinishedSpans();
429-
assert.strictEqual(spans[i].name, 'HTTPS GET');
429+
assert.strictEqual(spans[i].name, 'GET');
430430
assert.strictEqual(
431431
span.spanContext().traceId,
432432
spans[i].spanContext().traceId

experimental/packages/opentelemetry-instrumentation-http/test/functionals/https-package.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ describe('Packages', () => {
125125
};
126126

127127
assert.strictEqual(spans.length, 1);
128-
assert.strictEqual(span.name, 'HTTPS GET');
128+
assert.strictEqual(span.name, 'GET');
129129

130130
switch (name) {
131131
case 'axios':

experimental/packages/opentelemetry-instrumentation-http/test/integrations/http-enable.test.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ describe('HttpInstrumentation Integration tests', () => {
176176
};
177177

178178
assert.strictEqual(spans.length, 2);
179-
assert.strictEqual(span.name, 'HTTP GET');
179+
assert.strictEqual(span.name, 'GET');
180180
assertSpan(span, SpanKind.CLIENT, validations);
181181
});
182182

@@ -203,7 +203,7 @@ describe('HttpInstrumentation Integration tests', () => {
203203
};
204204

205205
assert.strictEqual(spans.length, 2);
206-
assert.strictEqual(span.name, 'HTTP GET');
206+
assert.strictEqual(span.name, 'GET');
207207
assertSpan(span, SpanKind.CLIENT, validations);
208208
});
209209

@@ -233,7 +233,7 @@ describe('HttpInstrumentation Integration tests', () => {
233233
};
234234

235235
assert.strictEqual(spans.length, 2);
236-
assert.strictEqual(span.name, 'HTTP GET');
236+
assert.strictEqual(span.name, 'GET');
237237
assert.strictEqual(result.reqHeaders['x-foo'], 'foo');
238238
assert.strictEqual(
239239
span.attributes[SemanticAttributes.HTTP_FLAVOR],
@@ -264,7 +264,7 @@ describe('HttpInstrumentation Integration tests', () => {
264264
};
265265

266266
assert.strictEqual(spans.length, 2);
267-
assert.strictEqual(span.name, 'HTTP GET');
267+
assert.strictEqual(span.name, 'GET');
268268
assert.strictEqual(span.attributes['span kind'], SpanKind.CLIENT);
269269
assertSpan(span, SpanKind.CLIENT, validations);
270270
});
@@ -292,7 +292,7 @@ describe('HttpInstrumentation Integration tests', () => {
292292
};
293293

294294
assert.strictEqual(spans.length, 2);
295-
assert.strictEqual(span.name, 'HTTP GET');
295+
assert.strictEqual(span.name, 'GET');
296296
assertSpan(span, SpanKind.CLIENT, validations);
297297
});
298298
for (const headers of [
@@ -347,7 +347,7 @@ describe('HttpInstrumentation Integration tests', () => {
347347
const span = spans.find(s => s.kind === SpanKind.CLIENT);
348348
assert.ok(span);
349349
assert.strictEqual(spans.length, 2);
350-
assert.strictEqual(span.name, 'HTTP GET');
350+
assert.strictEqual(span.name, 'GET');
351351
assert.ok(data);
352352
assert.ok(validations.reqHeaders[DummyPropagation.TRACE_CONTEXT_KEY]);
353353
assert.ok(validations.reqHeaders[DummyPropagation.SPAN_CONTEXT_KEY]);
@@ -362,7 +362,7 @@ describe('HttpInstrumentation Integration tests', () => {
362362
const span = spans.find((s: any) => s.kind === SpanKind.SERVER);
363363
assert.ok(span);
364364
assert.strictEqual(spans.length, 2);
365-
assert.strictEqual(span.name, 'HTTP GET');
365+
assert.strictEqual(span.name, 'GET');
366366
});
367367

368368
it('should have correct spans even when request timeout', async () => {
@@ -381,7 +381,7 @@ describe('HttpInstrumentation Integration tests', () => {
381381
spans = memoryExporter.getFinishedSpans();
382382
const span = spans.find(s => s.kind === SpanKind.CLIENT);
383383
assert.ok(span);
384-
assert.strictEqual(span.name, 'HTTP GET');
384+
assert.strictEqual(span.name, 'GET');
385385
assert.strictEqual(
386386
span.attributes[SemanticAttributes.HTTP_HOST],
387387
`localhost:${mockServerPort}`

experimental/packages/opentelemetry-instrumentation-http/test/integrations/https-enable.test.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ describe('HttpsInstrumentation Integration tests', () => {
180180
};
181181

182182
assert.strictEqual(spans.length, 2);
183-
assert.strictEqual(span.name, 'HTTPS GET');
183+
assert.strictEqual(span.name, 'GET');
184184
assertSpan(span, SpanKind.CLIENT, validations);
185185
});
186186

@@ -207,7 +207,7 @@ describe('HttpsInstrumentation Integration tests', () => {
207207
};
208208

209209
assert.strictEqual(spans.length, 2);
210-
assert.strictEqual(span.name, 'HTTPS GET');
210+
assert.strictEqual(span.name, 'GET');
211211
assertSpan(span, SpanKind.CLIENT, validations);
212212
});
213213

@@ -237,7 +237,7 @@ describe('HttpsInstrumentation Integration tests', () => {
237237
};
238238

239239
assert.strictEqual(spans.length, 2);
240-
assert.strictEqual(span.name, 'HTTPS GET');
240+
assert.strictEqual(span.name, 'GET');
241241
assert.strictEqual(result.reqHeaders['x-foo'], 'foo');
242242
assert.strictEqual(
243243
span.attributes[SemanticAttributes.HTTP_FLAVOR],
@@ -268,7 +268,7 @@ describe('HttpsInstrumentation Integration tests', () => {
268268
};
269269

270270
assert.strictEqual(spans.length, 2);
271-
assert.strictEqual(span.name, 'HTTPS GET');
271+
assert.strictEqual(span.name, 'GET');
272272
assert.strictEqual(span.attributes['span kind'], SpanKind.CLIENT);
273273
assertSpan(span, SpanKind.CLIENT, validations);
274274
});
@@ -296,7 +296,7 @@ describe('HttpsInstrumentation Integration tests', () => {
296296
};
297297

298298
assert.strictEqual(spans.length, 2);
299-
assert.strictEqual(span.name, 'HTTPS GET');
299+
assert.strictEqual(span.name, 'GET');
300300
assertSpan(span, SpanKind.CLIENT, validations);
301301
});
302302
for (const headers of [
@@ -351,7 +351,7 @@ describe('HttpsInstrumentation Integration tests', () => {
351351
const span = spans.find(s => s.kind === SpanKind.CLIENT);
352352
assert.ok(span);
353353
assert.strictEqual(spans.length, 2);
354-
assert.strictEqual(span.name, 'HTTPS GET');
354+
assert.strictEqual(span.name, 'GET');
355355
assert.ok(data);
356356
assert.ok(validations.reqHeaders[DummyPropagation.TRACE_CONTEXT_KEY]);
357357
assert.ok(validations.reqHeaders[DummyPropagation.SPAN_CONTEXT_KEY]);

experimental/packages/opentelemetry-instrumentation-http/test/utils/assertSpan.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,7 @@ export const assertSpan = (
4949
assert.strictEqual(span.spanContext().traceId.length, 32);
5050
assert.strictEqual(span.spanContext().spanId.length, 16);
5151
assert.strictEqual(span.kind, kind);
52-
assert.strictEqual(
53-
span.name,
54-
`${validations.component.toUpperCase()} ${validations.httpMethod}`
55-
);
52+
assert.strictEqual(span.name, validations.httpMethod);
5653
assert.strictEqual(
5754
span.attributes[AttributeNames.HTTP_ERROR_MESSAGE],
5855
span.status.message

0 commit comments

Comments
 (0)