Skip to content

Commit 5e38413

Browse files
authored
Instrument extended open telemetry (#15178)
1 parent be7d07c commit 5e38413

File tree

15 files changed

+403
-16
lines changed

15 files changed

+403
-16
lines changed

.fossa.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,9 @@ targets:
829829
- type: gradle
830830
path: ./
831831
target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.52:javaagent'
832+
- type: gradle
833+
path: ./
834+
target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.56:javaagent'
832835
- type: gradle
833836
path: ./
834837
target: ':instrumentation:pekko:pekko-actor-1.0:javaagent'

instrumentation/opentelemetry-api/opentelemetry-api-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/ApplicationOpenTelemetry.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ public class ApplicationOpenTelemetry implements OpenTelemetry {
1919
public static final OpenTelemetry INSTANCE;
2020

2121
static {
22-
OpenTelemetry instance = getOpenTelemetry127();
22+
OpenTelemetry instance = getOpenTelemetry156();
23+
if (instance == null) {
24+
instance = getOpenTelemetry127();
25+
}
2326
if (instance == null) {
2427
instance = getOpenTelemetry110();
2528
}
@@ -52,26 +55,27 @@ public ContextPropagators getPropagators() {
5255
return applicationContextPropagators;
5356
}
5457

58+
@Nullable
59+
private static OpenTelemetry getOpenTelemetry156() {
60+
return getOpenTelemetry(
61+
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_56.incubator.ApplicationOpenTelemetry156Incubator");
62+
}
63+
5564
@Nullable
5665
private static OpenTelemetry getOpenTelemetry127() {
57-
try {
58-
// this class is defined in opentelemetry-api-1.27
59-
Class<?> clazz =
60-
Class.forName(
61-
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.ApplicationOpenTelemetry127");
62-
return (OpenTelemetry) clazz.getField("INSTANCE").get(null);
63-
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException exception) {
64-
return null;
65-
}
66+
return getOpenTelemetry(
67+
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.ApplicationOpenTelemetry127");
6668
}
6769

6870
@Nullable
6971
private static OpenTelemetry getOpenTelemetry110() {
72+
return getOpenTelemetry(
73+
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_10.ApplicationOpenTelemetry110");
74+
}
75+
76+
private static OpenTelemetry getOpenTelemetry(String className) {
7077
try {
71-
// this class is defined in opentelemetry-api-1.10
72-
Class<?> clazz =
73-
Class.forName(
74-
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_10.ApplicationOpenTelemetry110");
78+
Class<?> clazz = Class.forName(className);
7579
return (OpenTelemetry) clazz.getField("INSTANCE").get(null);
7680
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException exception) {
7781
return null;

instrumentation/opentelemetry-api/opentelemetry-api-1.27/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_27/ApplicationOpenTelemetry127.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_4.trace.ApplicationTracerProvider14;
2323
import java.lang.reflect.InvocationTargetException;
2424

25-
public final class ApplicationOpenTelemetry127 implements OpenTelemetry {
25+
public class ApplicationOpenTelemetry127 implements OpenTelemetry {
2626

2727
// Accessed with reflection
2828
@SuppressWarnings("unused")
@@ -34,7 +34,7 @@ public final class ApplicationOpenTelemetry127 implements OpenTelemetry {
3434
private final LoggerProvider applicationLoggerProvider;
3535

3636
@SuppressWarnings("UnnecessarilyFullyQualified")
37-
private ApplicationOpenTelemetry127() {
37+
protected ApplicationOpenTelemetry127() {
3838
io.opentelemetry.api.OpenTelemetry agentOpenTelemetry =
3939
io.opentelemetry.api.GlobalOpenTelemetry.get();
4040
applicationTracerProvider =
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
plugins {
2+
id("otel.javaagent-instrumentation")
3+
}
4+
5+
dependencies {
6+
compileOnly(project(":opentelemetry-api-shaded-for-instrumenting", configuration = "v1_56"))
7+
compileOnly("io.opentelemetry:opentelemetry-api-incubator")
8+
9+
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent"))
10+
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.27:javaagent"))
11+
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.40:javaagent"))
12+
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.42:javaagent"))
13+
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.47:javaagent"))
14+
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.50:javaagent"))
15+
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.52:javaagent"))
16+
17+
testImplementation("io.opentelemetry:opentelemetry-api-incubator")
18+
}
19+
20+
tasks.withType<Test>().configureEach {
21+
jvmArgs(
22+
"-Dotel.experimental.config.file=$projectDir/src/test/resources/declarative-config.yaml"
23+
)
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_56.incubator;
7+
8+
import application.io.opentelemetry.api.OpenTelemetry;
9+
import application.io.opentelemetry.api.incubator.ExtendedOpenTelemetry;
10+
import application.io.opentelemetry.api.incubator.config.ConfigProvider;
11+
import io.opentelemetry.api.GlobalOpenTelemetry;
12+
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.ApplicationOpenTelemetry127;
13+
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_56.incubator.config.ApplicationConfigProvider156Incubator;
14+
import javax.annotation.Nullable;
15+
16+
public final class ApplicationOpenTelemetry156Incubator extends ApplicationOpenTelemetry127
17+
implements ExtendedOpenTelemetry {
18+
19+
// Accessed with reflection
20+
@Nullable
21+
@SuppressWarnings("unused")
22+
public static final OpenTelemetry INSTANCE = create();
23+
24+
private final ConfigProvider configProvider;
25+
26+
@Nullable
27+
private static ApplicationOpenTelemetry156Incubator create() {
28+
io.opentelemetry.api.OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
29+
if (openTelemetry instanceof io.opentelemetry.api.incubator.ExtendedOpenTelemetry) {
30+
return new ApplicationOpenTelemetry156Incubator(
31+
((io.opentelemetry.api.incubator.ExtendedOpenTelemetry) openTelemetry)
32+
.getConfigProvider());
33+
}
34+
return null;
35+
}
36+
37+
public ApplicationOpenTelemetry156Incubator(
38+
io.opentelemetry.api.incubator.config.ConfigProvider configProvider) {
39+
this.configProvider = new ApplicationConfigProvider156Incubator(configProvider);
40+
}
41+
42+
@Override
43+
public ConfigProvider getConfigProvider() {
44+
return configProvider;
45+
}
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_56.incubator;
7+
8+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
9+
import static java.util.Collections.singletonList;
10+
11+
import com.google.auto.service.AutoService;
12+
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
13+
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
14+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
15+
import java.util.List;
16+
import net.bytebuddy.matcher.ElementMatcher;
17+
18+
@AutoService(InstrumentationModule.class)
19+
public class OpenTelemetryApiIncubatorInstrumentationModule extends InstrumentationModule
20+
implements ExperimentalInstrumentationModule {
21+
public OpenTelemetryApiIncubatorInstrumentationModule() {
22+
super("opentelemetry-api", "opentelemetry-api-1.56", "opentelemetry-api-incubator-1.56");
23+
}
24+
25+
@Override
26+
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
27+
return hasClassesNamed(
28+
"application.io.opentelemetry.api.common.Value",
29+
"application.io.opentelemetry.api.incubator.ExtendedOpenTelemetry");
30+
}
31+
32+
@Override
33+
public List<TypeInstrumentation> typeInstrumentations() {
34+
return singletonList(new OpenTelemetryIncubatorInstrumentation());
35+
}
36+
37+
@Override
38+
public String getModuleGroup() {
39+
return "opentelemetry-api-bridge";
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_56.incubator;
7+
8+
import static net.bytebuddy.matcher.ElementMatchers.named;
9+
import static net.bytebuddy.matcher.ElementMatchers.none;
10+
11+
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
12+
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
13+
import net.bytebuddy.asm.Advice;
14+
import net.bytebuddy.description.type.TypeDescription;
15+
import net.bytebuddy.matcher.ElementMatcher;
16+
17+
public class OpenTelemetryIncubatorInstrumentation implements TypeInstrumentation {
18+
19+
@Override
20+
public ElementMatcher<TypeDescription> typeMatcher() {
21+
return named("application.io.opentelemetry.api.GlobalOpenTelemetry");
22+
}
23+
24+
@Override
25+
public void transform(TypeTransformer transformer) {
26+
transformer.applyAdviceToMethod(
27+
none(), OpenTelemetryIncubatorInstrumentation.class.getName() + "$InitAdvice");
28+
}
29+
30+
@SuppressWarnings({"ReturnValueIgnored", "unused"})
31+
public static class InitAdvice {
32+
@Advice.OnMethodEnter
33+
public static void init() {
34+
// the sole purpose of this advice is to ensure that the classes are
35+
// recognized as helper class and injected into class loader
36+
ApplicationOpenTelemetry156Incubator.class.getName();
37+
}
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_56.incubator.config;
7+
8+
import application.io.opentelemetry.api.incubator.config.ConfigProvider;
9+
import application.io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
10+
import javax.annotation.Nullable;
11+
12+
public final class ApplicationConfigProvider156Incubator implements ConfigProvider {
13+
14+
private final DeclarativeConfigProperties declarativeConfigProperties;
15+
16+
public ApplicationConfigProvider156Incubator(
17+
io.opentelemetry.api.incubator.config.ConfigProvider configProvider) {
18+
this.declarativeConfigProperties =
19+
new ApplicationDeclarativeConfigProperties156Incubator(
20+
configProvider.getInstrumentationConfig());
21+
}
22+
23+
@Nullable
24+
@Override
25+
public DeclarativeConfigProperties getInstrumentationConfig() {
26+
return declarativeConfigProperties;
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_56.incubator.config;
7+
8+
import application.io.opentelemetry.api.incubator.config.DeclarativeConfigException;
9+
import application.io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
10+
import application.io.opentelemetry.common.ComponentLoader;
11+
import java.util.List;
12+
import java.util.Set;
13+
import java.util.stream.Collectors;
14+
import javax.annotation.Nullable;
15+
16+
public final class ApplicationDeclarativeConfigProperties156Incubator
17+
implements DeclarativeConfigProperties {
18+
private final io.opentelemetry.api.incubator.config.DeclarativeConfigProperties
19+
instrumentationConfig;
20+
21+
public ApplicationDeclarativeConfigProperties156Incubator(
22+
io.opentelemetry.api.incubator.config.DeclarativeConfigProperties instrumentationConfig) {
23+
this.instrumentationConfig = instrumentationConfig;
24+
}
25+
26+
@Nullable
27+
@Override
28+
public String getString(String name) {
29+
return instrumentationConfig.getString(name);
30+
}
31+
32+
@Override
33+
public String getString(String name, String defaultValue) {
34+
return instrumentationConfig.getString(name, defaultValue);
35+
}
36+
37+
@Nullable
38+
@Override
39+
public Boolean getBoolean(String name) {
40+
return instrumentationConfig.getBoolean(name);
41+
}
42+
43+
@Override
44+
public boolean getBoolean(String name, boolean defaultValue) {
45+
return instrumentationConfig.getBoolean(name, defaultValue);
46+
}
47+
48+
@Nullable
49+
@Override
50+
public Integer getInt(String name) {
51+
return instrumentationConfig.getInt(name);
52+
}
53+
54+
@Override
55+
public int getInt(String name, int defaultValue) {
56+
return instrumentationConfig.getInt(name, defaultValue);
57+
}
58+
59+
@Nullable
60+
@Override
61+
public Long getLong(String name) {
62+
return instrumentationConfig.getLong(name);
63+
}
64+
65+
@Override
66+
public long getLong(String name, long defaultValue) {
67+
return instrumentationConfig.getLong(name, defaultValue);
68+
}
69+
70+
@Nullable
71+
@Override
72+
public Double getDouble(String name) {
73+
return instrumentationConfig.getDouble(name);
74+
}
75+
76+
@Override
77+
public double getDouble(String name, double defaultValue) {
78+
return instrumentationConfig.getDouble(name, defaultValue);
79+
}
80+
81+
@Nullable
82+
@Override
83+
public <T> List<T> getScalarList(String name, Class<T> scalarType) {
84+
return instrumentationConfig.getScalarList(name, scalarType);
85+
}
86+
87+
@Override
88+
public <T> List<T> getScalarList(String name, Class<T> scalarType, List<T> defaultValue) {
89+
return instrumentationConfig.getScalarList(name, scalarType, defaultValue);
90+
}
91+
92+
@Nullable
93+
@Override
94+
public DeclarativeConfigProperties getStructured(String name) {
95+
return new ApplicationDeclarativeConfigProperties156Incubator(
96+
instrumentationConfig.getStructured(name));
97+
}
98+
99+
@Nullable
100+
@Override
101+
public List<DeclarativeConfigProperties> getStructuredList(String name) {
102+
List<io.opentelemetry.api.incubator.config.DeclarativeConfigProperties> structuredList =
103+
instrumentationConfig.getStructuredList(name);
104+
if (structuredList == null) {
105+
return null;
106+
}
107+
108+
return structuredList.stream()
109+
.map(e -> new ApplicationDeclarativeConfigProperties156Incubator(e))
110+
.collect(Collectors.toList());
111+
}
112+
113+
@Override
114+
public Set<String> getPropertyKeys() {
115+
return instrumentationConfig.getPropertyKeys();
116+
}
117+
118+
@Override
119+
public ComponentLoader getComponentLoader() {
120+
throw new DeclarativeConfigException(
121+
"getComponentLoader is not supported in application code. "
122+
+ "It is only used to set up the OpenTelemetry SDK in the agent.");
123+
}
124+
}

0 commit comments

Comments
 (0)