Skip to content

Commit f89edd9

Browse files
committed
wip: fix for solving class loader error in compressionutil api.
1 parent cc2844d commit f89edd9

File tree

8 files changed

+52
-13
lines changed

8 files changed

+52
-13
lines changed

exporters/common/src/main/java/io/opentelemetry/exporter/internal/compression/CompressorUtil.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
*/
2525
public final class CompressorUtil {
2626

27-
private static final Map<String, Compressor> compressorRegistry = buildCompressorRegistry();
27+
private static final Map<String, Compressor> compressorRegistry =
28+
buildCompressorRegistry(CompressorUtil.class.getClassLoader());
2829

2930
private CompressorUtil() {}
3031

@@ -36,19 +37,36 @@ private CompressorUtil() {}
3637
*/
3738
@Nullable
3839
public static Compressor validateAndResolveCompressor(String compressionMethod) {
39-
Set<String> supportedEncodings = compressorRegistry.keySet();
40-
Compressor compressor = compressorRegistry.get(compressionMethod);
40+
return validateAndResolveCompressor(compressionMethod, null);
41+
}
42+
43+
/**
44+
* Validate that the {@code compressionMethod} is "none" or matches a registered compressor.
45+
*
46+
* @param compressionMethod the compression method to validate and resolve
47+
* @param classLoader the class loader to use for loading SPI implementations, or null to use the
48+
* default
49+
* @return {@code null} if {@code compressionMethod} is "none" or the registered compressor
50+
* @throws IllegalArgumentException if no match is found
51+
*/
52+
@Nullable
53+
public static Compressor validateAndResolveCompressor(
54+
String compressionMethod, @Nullable ClassLoader classLoader) {
55+
Map<String, Compressor> registry =
56+
classLoader == null ? compressorRegistry : buildCompressorRegistry(classLoader);
57+
58+
Set<String> supportedEncodings = registry.keySet();
59+
Compressor compressor = registry.get(compressionMethod);
4160
checkArgument(
4261
"none".equals(compressionMethod) || compressor != null,
4362
"Unsupported compressionMethod. Compression method must be \"none\" or one of: "
4463
+ supportedEncodings.stream().collect(joining(",", "[", "]")));
4564
return compressor;
4665
}
4766

48-
private static Map<String, Compressor> buildCompressorRegistry() {
67+
private static Map<String, Compressor> buildCompressorRegistry(ClassLoader classLoader) {
4968
Map<String, Compressor> compressors = new HashMap<>();
50-
for (CompressorProvider spi :
51-
ServiceLoader.load(CompressorProvider.class, CompressorUtil.class.getClassLoader())) {
69+
for (CompressorProvider spi : ServiceLoader.load(CompressorProvider.class, classLoader)) {
5270
Compressor compressor = spi.getInstance();
5371
compressors.put(compressor.getEncoding(), compressor);
5472
}

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public final class OtlpHttpLogRecordExporterBuilder {
4242

4343
private final HttpExporterBuilder<Marshaler> delegate;
4444
private MemoryMode memoryMode;
45+
private ClassLoader serviceClassLoader = OtlpHttpLogRecordExporterBuilder.class.getClassLoader();
4546

4647
OtlpHttpLogRecordExporterBuilder(HttpExporterBuilder<Marshaler> delegate, MemoryMode memoryMode) {
4748
this.delegate = delegate;
@@ -117,7 +118,8 @@ public OtlpHttpLogRecordExporterBuilder setEndpoint(String endpoint) {
117118
*/
118119
public OtlpHttpLogRecordExporterBuilder setCompression(String compressionMethod) {
119120
requireNonNull(compressionMethod, "compressionMethod");
120-
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
121+
Compressor compressor =
122+
CompressorUtil.validateAndResolveCompressor(compressionMethod, serviceClassLoader);
121123
delegate.setCompression(compressor);
122124
return this;
123125
}
@@ -251,6 +253,7 @@ public OtlpHttpLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) {
251253
*/
252254
public OtlpHttpLogRecordExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
253255
requireNonNull(serviceClassLoader, "serviceClassLoader");
256+
this.serviceClassLoader = serviceClassLoader;
254257
delegate.setServiceClassLoader(serviceClassLoader);
255258
return this;
256259
}

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public final class OtlpHttpMetricExporterBuilder {
5454
private AggregationTemporalitySelector aggregationTemporalitySelector;
5555
private DefaultAggregationSelector defaultAggregationSelector;
5656
private MemoryMode memoryMode;
57+
private ClassLoader serviceClassLoader = OtlpHttpMetricExporterBuilder.class.getClassLoader();
5758

5859
OtlpHttpMetricExporterBuilder(
5960
HttpExporterBuilder<Marshaler> delegate,
@@ -137,7 +138,8 @@ public OtlpHttpMetricExporterBuilder setEndpoint(String endpoint) {
137138
*/
138139
public OtlpHttpMetricExporterBuilder setCompression(String compressionMethod) {
139140
requireNonNull(compressionMethod, "compressionMethod");
140-
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
141+
Compressor compressor =
142+
CompressorUtil.validateAndResolveCompressor(compressionMethod, serviceClassLoader);
141143
delegate.setCompression(compressor);
142144
return this;
143145
}
@@ -310,6 +312,7 @@ public OtlpHttpMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) {
310312
*/
311313
public OtlpHttpMetricExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
312314
requireNonNull(serviceClassLoader, "serviceClassLoader");
315+
this.serviceClassLoader = serviceClassLoader;
313316
delegate.setServiceClassLoader(serviceClassLoader);
314317
return this;
315318
}

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public final class OtlpHttpSpanExporterBuilder {
4242

4343
private final HttpExporterBuilder<Marshaler> delegate;
4444
private MemoryMode memoryMode;
45+
private ClassLoader serviceClassLoader = OtlpHttpSpanExporterBuilder.class.getClassLoader();
4546

4647
OtlpHttpSpanExporterBuilder(HttpExporterBuilder<Marshaler> delegate, MemoryMode memoryMode) {
4748
this.delegate = delegate;
@@ -117,7 +118,8 @@ public OtlpHttpSpanExporterBuilder setEndpoint(String endpoint) {
117118
*/
118119
public OtlpHttpSpanExporterBuilder setCompression(String compressionMethod) {
119120
requireNonNull(compressionMethod, "compressionMethod");
120-
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
121+
Compressor compressor =
122+
CompressorUtil.validateAndResolveCompressor(compressionMethod, serviceClassLoader);
121123
delegate.setCompression(compressor);
122124
return this;
123125
}
@@ -252,6 +254,7 @@ public OtlpHttpSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) {
252254
*/
253255
public OtlpHttpSpanExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
254256
requireNonNull(serviceClassLoader, "serviceClassLoader");
257+
this.serviceClassLoader = serviceClassLoader;
255258
delegate.setServiceClassLoader(serviceClassLoader);
256259
return this;
257260
}

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public final class OtlpGrpcLogRecordExporterBuilder {
5151
// Visible for testing
5252
final GrpcExporterBuilder<Marshaler> delegate;
5353
private MemoryMode memoryMode;
54+
private ClassLoader serviceClassLoader = OtlpGrpcLogRecordExporterBuilder.class.getClassLoader();
5455

5556
OtlpGrpcLogRecordExporterBuilder(GrpcExporterBuilder<Marshaler> delegate, MemoryMode memoryMode) {
5657
this.delegate = delegate;
@@ -150,7 +151,8 @@ public OtlpGrpcLogRecordExporterBuilder setEndpoint(String endpoint) {
150151
*/
151152
public OtlpGrpcLogRecordExporterBuilder setCompression(String compressionMethod) {
152153
requireNonNull(compressionMethod, "compressionMethod");
153-
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
154+
Compressor compressor =
155+
CompressorUtil.validateAndResolveCompressor(compressionMethod, serviceClassLoader);
154156
delegate.setCompression(compressor);
155157
return this;
156158
}
@@ -280,6 +282,7 @@ public OtlpGrpcLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) {
280282
*/
281283
public OtlpGrpcLogRecordExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
282284
requireNonNull(serviceClassLoader, "serviceClassLoader");
285+
this.serviceClassLoader = serviceClassLoader;
283286
delegate.setServiceClassLoader(serviceClassLoader);
284287
return this;
285288
}

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public final class OtlpGrpcMetricExporterBuilder {
6262
private AggregationTemporalitySelector aggregationTemporalitySelector;
6363
private DefaultAggregationSelector defaultAggregationSelector;
6464
private MemoryMode memoryMode;
65+
private ClassLoader serviceClassLoader = OtlpGrpcMetricExporterBuilder.class.getClassLoader();
6566

6667
OtlpGrpcMetricExporterBuilder(
6768
GrpcExporterBuilder<Marshaler> delegate,
@@ -169,7 +170,8 @@ public OtlpGrpcMetricExporterBuilder setEndpoint(String endpoint) {
169170
*/
170171
public OtlpGrpcMetricExporterBuilder setCompression(String compressionMethod) {
171172
requireNonNull(compressionMethod, "compressionMethod");
172-
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
173+
Compressor compressor =
174+
CompressorUtil.validateAndResolveCompressor(compressionMethod, serviceClassLoader);
173175
delegate.setCompression(compressor);
174176
return this;
175177
}
@@ -338,6 +340,7 @@ public OtlpGrpcMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) {
338340
*/
339341
public OtlpGrpcMetricExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
340342
requireNonNull(serviceClassLoader, "serviceClassLoader");
343+
this.serviceClassLoader = serviceClassLoader;
341344
delegate.setServiceClassLoader(serviceClassLoader);
342345
return this;
343346
}

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public final class OtlpGrpcSpanExporterBuilder {
4747
// Visible for testing
4848
final GrpcExporterBuilder<Marshaler> delegate;
4949
private MemoryMode memoryMode;
50+
private ClassLoader serviceClassLoader = OtlpGrpcSpanExporterBuilder.class.getClassLoader();
5051

5152
OtlpGrpcSpanExporterBuilder(GrpcExporterBuilder<Marshaler> delegate, MemoryMode memoryMode) {
5253
this.delegate = delegate;
@@ -146,7 +147,8 @@ public OtlpGrpcSpanExporterBuilder setEndpoint(String endpoint) {
146147
*/
147148
public OtlpGrpcSpanExporterBuilder setCompression(String compressionMethod) {
148149
requireNonNull(compressionMethod, "compressionMethod");
149-
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
150+
Compressor compressor =
151+
CompressorUtil.validateAndResolveCompressor(compressionMethod, serviceClassLoader);
150152
delegate.setCompression(compressor);
151153
return this;
152154
}
@@ -277,6 +279,7 @@ public OtlpGrpcSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) {
277279
*/
278280
public OtlpGrpcSpanExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
279281
requireNonNull(serviceClassLoader, "serviceClassLoader");
282+
this.serviceClassLoader = serviceClassLoader;
280283
delegate.setServiceClassLoader(serviceClassLoader);
281284
return this;
282285
}

exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public final class OtlpGrpcProfilesExporterBuilder {
4040
private static final String DEFAULT_ENDPOINT_URL = "http://localhost:4317";
4141
private static final URI DEFAULT_ENDPOINT = URI.create(DEFAULT_ENDPOINT_URL);
4242
private static final long DEFAULT_TIMEOUT_SECS = 10;
43+
private ClassLoader serviceClassLoader = OtlpGrpcProfilesExporterBuilder.class.getClassLoader();
4344

4445
// TODO maybe make more efficient by adding support for MEMORY_MODE
4546

@@ -139,7 +140,8 @@ public OtlpGrpcProfilesExporterBuilder setEndpoint(String endpoint) {
139140
*/
140141
public OtlpGrpcProfilesExporterBuilder setCompression(String compressionMethod) {
141142
requireNonNull(compressionMethod, "compressionMethod");
142-
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
143+
Compressor compressor =
144+
CompressorUtil.validateAndResolveCompressor(compressionMethod, serviceClassLoader);
143145
delegate.setCompression(compressor);
144146
return this;
145147
}
@@ -207,6 +209,7 @@ public OtlpGrpcProfilesExporterBuilder setRetryPolicy(@Nullable RetryPolicy retr
207209
/** Set the {@link ClassLoader} used to load the sender API. */
208210
public OtlpGrpcProfilesExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
209211
requireNonNull(serviceClassLoader, "serviceClassLoader");
212+
this.serviceClassLoader = serviceClassLoader;
210213
delegate.setServiceClassLoader(serviceClassLoader);
211214
return this;
212215
}

0 commit comments

Comments
 (0)