io.opentelemetry.sdk.autoconfigure.SpanExporterConfiguration Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of opentelemetry-sdk-extension-autoconfigure Show documentation
Show all versions of opentelemetry-sdk-extension-autoconfigure Show documentation
OpenTelemetry SDK Auto-configuration
The newest version!
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.autoconfigure;
import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import java.io.Closeable;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.BiFunction;
final class SpanExporterConfiguration {
private static final String EXPORTER_NONE = "none";
private static final Map EXPORTER_ARTIFACT_ID_BY_NAME;
static {
EXPORTER_ARTIFACT_ID_BY_NAME = new HashMap<>();
EXPORTER_ARTIFACT_ID_BY_NAME.put("console", "opentelemetry-exporter-logging");
EXPORTER_ARTIFACT_ID_BY_NAME.put("jaeger", "opentelemetry-exporter-jaeger");
EXPORTER_ARTIFACT_ID_BY_NAME.put("logging", "opentelemetry-exporter-logging");
EXPORTER_ARTIFACT_ID_BY_NAME.put("logging-otlp", "opentelemetry-exporter-logging-otlp");
EXPORTER_ARTIFACT_ID_BY_NAME.put("otlp", "opentelemetry-exporter-otlp");
EXPORTER_ARTIFACT_ID_BY_NAME.put("zipkin", "opentelemetry-exporter-zipkin");
}
// Visible for testing
static Map configureSpanExporters(
ConfigProperties config,
SpiHelper spiHelper,
BiFunction super SpanExporter, ConfigProperties, ? extends SpanExporter>
spanExporterCustomizer,
List closeables) {
Set exporterNames = DefaultConfigProperties.getSet(config, "otel.traces.exporter");
if (exporterNames.contains(EXPORTER_NONE)) {
if (exporterNames.size() > 1) {
throw new ConfigurationException(
"otel.traces.exporter contains " + EXPORTER_NONE + " along with other exporters");
}
SpanExporter noop = SpanExporter.composite();
SpanExporter customized = spanExporterCustomizer.apply(noop, config);
if (customized == noop) {
return Collections.emptyMap();
}
closeables.add(customized);
return Collections.singletonMap(EXPORTER_NONE, customized);
}
if (exporterNames.isEmpty()) {
exporterNames = Collections.singleton("otlp");
}
NamedSpiManager spiExportersManager = spanExporterSpiManager(config, spiHelper);
Map map = new HashMap<>();
for (String exporterName : exporterNames) {
SpanExporter spanExporter = configureExporter(exporterName, spiExportersManager);
closeables.add(spanExporter);
SpanExporter customizedSpanExporter = spanExporterCustomizer.apply(spanExporter, config);
if (customizedSpanExporter != spanExporter) {
closeables.add(customizedSpanExporter);
}
map.put(exporterName, customizedSpanExporter);
}
return Collections.unmodifiableMap(map);
}
// Visible for testing
static NamedSpiManager spanExporterSpiManager(
ConfigProperties config, SpiHelper spiHelper) {
return spiHelper.loadConfigurable(
ConfigurableSpanExporterProvider.class,
ConfigurableSpanExporterProvider::getName,
ConfigurableSpanExporterProvider::createExporter,
config);
}
// Visible for testing
static SpanExporter configureExporter(
String name, NamedSpiManager spiExportersManager) {
SpanExporter spiExporter = spiExportersManager.getByName(name);
if (spiExporter == null) {
String artifactId = EXPORTER_ARTIFACT_ID_BY_NAME.get(name);
if (artifactId != null) {
throw new ConfigurationException(
"otel.traces.exporter set to \""
+ name
+ "\" but "
+ artifactId
+ " not found on classpath. Make sure to add it as a dependency.");
}
throw new ConfigurationException("Unrecognized value for otel.traces.exporter: " + name);
}
return spiExporter;
}
private SpanExporterConfiguration() {}
}