Skip to content

Commit 7ed6e43

Browse files
committed
Add support for spanNameExtractor
1 parent 891822a commit 7ed6e43

File tree

3 files changed

+50
-20
lines changed

3 files changed

+50
-20
lines changed

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
5656

5757
final OpenTelemetry openTelemetry;
5858
final String instrumentationName;
59-
final SpanNameExtractor<? super REQUEST> spanNameExtractor;
59+
SpanNameExtractor<? super REQUEST> spanNameExtractor;
6060

6161
final List<SpanLinksExtractor<? super REQUEST>> spanLinksExtractors = new ArrayList<>();
6262
final List<AttributesExtractor<? super REQUEST, ? super RESPONSE>> attributesExtractors =
@@ -316,6 +316,9 @@ private Instrumenter<REQUEST, RESPONSE> buildInstrumenter(
316316
if (customizer.getOperationMetrics() != null) {
317317
addOperationMetrics(customizer.getOperationMetrics());
318318
}
319+
if (customizer.getSpanNameExtractor() != null) {
320+
this.spanNameExtractor = customizer.getSpanNameExtractor();
321+
}
319322
}
320323
}
321324
this.spanKindExtractor = spanKindExtractor;

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumentationCustomizer.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
99
import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer;
1010
import io.opentelemetry.instrumentation.api.instrumenter.OperationMetrics;
11+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1112
import java.util.function.Predicate;
1213

1314
/**
@@ -50,7 +51,8 @@ default OperationMetrics getOperationMetrics() {
5051
* @param <RESPONSE> the type of response object used by the instrumented library
5152
* @return an attributes extractor instance, or null if not applicable
5253
*/
53-
default <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> getAttributesExtractor() {
54+
default <REQUEST, RESPONSE>
55+
AttributesExtractor<? super REQUEST, ? super RESPONSE> getAttributesExtractor() {
5456
return null;
5557
}
5658

@@ -61,7 +63,18 @@ default <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> getAttributes
6163
* @param <REQUEST> the type of request object used by the instrumented library
6264
* @return a context customizer instance, or null if not applicable
6365
*/
64-
default <REQUEST> ContextCustomizer<REQUEST> getContextCustomizer() {
66+
default <REQUEST> ContextCustomizer<? super REQUEST> getContextCustomizer() {
67+
return null;
68+
}
69+
70+
/**
71+
* Returns a new instance of a {@link SpanNameExtractor} that will customize the span name during
72+
* request processing.
73+
*
74+
* @param <REQUEST> the type of request object used by the instrumented library
75+
* @return a customized {@link SpanNameExtractor}, or null if not applicable
76+
*/
77+
default <REQUEST> SpanNameExtractor<? super REQUEST> getSpanNameExtractor() {
6578
return null;
6679
}
6780
}

instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/InstrumentationCustomizerTest.java

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1111
import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer;
1212
import io.opentelemetry.instrumentation.api.instrumenter.OperationMetrics;
13+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1314
import java.util.function.Predicate;
1415
import org.junit.jupiter.api.BeforeEach;
1516
import org.junit.jupiter.api.Test;
@@ -20,9 +21,10 @@
2021
@ExtendWith(MockitoExtension.class)
2122
class InstrumentationCustomizerTest {
2223

23-
@Mock private AttributesExtractor<Object, Object> attributesExtractor;
2424
@Mock private OperationMetrics operationMetrics;
25+
@Mock private AttributesExtractor<Object, Object> attributesExtractor;
2526
@Mock private ContextCustomizer<Object> contextCustomizer;
27+
@Mock private SpanNameExtractor<Object> spanNameExtractor;
2628

2729
private InstrumentationCustomizer customizer;
2830

@@ -31,32 +33,33 @@ class InstrumentationCustomizerTest {
3133
void setUp() {
3234
customizer =
3335
new InstrumentationCustomizer() {
34-
@Override
35-
public <REQUEST> ContextCustomizer<REQUEST> getContextCustomizer() {
36-
return (ContextCustomizer<REQUEST>) contextCustomizer;
37-
}
3836

3937
@Override
4038
public Predicate<String> instrumentationNamePredicate() {
4139
return name -> name.startsWith("test.instrumentation");
4240
}
4341

42+
@Override
43+
public OperationMetrics getOperationMetrics() {
44+
return operationMetrics;
45+
}
46+
4447
@Override
4548
public <REQUEST, RESPONSE>
46-
AttributesExtractor<REQUEST, RESPONSE> getAttributesExtractor() {
47-
return (AttributesExtractor<REQUEST, RESPONSE>) attributesExtractor;
49+
AttributesExtractor<? super REQUEST, ? super RESPONSE> getAttributesExtractor() {
50+
return (AttributesExtractor<? super REQUEST, ? super RESPONSE>) attributesExtractor;
4851
}
4952

5053
@Override
51-
public OperationMetrics getOperationMetrics() {
52-
return operationMetrics;
54+
public <REQUEST> ContextCustomizer<? super REQUEST> getContextCustomizer() {
55+
return (ContextCustomizer<? super REQUEST>) contextCustomizer;
5356
}
54-
};
55-
}
5657

57-
@Test
58-
void testGetContextCustomizer() {
59-
assertThat(customizer.getContextCustomizer()).isSameAs(contextCustomizer);
58+
@Override
59+
public <REQUEST> SpanNameExtractor<? super REQUEST> getSpanNameExtractor() {
60+
return (SpanNameExtractor<? super REQUEST>) spanNameExtractor;
61+
}
62+
};
6063
}
6164

6265
@Test
@@ -67,15 +70,26 @@ void testInstrumentationNamePredicate() {
6770
.isFalse();
6871
}
6972

73+
@Test
74+
void testGetOperationMetrics() {
75+
OperationMetrics metrics = customizer.getOperationMetrics();
76+
assertThat(metrics).isSameAs(operationMetrics);
77+
}
78+
7079
@Test
7180
void testGetAttributesExtractor() {
7281
AttributesExtractor<Object, Object> extractor = customizer.getAttributesExtractor();
7382
assertThat(extractor).isSameAs(attributesExtractor);
7483
}
7584

7685
@Test
77-
void testGetOperationMetrics() {
78-
OperationMetrics metrics = customizer.getOperationMetrics();
79-
assertThat(metrics).isSameAs(operationMetrics);
86+
void testGetContextCustomizer() {
87+
assertThat(customizer.getContextCustomizer()).isSameAs(contextCustomizer);
88+
}
89+
90+
@Test
91+
void testGetSpanNameExtractor() {
92+
SpanNameExtractor<Object> extractor = customizer.getSpanNameExtractor();
93+
assertThat(extractor).isSameAs(spanNameExtractor);
8094
}
8195
}

0 commit comments

Comments
 (0)