Skip to content

Commit af2fb23

Browse files
AlchemyDingtrask
andauthored
stabilise spanNames (#12487)
Co-authored-by: Trask Stalnaker <[email protected]>
1 parent ec26d54 commit af2fb23

File tree

15 files changed

+100
-30
lines changed

15 files changed

+100
-30
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
## Unreleased
44

5+
### Migration notes
6+
7+
- `io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames` has been deprecated,
8+
replaced by the stable `io.opentelemetry.instrumentation.api.semconv.util.SpanNames`
9+
510
## Version 2.12.0 (2025-01-17)
611

712
### Migration notes
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
Comparing source compatibility of opentelemetry-instrumentation-api-2.13.0-SNAPSHOT.jar against opentelemetry-instrumentation-api-2.12.0.jar
2-
No changes.
2+
+++ NEW CLASS: PUBLIC(+) FINAL(+) io.opentelemetry.instrumentation.api.semconv.util.SpanNames (not serializable)
3+
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
4+
+++ NEW SUPERCLASS: java.lang.Object
5+
+++ NEW METHOD: PUBLIC(+) STATIC(+) java.lang.String fromMethod(java.lang.reflect.Method)
6+
+++ NEW METHOD: PUBLIC(+) STATIC(+) java.lang.String fromMethod(java.lang.Class<?>, java.lang.String)

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/util/SpanNames.java

+8-19
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,30 @@
55

66
package io.opentelemetry.instrumentation.api.incubator.semconv.util;
77

8-
import io.opentelemetry.instrumentation.api.internal.ClassNames;
9-
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
108
import java.lang.reflect.Method;
11-
import java.util.Map;
12-
import java.util.concurrent.ConcurrentHashMap;
139

10+
/**
11+
* This class has been stabilized and moved to {@link
12+
* io.opentelemetry.instrumentation.api.semconv.util.SpanNames}
13+
*/
14+
@Deprecated
1415
public final class SpanNames {
1516

16-
private static final Cache<Class<?>, Map<String, String>> spanNameCaches = Cache.weak();
17-
1817
/**
1918
* This method is used to generate a span name based on a method. Anonymous classes are named
2019
* based on their parent.
2120
*/
2221
public static String fromMethod(Method method) {
23-
return fromMethod(method.getDeclaringClass(), method.getName());
22+
return io.opentelemetry.instrumentation.api.semconv.util.SpanNames.fromMethod(method);
2423
}
2524

2625
/**
2726
* This method is used to generate a span name based on a method. Anonymous classes are named
2827
* based on their parent.
2928
*/
3029
public static String fromMethod(Class<?> clazz, String methodName) {
31-
// the cache (ConcurrentHashMap) is naturally bounded by the number of methods in a class
32-
Map<String, String> spanNameCache =
33-
spanNameCaches.computeIfAbsent(clazz, c -> new ConcurrentHashMap<>());
34-
35-
// not using computeIfAbsent, because it would require a capturing (allocating) lambda
36-
String spanName = spanNameCache.get(methodName);
37-
if (spanName != null) {
38-
return spanName;
39-
}
40-
spanName = ClassNames.simpleName(clazz) + "." + methodName;
41-
spanNameCache.put(methodName, spanName);
42-
return spanName;
30+
return io.opentelemetry.instrumentation.api.semconv.util.SpanNames.fromMethod(
31+
clazz, methodName);
4332
}
4433

4534
private SpanNames() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.semconv.util;
7+
8+
import io.opentelemetry.instrumentation.api.internal.ClassNames;
9+
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
10+
import java.lang.reflect.Method;
11+
import java.util.Map;
12+
import java.util.concurrent.ConcurrentHashMap;
13+
14+
/** A utility class used to generate span names. */
15+
public final class SpanNames {
16+
17+
private static final Cache<Class<?>, Map<String, String>> spanNameCaches = Cache.weak();
18+
19+
/**
20+
* This method is used to generate a span name based on a method. Anonymous classes are named
21+
* based on their parent.
22+
*/
23+
public static String fromMethod(Method method) {
24+
return fromMethod(method.getDeclaringClass(), method.getName());
25+
}
26+
27+
/**
28+
* This method is used to generate a span name based on a method. Anonymous classes are named
29+
* based on their parent.
30+
*/
31+
public static String fromMethod(Class<?> clazz, String methodName) {
32+
// the cache (ConcurrentHashMap) is naturally bounded by the number of methods in a class
33+
Map<String, String> spanNameCache =
34+
spanNameCaches.computeIfAbsent(clazz, c -> new ConcurrentHashMap<>());
35+
36+
// not using computeIfAbsent, because it would require a capturing (allocating) lambda
37+
String spanName = spanNameCache.get(methodName);
38+
if (spanName != null) {
39+
return spanName;
40+
}
41+
spanName = ClassNames.simpleName(clazz) + "." + methodName;
42+
spanNameCache.put(methodName, spanName);
43+
return spanName;
44+
}
45+
46+
private SpanNames() {}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.semconv.util;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import java.lang.reflect.Method;
11+
import org.junit.jupiter.api.Test;
12+
13+
class SpanNamesTest {
14+
@Test
15+
void testFromMethod() throws NoSuchMethodException {
16+
Method method = TestClass.class.getMethod("test");
17+
assertThat(SpanNames.fromMethod(method)).isEqualTo("TestClass.test");
18+
}
19+
20+
static class TestClass {
21+
private TestClass() {}
22+
23+
public void test() {}
24+
}
25+
}

instrumentation/grails-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grails/HandlerData.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package io.opentelemetry.javaagent.instrumentation.grails;
77

8-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
8+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
99

1010
public class HandlerData {
1111

instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/AnnotationSingletons.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import io.opentelemetry.api.GlobalOpenTelemetry;
99
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor;
10-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
1110
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
11+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
1212

1313
public final class AnnotationSingletons {
1414

instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanSingletons.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import io.opentelemetry.api.trace.SpanKind;
1212
import io.opentelemetry.instrumentation.api.annotation.support.MethodSpanAttributesExtractor;
1313
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor;
14-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
1514
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
15+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
1616
import java.lang.reflect.Method;
1717
import java.util.logging.Logger;
1818

instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationSingletons.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
import io.opentelemetry.instrumentation.api.annotation.support.MethodSpanAttributesExtractor;
1414
import io.opentelemetry.instrumentation.api.annotation.support.SpanAttributesExtractor;
1515
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor;
16-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
1716
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
17+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
1818
import java.lang.reflect.Method;
1919
import java.util.logging.Logger;
2020

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/JoinPointRequest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import io.opentelemetry.api.trace.SpanKind;
99
import io.opentelemetry.instrumentation.annotations.WithSpan;
10-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
10+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
1111
import java.lang.reflect.Method;
1212
import org.aspectj.lang.JoinPoint;
1313
import org.aspectj.lang.reflect.MethodSignature;

instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSpanNameExtractor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server;
77

88
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor;
9-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
109
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
10+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
1111
import org.springframework.web.method.HandlerMethod;
1212

1313
public class WebfluxSpanNameExtractor implements SpanNameExtractor<Object> {

instrumentation/twilio-6.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/twilio/TwilioSingletons.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient;
99

1010
import io.opentelemetry.api.GlobalOpenTelemetry;
11-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
1211
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1312
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
13+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
1414
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
1515

1616
public final class TwilioSingletons {

instrumentation/vaadin-14.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vaadin/VaadinHandlerRequest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
package io.opentelemetry.javaagent.instrumentation.vaadin;
77

88
import com.google.auto.value.AutoValue;
9-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
9+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
1010

1111
@AutoValue
1212
public abstract class VaadinHandlerRequest {

instrumentation/vaadin-14.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vaadin/VaadinServiceRequest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
package io.opentelemetry.javaagent.instrumentation.vaadin;
77

88
import com.google.auto.value.AutoValue;
9-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
9+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
1010

1111
@AutoValue
1212
public abstract class VaadinServiceRequest {

instrumentation/vaadin-14.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vaadin/VaadinSingletons.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import io.opentelemetry.context.ContextKey;
1111
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor;
1212
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor;
13-
import io.opentelemetry.instrumentation.api.incubator.semconv.util.SpanNames;
1413
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
14+
import io.opentelemetry.instrumentation.api.semconv.util.SpanNames;
1515
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
1616

1717
public class VaadinSingletons {

0 commit comments

Comments
 (0)