-
Notifications
You must be signed in to change notification settings - Fork 924
add ComponentLoader to support more auto configuration scenarios #6217
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
0531869
6d51896
2b9fb28
e1352d6
091b19b
eac57ca
ae2c633
2bec27f
ad4047f
5336d59
44df716
74322cd
5799589
3f574fb
6d06755
42d6e17
d03a67f
517d773
e97c4f9
4519a7e
22996e0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
…. spring boot
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,2 +1,13 @@ | ||
| Comparing source compatibility of against | ||
| No changes. | ||
| *** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder (not serializable) | ||
| === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 | ||
| +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder setComponentLoader(io.opentelemetry.sdk.autoconfigure.ComponentLoader) | ||
| +++* NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.autoconfigure.ComponentLoader (not serializable) | ||
| +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. | ||
| +++ NEW SUPERCLASS: java.lang.Object | ||
| +++* NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.Iterable<T> load(java.lang.Class<T>) | ||
| GENERIC TEMPLATES: +++ T:java.lang.Object | ||
| +++* NEW METHOD: PUBLIC(+) java.util.Map<java.lang.String,T> loadConfigurableProviders(java.lang.Class<T>) | ||
| GENERIC TEMPLATES: +++ T:io.opentelemetry.sdk.autoconfigure.spi.ConfigurableProvider | ||
| +++* NEW METHOD: PUBLIC(+) java.util.List<T> loadOrdered(java.lang.Class<T>) | ||
| GENERIC TEMPLATES: +++ T:io.opentelemetry.sdk.autoconfigure.spi.Ordered |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| /* | ||
| * Copyright The OpenTelemetry Authors | ||
| * SPDX-License-Identifier: Apache-2.0 | ||
| */ | ||
|
|
||
| package io.opentelemetry.sdk.autoconfigure.spi; | ||
|
|
||
| /** | ||
| * A named configurable provider. | ||
| * | ||
| * <p>It can be used to generically determine if a provider should be replaced by another provider | ||
| * with the same name. | ||
| */ | ||
| public interface ConfigurableProvider { | ||
| /** Returns the name of this provider. */ | ||
| String getName(); | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -368,6 +368,12 @@ public AutoConfiguredOpenTelemetrySdkBuilder setServiceClassLoader( | |
| return this; | ||
| } | ||
|
|
||
| public AutoConfiguredOpenTelemetrySdkBuilder setComponentLoader(ComponentLoader componentLoader) { | ||
zeitlinger marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
jack-berg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| requireNonNull(componentLoader, "componentLoader"); | ||
| this.spiHelper = SpiHelper.create(componentLoader); | ||
| return this; | ||
| } | ||
|
|
||
| /** | ||
| * Returns a new {@link AutoConfiguredOpenTelemetrySdk} holding components auto-configured using | ||
| * the settings of this {@link AutoConfiguredOpenTelemetrySdkBuilder}. | ||
|
|
@@ -403,41 +409,53 @@ public AutoConfiguredOpenTelemetrySdk build() { | |
| boolean sdkEnabled = !config.getBoolean("otel.sdk.disabled", false); | ||
|
|
||
| if (sdkEnabled) { | ||
| SdkMeterProviderBuilder meterProviderBuilder = SdkMeterProvider.builder(); | ||
| meterProviderBuilder.setResource(resource); | ||
| MeterProviderConfiguration.configureMeterProvider( | ||
| meterProviderBuilder, config, spiHelper, metricExporterCustomizer, closeables); | ||
| meterProviderBuilder = meterProviderCustomizer.apply(meterProviderBuilder, config); | ||
| SdkMeterProvider meterProvider = meterProviderBuilder.build(); | ||
| SdkMeterProvider meterProvider = | ||
| spiHelper.loadOptional(SdkMeterProvider.class).orElse(null); | ||
jack-berg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| if (meterProvider == null) { | ||
| SdkMeterProviderBuilder meterProviderBuilder = SdkMeterProvider.builder(); | ||
| meterProviderBuilder.setResource(resource); | ||
| MeterProviderConfiguration.configureMeterProvider( | ||
| meterProviderBuilder, config, spiHelper, metricExporterCustomizer, closeables); | ||
| meterProviderBuilder = meterProviderCustomizer.apply(meterProviderBuilder, config); | ||
| meterProvider = meterProviderBuilder.build(); | ||
| } | ||
| closeables.add(meterProvider); | ||
|
|
||
| SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder(); | ||
| tracerProviderBuilder.setResource(resource); | ||
| TracerProviderConfiguration.configureTracerProvider( | ||
| tracerProviderBuilder, | ||
| config, | ||
| spiHelper, | ||
| meterProvider, | ||
| spanExporterCustomizer, | ||
| spanProcessorCustomizer, | ||
| samplerCustomizer, | ||
| closeables); | ||
| tracerProviderBuilder = tracerProviderCustomizer.apply(tracerProviderBuilder, config); | ||
| SdkTracerProvider tracerProvider = tracerProviderBuilder.build(); | ||
| SdkTracerProvider tracerProvider = | ||
| spiHelper.loadOptional(SdkTracerProvider.class).orElse(null); | ||
| if (tracerProvider == null) { | ||
| SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder(); | ||
| tracerProviderBuilder.setResource(resource); | ||
| TracerProviderConfiguration.configureTracerProvider( | ||
| tracerProviderBuilder, | ||
| config, | ||
| spiHelper, | ||
| meterProvider, | ||
| spanExporterCustomizer, | ||
| spanProcessorCustomizer, | ||
| samplerCustomizer, | ||
| closeables); | ||
| tracerProviderBuilder = tracerProviderCustomizer.apply(tracerProviderBuilder, config); | ||
| tracerProvider = tracerProviderBuilder.build(); | ||
| } | ||
| closeables.add(tracerProvider); | ||
|
|
||
| SdkLoggerProviderBuilder loggerProviderBuilder = SdkLoggerProvider.builder(); | ||
| loggerProviderBuilder.setResource(resource); | ||
| LoggerProviderConfiguration.configureLoggerProvider( | ||
| loggerProviderBuilder, | ||
| config, | ||
| spiHelper, | ||
| meterProvider, | ||
| logRecordExporterCustomizer, | ||
| logRecordProcessorCustomizer, | ||
| closeables); | ||
| loggerProviderBuilder = loggerProviderCustomizer.apply(loggerProviderBuilder, config); | ||
| SdkLoggerProvider loggerProvider = loggerProviderBuilder.build(); | ||
| SdkLoggerProvider loggerProvider = | ||
| spiHelper.loadOptional(SdkLoggerProvider.class).orElse(null); | ||
| if (loggerProvider == null) { | ||
| SdkLoggerProviderBuilder loggerProviderBuilder = SdkLoggerProvider.builder(); | ||
| loggerProviderBuilder.setResource(resource); | ||
| LoggerProviderConfiguration.configureLoggerProvider( | ||
| loggerProviderBuilder, | ||
| config, | ||
| spiHelper, | ||
| meterProvider, | ||
| logRecordExporterCustomizer, | ||
| logRecordProcessorCustomizer, | ||
| closeables); | ||
| loggerProviderBuilder = loggerProviderCustomizer.apply(loggerProviderBuilder, config); | ||
| loggerProvider = loggerProviderBuilder.build(); | ||
| } | ||
| closeables.add(loggerProvider); | ||
|
|
||
| ContextPropagators propagators = | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| /* | ||
| * Copyright The OpenTelemetry Authors | ||
| * SPDX-License-Identifier: Apache-2.0 | ||
| */ | ||
|
|
||
| package io.opentelemetry.sdk.autoconfigure; | ||
|
|
||
| import io.opentelemetry.sdk.autoconfigure.spi.ConfigurableProvider; | ||
| import io.opentelemetry.sdk.autoconfigure.spi.Ordered; | ||
| import java.util.Comparator; | ||
| import java.util.HashMap; | ||
| import java.util.List; | ||
| import java.util.Map; | ||
| import java.util.Optional; | ||
| import java.util.stream.Collectors; | ||
| import java.util.stream.StreamSupport; | ||
|
|
||
| /** A loader for components that are discovered via SPI. */ | ||
| public interface ComponentLoader { | ||
| <T> Iterable<T> load(Class<T> spiClass); | ||
|
|
||
| default <T> Optional<T> loadOptional(Class<T> spiClass) { | ||
| Iterable<T> iterable = load(spiClass); | ||
| return StreamSupport.stream(iterable.spliterator(), false).findFirst(); | ||
| } | ||
|
|
||
| /** | ||
| * Load implementations of an ordered SPI (i.e. implements {@link Ordered}). | ||
| * | ||
| * @param spiClass the SPI class | ||
| * @param <T> the SPI type | ||
| * @return list of SPI implementations, in order | ||
| */ | ||
| default <T extends Ordered> List<T> loadOrdered(Class<T> spiClass) { | ||
| return StreamSupport.stream(load(spiClass).spliterator(), false) | ||
| .sorted(Comparator.comparing(Ordered::order)) | ||
| .collect(Collectors.toList()); | ||
| } | ||
|
|
||
| default <T extends ConfigurableProvider> Map<String, T> loadConfigurableProviders( | ||
| Class<T> spiClass) { | ||
| Map<String, T> components = new HashMap<>(); | ||
| for (T component : load(spiClass)) { | ||
| components.put(component.getName(), component); | ||
| } | ||
| return components; | ||
| } | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.