Skip to content

Commit 7d070db

Browse files
authored
fix(gql)!: conform GraphQL span name to spec (open-telemetry#1444)
1 parent 9268716 commit 7d070db

File tree

2 files changed

+24
-21
lines changed

2 files changed

+24
-21
lines changed

plugins/node/opentelemetry-instrumentation-graphql/src/instrumentation.ts

+13-10
Original file line numberDiff line numberDiff line change
@@ -404,18 +404,21 @@ export class GraphQLInstrumentation extends InstrumentationBase {
404404

405405
const span = this.tracer.startSpan(SpanNames.EXECUTE, {});
406406
if (operation) {
407-
const operationDefinition =
407+
const { operation: operationType, name: nameNode } =
408408
operation as graphqlTypes.OperationDefinitionNode;
409-
span.setAttribute(
410-
AttributeNames.OPERATION_TYPE,
411-
operationDefinition.operation
412-
);
413409

414-
if (operationDefinition.name) {
415-
span.setAttribute(
416-
AttributeNames.OPERATION_NAME,
417-
operationDefinition.name.value
418-
);
410+
span.setAttribute(AttributeNames.OPERATION_TYPE, operationType);
411+
412+
const operationName = nameNode?.value;
413+
414+
// https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/instrumentation/graphql/
415+
// > The span name MUST be of the format <graphql.operation.type> <graphql.operation.name> provided that graphql.operation.type and graphql.operation.name are available.
416+
// > If graphql.operation.name is not available, the span SHOULD be named <graphql.operation.type>.
417+
if (operationName) {
418+
span.setAttribute(AttributeNames.OPERATION_NAME, operationName);
419+
span.updateName(`${operationType} ${operationName}`);
420+
} else {
421+
span.updateName(operationType);
419422
}
420423
} else {
421424
let operationName = ' ';

plugins/node/opentelemetry-instrumentation-graphql/test/graphql.test.ts

+11-11
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ describe('graphql', () => {
169169
executeSpan.attributes[AttributeNames.OPERATION_NAME],
170170
undefined
171171
);
172-
assert.deepStrictEqual(executeSpan.name, SpanNames.EXECUTE);
172+
assert.deepStrictEqual(executeSpan.name, 'query');
173173
assert.deepStrictEqual(executeSpan.parentSpanId, undefined);
174174
});
175175

@@ -297,7 +297,7 @@ describe('graphql', () => {
297297
executeSpan.attributes[AttributeNames.OPERATION_NAME],
298298
undefined
299299
);
300-
assert.deepStrictEqual(executeSpan.name, SpanNames.EXECUTE);
300+
assert.deepStrictEqual(executeSpan.name, 'query');
301301
assert.deepStrictEqual(executeSpan.parentSpanId, undefined);
302302
});
303303

@@ -395,7 +395,7 @@ describe('graphql', () => {
395395
executeSpan.attributes[`${AttributeNames.VARIABLES}id`],
396396
undefined
397397
);
398-
assert.deepStrictEqual(executeSpan.name, SpanNames.EXECUTE);
398+
assert.deepStrictEqual(executeSpan.name, 'query Query1');
399399
assert.deepStrictEqual(executeSpan.parentSpanId, undefined);
400400
});
401401

@@ -487,7 +487,7 @@ describe('graphql', () => {
487487
executeSpan.attributes[AttributeNames.OPERATION_NAME],
488488
undefined
489489
);
490-
assert.deepStrictEqual(executeSpan.name, SpanNames.EXECUTE);
490+
assert.deepStrictEqual(executeSpan.name, 'query');
491491
assert.deepStrictEqual(executeSpan.parentSpanId, undefined);
492492
});
493493
});
@@ -555,7 +555,7 @@ describe('graphql', () => {
555555
executeSpan.attributes[AttributeNames.OPERATION_NAME],
556556
undefined
557557
);
558-
assert.deepStrictEqual(executeSpan.name, SpanNames.EXECUTE);
558+
assert.deepStrictEqual(executeSpan.name, 'query');
559559
assert.deepStrictEqual(executeSpan.parentSpanId, undefined);
560560
});
561561
});
@@ -752,7 +752,7 @@ describe('graphql', () => {
752752
executeSpan.attributes[AttributeNames.OPERATION_NAME],
753753
undefined
754754
);
755-
assert.deepStrictEqual(executeSpan.name, SpanNames.EXECUTE);
755+
assert.deepStrictEqual(executeSpan.name, 'query');
756756
assert.deepStrictEqual(executeSpan.parentSpanId, undefined);
757757
});
758758

@@ -848,7 +848,7 @@ describe('graphql', () => {
848848
executeSpan.attributes[AttributeNames.OPERATION_NAME],
849849
'AddBook'
850850
);
851-
assert.deepStrictEqual(executeSpan.name, SpanNames.EXECUTE);
851+
assert.deepStrictEqual(executeSpan.name, 'mutation AddBook');
852852
assert.deepStrictEqual(executeSpan.parentSpanId, undefined);
853853
});
854854

@@ -946,7 +946,7 @@ describe('graphql', () => {
946946
executeSpan.attributes[`${AttributeNames.VARIABLES}id`],
947947
2
948948
);
949-
assert.deepStrictEqual(executeSpan.name, SpanNames.EXECUTE);
949+
assert.deepStrictEqual(executeSpan.name, 'query Query1');
950950
assert.deepStrictEqual(executeSpan.parentSpanId, undefined);
951951
});
952952

@@ -1044,7 +1044,7 @@ describe('graphql', () => {
10441044
executeSpan.attributes[AttributeNames.OPERATION_NAME],
10451045
'AddBook'
10461046
);
1047-
assert.deepStrictEqual(executeSpan.name, SpanNames.EXECUTE);
1047+
assert.deepStrictEqual(executeSpan.name, 'mutation AddBook');
10481048
assert.deepStrictEqual(executeSpan.parentSpanId, undefined);
10491049
});
10501050

@@ -1317,7 +1317,7 @@ describe('graphql', () => {
13171317

13181318
// validate execute span is present
13191319
const spans = exporter.getFinishedSpans();
1320-
const executeSpans = spans.filter(s => s.name === SpanNames.EXECUTE);
1320+
const executeSpans = spans.filter(s => s.name === 'query');
13211321
assert.deepStrictEqual(executeSpans.length, 1);
13221322
const [executeSpan] = executeSpans;
13231323
assert.deepStrictEqual(
@@ -1371,7 +1371,7 @@ describe('graphql', () => {
13711371
);
13721372

13731373
// single execute span
1374-
const executeSpans = spans.filter(s => s.name === SpanNames.EXECUTE);
1374+
const executeSpans = spans.filter(s => s.name === 'query');
13751375
assert.deepStrictEqual(executeSpans.length, 1);
13761376
});
13771377
});

0 commit comments

Comments
 (0)