Skip to content

Commit 78a917d

Browse files
authored
Promote ComponentLoader to new opentelemetry-api-util, standardize SPI loading (#7446)
1 parent 4821c37 commit 78a917d

File tree

63 files changed

+444
-196
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+444
-196
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ The OpenTelemetry API for recording telemetry.
7171
| [API](./api/all) | OpenTelemetry API, including metrics, traces, baggage, context | `opentelemetry-api` | <!--VERSION_STABLE-->1.51.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-api.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api) |
7272
| [API Incubator](./api/incubator) | API incubator, including pass through propagator, and extended tracer, and Event API | `opentelemetry-api-incubator` | <!--VERSION_UNSTABLE-->1.51.0-alpha<!--/VERSION_UNSTABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-api-incubator.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api-incubator) |
7373
| [Context API](./context) | OpenTelemetry context API | `opentelemetry-context` | <!--VERSION_STABLE-->1.51.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-context.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context) |
74+
| [Common](./common) | Common utility methods used across API components | `opentelemetry-common` | TODO: add after first publish | TODO: add link after first publish |
7475
</details>
7576

7677
<details>

all/src/test/java/io/opentelemetry/all/SdkDesignTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class SdkDesignTest {
2828
* Ensures that all SDK methods that: - are defined in classes that extend or implement API model
2929
* and are public (to exclude protected builders) - are public (avoids issues with protected
3030
* methods returning classes unavailable to test's CL) - override or implement parent method
31-
* return only API, Context or generic Java type.
31+
* return only API, Context, Common, or generic Java type.
3232
*/
3333
@Test
3434
void sdkImplementationOfApiClassesShouldReturnApiTypeOnly() {
@@ -45,7 +45,11 @@ void sdkImplementationOfApiClassesShouldReturnApiTypeOnly() {
4545
.and(implementOrOverride())
4646
.should()
4747
.haveRawReturnType(
48-
inPackage("io.opentelemetry.api..", "io.opentelemetry.context..", "java.."))
48+
inPackage(
49+
"io.opentelemetry.api..",
50+
"io.opentelemetry.context..",
51+
"io.opentelemetry.common..",
52+
"java.."))
4953
.orShould()
5054
.haveRawReturnType("void");
5155

api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigProperties.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static io.opentelemetry.api.internal.ConfigUtil.defaultIfNull;
99

10+
import io.opentelemetry.common.ComponentLoader;
1011
import java.util.List;
1112
import java.util.Map;
1213
import java.util.Set;
@@ -228,4 +229,7 @@ default List<DeclarativeConfigProperties> getStructuredList(
228229
* @return the configuration property keys
229230
*/
230231
Set<String> getPropertyKeys();
232+
233+
/** Return a {@link ComponentLoader} that should be used to load SPIs. */
234+
ComponentLoader getComponentLoader();
231235
}

api/incubator/src/main/java/io/opentelemetry/api/incubator/config/EmptyDeclarativeConfigProperties.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.api.incubator.config;
77

8+
import io.opentelemetry.common.ComponentLoader;
89
import java.util.Collections;
910
import java.util.List;
1011
import java.util.Set;
@@ -15,6 +16,8 @@ final class EmptyDeclarativeConfigProperties implements DeclarativeConfigPropert
1516

1617
private static final EmptyDeclarativeConfigProperties INSTANCE =
1718
new EmptyDeclarativeConfigProperties();
19+
private static final ComponentLoader COMPONENT_LOADER =
20+
ComponentLoader.forClassLoader(EmptyDeclarativeConfigProperties.class.getClassLoader());
1821

1922
private EmptyDeclarativeConfigProperties() {}
2023

@@ -74,4 +77,9 @@ public List<DeclarativeConfigProperties> getStructuredList(String name) {
7477
public Set<String> getPropertyKeys() {
7578
return Collections.emptySet();
7679
}
80+
81+
@Override
82+
public ComponentLoader getComponentLoader() {
83+
return COMPONENT_LOADER;
84+
}
7785
}

common/build.gradle.kts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugins {
2+
id("otel.java-conventions")
3+
id("otel.publish-conventions")
4+
5+
id("otel.animalsniffer-conventions")
6+
}
7+
8+
description = "OpenTelemetry API Common"
9+
otelJava.moduleName.set("io.opentelemetry.common")
10+
11+
dependencies {
12+
}
Lines changed: 28 additions & 0 deletions
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.common;
7+
8+
import java.util.ServiceLoader;
9+
10+
/** A loader for components that are discovered via SPI. */
11+
public interface ComponentLoader {
12+
/**
13+
* Load implementations of an SPI.
14+
*
15+
* @param spiClass the SPI class
16+
* @param <T> the SPI type
17+
* @return iterable of SPI implementations
18+
*/
19+
<T> Iterable<T> load(Class<T> spiClass);
20+
21+
/**
22+
* Create an instance for the {@code classLoader} using {@link ServiceLoader#load(Class,
23+
* ClassLoader)}.
24+
*/
25+
static ComponentLoader forClassLoader(ClassLoader classLoader) {
26+
return new ServiceLoaderComponentLoader(classLoader);
27+
}
28+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.common;
7+
8+
import java.util.ServiceLoader;
9+
10+
class ServiceLoaderComponentLoader implements ComponentLoader {
11+
12+
private final ClassLoader classLoader;
13+
14+
ServiceLoaderComponentLoader(ClassLoader classLoader) {
15+
this.classLoader = classLoader;
16+
}
17+
18+
@Override
19+
public <T> Iterable<T> load(Class<T> spiClass) {
20+
return ServiceLoader.load(spiClass, classLoader);
21+
}
22+
23+
@Override
24+
public String toString() {
25+
return "ServiceLoaderComponentLoader{classLoader=" + classLoader + "}";
26+
}
27+
}

context/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ description = "OpenTelemetry Context (Incubator)"
1010
otelJava.moduleName.set("io.opentelemetry.context")
1111

1212
dependencies {
13+
api(project(":common"))
1314
// MustBeClosed
1415
compileOnly("com.google.errorprone:error_prone_annotations")
1516

context/src/main/java/io/opentelemetry/context/LazyStorage.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737

3838
package io.opentelemetry.context;
3939

40+
import io.opentelemetry.common.ComponentLoader;
4041
import java.util.ArrayList;
4142
import java.util.List;
42-
import java.util.ServiceLoader;
4343
import java.util.concurrent.atomic.AtomicReference;
4444
import java.util.function.Function;
4545
import java.util.logging.Level;
@@ -103,9 +103,10 @@ static ContextStorage createStorage(AtomicReference<Throwable> deferredStorageFa
103103
return ContextStorage.defaultStorage();
104104
}
105105

106+
ComponentLoader componentLoader =
107+
ComponentLoader.forClassLoader(LazyStorage.class.getClassLoader());
106108
List<ContextStorageProvider> providers = new ArrayList<>();
107-
for (ContextStorageProvider provider :
108-
ServiceLoader.load(ContextStorageProvider.class, LazyStorage.class.getClassLoader())) {
109+
for (ContextStorageProvider provider : componentLoader.load(ContextStorageProvider.class)) {
109110
if (provider
110111
.getClass()
111112
.getName()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Comparing source compatibility of opentelemetry-common-1.52.0-SNAPSHOT.jar against
2+
+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.common.ComponentLoader (not serializable)
3+
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
4+
+++ NEW SUPERCLASS: java.lang.Object
5+
+++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.common.ComponentLoader forClassLoader(java.lang.ClassLoader)
6+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.Iterable<T> load(java.lang.Class<T>)
7+
GENERIC TEMPLATES: +++ T:java.lang.Object

0 commit comments

Comments
 (0)