diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComposableSamplerFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComposableSamplerFactory.java index 2160d2dcf06..9d81966793b 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComposableSamplerFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComposableSamplerFactory.java @@ -7,10 +7,8 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalComposableParentThresholdSamplerModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalComposableProbabilitySamplerModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalComposableRuleBasedSamplerModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalComposableSamplerModel; import io.opentelemetry.sdk.extension.incubator.trace.samplers.ComposableSampler; -import java.util.Map; final class ComposableSamplerFactory implements Factory { @@ -26,33 +24,46 @@ static ComposableSamplerFactory getInstance() { @Override public ComposableSampler create( ExperimentalComposableSamplerModel model, DeclarativeConfigContext context) { + // We don't use the variable till later but call validate first to confirm there are not + // multiple samplers. + ConfigKeyValue samplerKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "composable sampler"); + if (model.getAlwaysOn() != null) { return ComposableSampler.alwaysOn(); } if (model.getAlwaysOff() != null) { return ComposableSampler.alwaysOff(); } - ExperimentalComposableProbabilitySamplerModel probability = model.getProbability(); - if (probability != null) { - Double ratio = probability.getRatio(); - if (ratio == null) { - ratio = 1.0d; - } - return ComposableSampler.probability(ratio); + if (model.getProbability() != null) { + return createProbabilitySampler(model.getProbability()); } - ExperimentalComposableRuleBasedSamplerModel ruleBased = model.getRuleBased(); - if (ruleBased != null) { - return ComposableRuleBasedSamplerFactory.getInstance().create(ruleBased, context); + if (model.getRuleBased() != null) { + return ComposableRuleBasedSamplerFactory.getInstance().create(model.getRuleBased(), context); } - ExperimentalComposableParentThresholdSamplerModel parentThreshold = model.getParentThreshold(); - if (parentThreshold != null) { - ExperimentalComposableSamplerModel rootModel = - FileConfigUtil.requireNonNull(parentThreshold.getRoot(), "parent threshold sampler root"); - ComposableSampler rootSampler = INSTANCE.create(rootModel, context); - return ComposableSampler.parentThreshold(rootSampler); + if (model.getParentThreshold() != null) { + return createParentThresholdSampler(model.getParentThreshold(), context); } - Map.Entry keyValue = - FileConfigUtil.getSingletonMapEntry(model.getAdditionalProperties(), "composable sampler"); - return context.loadComponent(ComposableSampler.class, keyValue.getKey(), keyValue.getValue()); + + return context.loadComponent(ComposableSampler.class, samplerKeyValue); + } + + private static ComposableSampler createProbabilitySampler( + ExperimentalComposableProbabilitySamplerModel probabilityModel) { + Double ratio = probabilityModel.getRatio(); + if (ratio == null) { + ratio = 1.0d; + } + return ComposableSampler.probability(ratio); + } + + private static ComposableSampler createParentThresholdSampler( + ExperimentalComposableParentThresholdSamplerModel parentThresholdModel, + DeclarativeConfigContext context) { + ExperimentalComposableSamplerModel rootModel = + FileConfigUtil.requireNonNull( + parentThresholdModel.getRoot(), "parent threshold sampler root"); + ComposableSampler rootSampler = INSTANCE.create(rootModel, context); + return ComposableSampler.parentThreshold(rootSampler); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ConfigKeyValue.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ConfigKeyValue.java new file mode 100644 index 00000000000..3d7e577a99d --- /dev/null +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ConfigKeyValue.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; + +/** A key value pair for a YAML mapping node. */ +class ConfigKeyValue { + + private final String key; + private final DeclarativeConfigProperties value; + + private ConfigKeyValue(String key, DeclarativeConfigProperties value) { + this.key = key; + this.value = value; + } + + static ConfigKeyValue of(String key, DeclarativeConfigProperties value) { + return new ConfigKeyValue(key, value); + } + + String getKey() { + return key; + } + + DeclarativeConfigProperties getValue() { + return value; + } +} diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java index e93d85c3604..404fab7bc56 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java @@ -82,10 +82,10 @@ SpiHelper getSpiHelper() { * @throws DeclarativeConfigException if no matching providers are found, or if multiple are found * (i.e. conflict), or if {@link ComponentProvider#create(DeclarativeConfigProperties)} throws */ - @SuppressWarnings({"unchecked", "rawtypes"}) - T loadComponent(Class type, String name, Object model) { - DeclarativeConfigProperties config = - DeclarativeConfiguration.toConfigProperties(model, spiHelper.getComponentLoader()); + @SuppressWarnings({"unchecked"}) + T loadComponent(Class type, ConfigKeyValue configKeyValue) { + String name = configKeyValue.getKey(); + DeclarativeConfigProperties config = configKeyValue.getValue(); // TODO(jack-berg): cache loaded component providers List componentProviders = spiHelper.load(ComponentProvider.class); @@ -115,6 +115,9 @@ T loadComponent(Class type, String name, Object model) { try { Object component = provider.create(config); + if (component instanceof Closeable) { + closeables.add((Closeable) component); + } if (component != null && !type.isInstance(component)) { throw new DeclarativeConfigException( "Error configuring " diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java index f79d7a54932..e2968ac6337 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java @@ -8,20 +8,14 @@ import static java.util.stream.Collectors.joining; import io.opentelemetry.api.incubator.config.DeclarativeConfigException; -import java.util.Map; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import java.util.Set; import javax.annotation.Nullable; final class FileConfigUtil { private FileConfigUtil() {} - static T assertNotNull(@Nullable T object, String description) { - if (object == null) { - throw new NullPointerException(description + " is null"); - } - return object; - } - static T requireNonNull(@Nullable T object, String description) { if (object == null) { throw new DeclarativeConfigException(description + " is required but is null"); @@ -29,34 +23,22 @@ static T requireNonNull(@Nullable T object, String description) { return object; } - static Map.Entry getSingletonMapEntry( - Map additionalProperties, String resourceName) { - if (additionalProperties.isEmpty()) { - throw new DeclarativeConfigException(resourceName + " must be set"); - } - if (additionalProperties.size() > 1) { - throw new DeclarativeConfigException( - "Invalid configuration - multiple " - + resourceName - + "s set: " - + additionalProperties.keySet().stream().collect(joining(",", "[", "]"))); - } - return additionalProperties.entrySet().stream() - .findFirst() - .orElseThrow( - () -> - new IllegalStateException( - "Missing " + resourceName + ". This is a programming error.")); - } - - static void requireNullResource( - @Nullable Object resource, String resourceName, Map additionalProperties) { - if (resource != null) { + static ConfigKeyValue validateSingleKeyValue( + DeclarativeConfigContext context, Object model, String resourceName) { + DeclarativeConfigProperties modelConfigProperties = + DeclarativeConfiguration.toConfigProperties( + model, context.getSpiHelper().getComponentLoader()); + Set propertyKeys = modelConfigProperties.getPropertyKeys(); + if (propertyKeys.size() != 1) { + String suffix = + propertyKeys.isEmpty() + ? "" + : ": " + propertyKeys.stream().collect(joining(",", "[", "]")); throw new DeclarativeConfigException( - "Invalid configuration - multiple " - + resourceName - + "s set: " - + additionalProperties.keySet().stream().collect(joining(",", "[", "]"))); + resourceName + " must have exactly one entry but has " + propertyKeys.size() + suffix); } + String key = propertyKeys.iterator().next(); + DeclarativeConfigProperties value = modelConfigProperties.getStructured(key); + return ConfigKeyValue.of(key, value == null ? DeclarativeConfigProperties.empty() : value); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java index 9ebf2e692f6..dec45d47ae8 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java @@ -7,8 +7,6 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel; import io.opentelemetry.sdk.logs.export.LogRecordExporter; -import java.util.LinkedHashMap; -import java.util.Map; final class LogRecordExporterFactory implements Factory { private static final LogRecordExporterFactory INSTANCE = new LogRecordExporterFactory(); @@ -21,26 +19,8 @@ static LogRecordExporterFactory getInstance() { @Override public LogRecordExporter create(LogRecordExporterModel model, DeclarativeConfigContext context) { - Map exporterResourceByName = new LinkedHashMap<>(); - - if (model.getOtlpHttp() != null) { - exporterResourceByName.put("otlp_http", model.getOtlpHttp()); - } - if (model.getOtlpGrpc() != null) { - exporterResourceByName.put("otlp_grpc", model.getOtlpGrpc()); - } - if (model.getOtlpFileDevelopment() != null) { - exporterResourceByName.put("otlp_file/development", model.getOtlpFileDevelopment()); - } - if (model.getConsole() != null) { - exporterResourceByName.put("console", model.getConsole()); - } - exporterResourceByName.putAll(model.getAdditionalProperties()); - - Map.Entry keyValue = - FileConfigUtil.getSingletonMapEntry(exporterResourceByName, "log record exporter"); - LogRecordExporter metricExporter = - context.loadComponent(LogRecordExporter.class, keyValue.getKey(), keyValue.getValue()); - return context.addCloseable(metricExporter); + ConfigKeyValue logRecordExporterKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "log record exporter"); + return context.loadComponent(LogRecordExporter.class, logRecordExporterKeyValue); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java index 6e5491e6623..22d53510bca 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java @@ -9,7 +9,6 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchLogRecordProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorPropertyModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleLogRecordProcessorModel; import io.opentelemetry.sdk.logs.LogRecordProcessor; import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor; @@ -17,7 +16,6 @@ import io.opentelemetry.sdk.logs.export.LogRecordExporter; import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; import java.time.Duration; -import java.util.Map; final class LogRecordProcessorFactory implements Factory { @@ -33,54 +31,61 @@ static LogRecordProcessorFactory getInstance() { @Override public LogRecordProcessor create( LogRecordProcessorModel model, DeclarativeConfigContext context) { - BatchLogRecordProcessorModel batchModel = model.getBatch(); - if (batchModel != null) { - LogRecordExporterModel exporterModel = - FileConfigUtil.requireNonNull( - batchModel.getExporter(), "batch log record processor exporter"); + // We don't use the variable till later but call validate first to confirm there are not + // multiple samplers. + ConfigKeyValue processorKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "log record processor"); - LogRecordExporter logRecordExporter = - LogRecordExporterFactory.getInstance().create(exporterModel, context); - BatchLogRecordProcessorBuilder builder = BatchLogRecordProcessor.builder(logRecordExporter); - if (batchModel.getExportTimeout() != null) { - builder.setExporterTimeout(Duration.ofMillis(batchModel.getExportTimeout())); - } - if (batchModel.getMaxExportBatchSize() != null) { - builder.setMaxExportBatchSize(batchModel.getMaxExportBatchSize()); - } - if (batchModel.getMaxQueueSize() != null) { - builder.setMaxQueueSize(batchModel.getMaxQueueSize()); - } - if (batchModel.getScheduleDelay() != null) { - builder.setScheduleDelay(Duration.ofMillis(batchModel.getScheduleDelay())); - } - MeterProvider meterProvider = context.getMeterProvider(); - if (meterProvider != null) { - builder.setMeterProvider(meterProvider); - } - - return context.addCloseable(builder.build()); + if (model.getBatch() != null) { + return createBatchLogRecordProcessor(model.getBatch(), context); + } + if (model.getSimple() != null) { + return createSimpleLogRecordProcessor(model.getSimple(), context); } - SimpleLogRecordProcessorModel simpleModel = model.getSimple(); - if (simpleModel != null) { - LogRecordExporterModel exporterModel = - FileConfigUtil.requireNonNull( - simpleModel.getExporter(), "simple log record processor exporter"); - LogRecordExporter logRecordExporter = - LogRecordExporterFactory.getInstance().create(exporterModel, context); - MeterProvider meterProvider = context.getMeterProvider(); - return context.addCloseable( - SimpleLogRecordProcessor.builder(logRecordExporter) - .setMeterProvider(() -> meterProvider) - .build()); + return context.loadComponent(LogRecordProcessor.class, processorKeyValue); + } + + private static LogRecordProcessor createBatchLogRecordProcessor( + BatchLogRecordProcessorModel batchModel, DeclarativeConfigContext context) { + LogRecordExporterModel exporterModel = + FileConfigUtil.requireNonNull( + batchModel.getExporter(), "batch log record processor exporter"); + + LogRecordExporter logRecordExporter = + LogRecordExporterFactory.getInstance().create(exporterModel, context); + BatchLogRecordProcessorBuilder builder = BatchLogRecordProcessor.builder(logRecordExporter); + if (batchModel.getExportTimeout() != null) { + builder.setExporterTimeout(Duration.ofMillis(batchModel.getExportTimeout())); + } + if (batchModel.getMaxExportBatchSize() != null) { + builder.setMaxExportBatchSize(batchModel.getMaxExportBatchSize()); } + if (batchModel.getMaxQueueSize() != null) { + builder.setMaxQueueSize(batchModel.getMaxQueueSize()); + } + if (batchModel.getScheduleDelay() != null) { + builder.setScheduleDelay(Duration.ofMillis(batchModel.getScheduleDelay())); + } + MeterProvider meterProvider = context.getMeterProvider(); + if (meterProvider != null) { + builder.setMeterProvider(meterProvider); + } + + return context.addCloseable(builder.build()); + } - Map.Entry keyValue = - FileConfigUtil.getSingletonMapEntry( - model.getAdditionalProperties(), "log record processor"); - LogRecordProcessor logRecordProcessor = - context.loadComponent(LogRecordProcessor.class, keyValue.getKey(), keyValue.getValue()); - return context.addCloseable(logRecordProcessor); + private static LogRecordProcessor createSimpleLogRecordProcessor( + SimpleLogRecordProcessorModel simpleModel, DeclarativeConfigContext context) { + LogRecordExporterModel exporterModel = + FileConfigUtil.requireNonNull( + simpleModel.getExporter(), "simple log record processor exporter"); + LogRecordExporter logRecordExporter = + LogRecordExporterFactory.getInstance().create(exporterModel, context); + MeterProvider meterProvider = context.getMeterProvider(); + return context.addCloseable( + SimpleLogRecordProcessor.builder(logRecordExporter) + .setMeterProvider(() -> meterProvider) + .build()); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java index a7ab5eb7b10..a093cebe884 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java @@ -7,8 +7,6 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PushMetricExporterModel; import io.opentelemetry.sdk.metrics.export.MetricExporter; -import java.util.LinkedHashMap; -import java.util.Map; final class MetricExporterFactory implements Factory { private static final MetricExporterFactory INSTANCE = new MetricExporterFactory(); @@ -21,26 +19,8 @@ static MetricExporterFactory getInstance() { @Override public MetricExporter create(PushMetricExporterModel model, DeclarativeConfigContext context) { - Map exporterResourceByName = new LinkedHashMap<>(); - - if (model.getOtlpHttp() != null) { - exporterResourceByName.put("otlp_http", model.getOtlpHttp()); - } - if (model.getOtlpGrpc() != null) { - exporterResourceByName.put("otlp_grpc", model.getOtlpGrpc()); - } - if (model.getOtlpFileDevelopment() != null) { - exporterResourceByName.put("otlp_file/development", model.getOtlpFileDevelopment()); - } - if (model.getConsole() != null) { - exporterResourceByName.put("console", model.getConsole()); - } - exporterResourceByName.putAll(model.getAdditionalProperties()); - - Map.Entry keyValue = - FileConfigUtil.getSingletonMapEntry(exporterResourceByName, "metric exporter"); - MetricExporter metricExporter = - context.loadComponent(MetricExporter.class, keyValue.getKey(), keyValue.getValue()); - return context.addCloseable(metricExporter); + ConfigKeyValue metricExporterKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "metric exporter"); + return context.loadComponent(MetricExporter.class, metricExporterKeyValue); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java index 464ad868e74..16695e32fb3 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java @@ -8,7 +8,6 @@ import static io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigUtil.requireNonNull; import io.opentelemetry.api.incubator.config.DeclarativeConfigException; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalPrometheusMetricExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReaderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReaderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PullMetricExporterModel; @@ -35,14 +34,13 @@ static MetricReaderFactory getInstance() { @Override public MetricReaderAndCardinalityLimits create( MetricReaderModel model, DeclarativeConfigContext context) { - PeriodicMetricReaderModel periodicModel = model.getPeriodic(); - if (periodicModel != null) { - return PeriodicMetricReaderFactory.INSTANCE.create(periodicModel, context); - } + FileConfigUtil.validateSingleKeyValue(context, model, "metric reader"); - PullMetricReaderModel pullModel = model.getPull(); - if (pullModel != null) { - return PullMetricReaderFactory.INSTANCE.create(pullModel, context); + if (model.getPeriodic() != null) { + return PeriodicMetricReaderFactory.INSTANCE.create(model.getPeriodic(), context); + } + if (model.getPull() != null) { + return PullMetricReaderFactory.INSTANCE.create(model.getPull(), context); } throw new DeclarativeConfigException("reader must be set"); @@ -63,8 +61,7 @@ public MetricReaderAndCardinalityLimits create( MetricExporter metricExporter = MetricExporterFactory.getInstance().create(exporterModel, context); - PeriodicMetricReaderBuilder builder = - PeriodicMetricReader.builder(context.addCloseable(metricExporter)); + PeriodicMetricReaderBuilder builder = PeriodicMetricReader.builder(metricExporter); if (model.getInterval() != null) { builder.setInterval(Duration.ofMillis(model.getInterval())); @@ -92,26 +89,16 @@ public MetricReaderAndCardinalityLimits create( PullMetricReaderModel model, DeclarativeConfigContext context) { PullMetricExporterModel exporterModel = requireNonNull(model.getExporter(), "pull metric reader exporter"); - - ExperimentalPrometheusMetricExporterModel prometheusModel = - exporterModel.getPrometheusDevelopment(); - - if (prometheusModel != null) { - MetricReader metricReader = - context.addCloseable( - context.loadComponent( - MetricReader.class, "prometheus/development", prometheusModel)); - CardinalityLimitSelector cardinalityLimitSelector = null; - if (model.getCardinalityLimits() != null) { - cardinalityLimitSelector = - CardinalityLimitsFactory.getInstance().create(model.getCardinalityLimits(), context); - } - - return MetricReaderAndCardinalityLimits.create(metricReader, cardinalityLimitSelector); + CardinalityLimitSelector cardinalityLimitSelector = null; + if (model.getCardinalityLimits() != null) { + cardinalityLimitSelector = + CardinalityLimitsFactory.getInstance().create(model.getCardinalityLimits(), context); } - throw new DeclarativeConfigException( - "prometheus is the only currently supported pull reader"); + ConfigKeyValue metricReaderKeyValue = + FileConfigUtil.validateSingleKeyValue(context, exporterModel, "metric reader"); + MetricReader metricReader = context.loadComponent(MetricReader.class, metricReaderKeyValue); + return MetricReaderAndCardinalityLimits.create(metricReader, cardinalityLimitSelector); } } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/PropagatorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/PropagatorFactory.java index e9f2422f9fd..6c561c85ade 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/PropagatorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/PropagatorFactory.java @@ -5,6 +5,7 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PropagatorModel; @@ -55,7 +56,9 @@ public ContextPropagators create(PropagatorModel model, DeclarativeConfigContext // Only add entries which weren't already previously added if (propagatorNames.add(propagatorName)) { textMapPropagators.add( - TextMapPropagatorFactory.getPropagator(context, propagatorName) + TextMapPropagatorFactory.getPropagator( + context, + ConfigKeyValue.of(propagatorName, DeclarativeConfigProperties.empty())) .getTextMapPropagator()); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ResourceDetectorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ResourceDetectorFactory.java index 56966606e9b..1281d19e5ec 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ResourceDetectorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ResourceDetectorFactory.java @@ -7,8 +7,6 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectorModel; import io.opentelemetry.sdk.resources.Resource; -import java.util.LinkedHashMap; -import java.util.Map; final class ResourceDetectorFactory implements Factory { @@ -23,24 +21,8 @@ static ResourceDetectorFactory getInstance() { @Override public Resource create( ExperimentalResourceDetectorModel model, DeclarativeConfigContext context) { - Map detectorResourceByName = new LinkedHashMap<>(); - - if (model.getContainer() != null) { - detectorResourceByName.put("container", model.getContainer()); - } - if (model.getHost() != null) { - detectorResourceByName.put("host", model.getHost()); - } - if (model.getProcess() != null) { - detectorResourceByName.put("process", model.getProcess()); - } - if (model.getService() != null) { - detectorResourceByName.put("service", model.getService()); - } - detectorResourceByName.putAll(model.getAdditionalProperties()); - - Map.Entry keyValue = - FileConfigUtil.getSingletonMapEntry(detectorResourceByName, "resource detector"); - return context.loadComponent(Resource.class, keyValue.getKey(), keyValue.getValue()); + ConfigKeyValue detectorKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "resource detector"); + return context.loadComponent(Resource.class, detectorKeyValue); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java index 921eebe3670..fe8ee9b5924 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java @@ -5,7 +5,6 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalComposableSamplerModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalProbabilitySamplerModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ParentBasedSamplerModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel; @@ -14,7 +13,6 @@ import io.opentelemetry.sdk.extension.incubator.trace.samplers.CompositeSampler; import io.opentelemetry.sdk.trace.samplers.ParentBasedSamplerBuilder; import io.opentelemetry.sdk.trace.samplers.Sampler; -import java.util.Map; final class SamplerFactory implements Factory { @@ -28,71 +26,74 @@ static SamplerFactory getInstance() { @Override public Sampler create(SamplerModel model, DeclarativeConfigContext context) { + // We don't use the variable till later but call validate first to confirm there are not + // multiple samplers. + ConfigKeyValue samplerKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "sampler"); + if (model.getAlwaysOn() != null) { return Sampler.alwaysOn(); } if (model.getAlwaysOff() != null) { return Sampler.alwaysOff(); } - TraceIdRatioBasedSamplerModel traceIdRatioBasedModel = model.getTraceIdRatioBased(); - if (traceIdRatioBasedModel != null) { - Double ratio = traceIdRatioBasedModel.getRatio(); - if (ratio == null) { - ratio = 1.0d; - } - return Sampler.traceIdRatioBased(ratio); + if (model.getTraceIdRatioBased() != null) { + return createTraceIdRatioBasedSampler(model.getTraceIdRatioBased()); } - ParentBasedSamplerModel parentBasedModel = model.getParentBased(); - if (parentBasedModel != null) { - Sampler root = - parentBasedModel.getRoot() == null - ? Sampler.alwaysOn() - : create(parentBasedModel.getRoot(), context); - ParentBasedSamplerBuilder builder = Sampler.parentBasedBuilder(root); - if (parentBasedModel.getRemoteParentSampled() != null) { - Sampler sampler = create(parentBasedModel.getRemoteParentSampled(), context); - builder.setRemoteParentSampled(sampler); - } - if (parentBasedModel.getRemoteParentNotSampled() != null) { - Sampler sampler = create(parentBasedModel.getRemoteParentNotSampled(), context); - builder.setRemoteParentNotSampled(sampler); - } - if (parentBasedModel.getLocalParentSampled() != null) { - Sampler sampler = create(parentBasedModel.getLocalParentSampled(), context); - builder.setLocalParentSampled(sampler); - } - if (parentBasedModel.getLocalParentNotSampled() != null) { - Sampler sampler = create(parentBasedModel.getLocalParentNotSampled(), context); - builder.setLocalParentNotSampled(sampler); - } - return builder.build(); + if (model.getParentBased() != null) { + return createParedBasedSampler(model.getParentBased(), context); } - ExperimentalProbabilitySamplerModel probability = model.getProbabilityDevelopment(); - if (probability != null) { - Double ratio = probability.getRatio(); - if (ratio == null) { - ratio = 1.0d; - } - return CompositeSampler.wrap(ComposableSampler.probability(ratio)); + if (model.getProbabilityDevelopment() != null) { + return createProbabilitySampler(model.getProbabilityDevelopment()); } - ExperimentalComposableSamplerModel composite = model.getCompositeDevelopment(); - if (composite != null) { + if (model.getCompositeDevelopment() != null) { return CompositeSampler.wrap( - ComposableSamplerFactory.getInstance().create(composite, context)); + ComposableSamplerFactory.getInstance().create(model.getCompositeDevelopment(), context)); + } + + return context.loadComponent(Sampler.class, samplerKeyValue); + } + + private static Sampler createTraceIdRatioBasedSampler(TraceIdRatioBasedSamplerModel model) { + Double ratio = model.getRatio(); + if (ratio == null) { + ratio = 1.0d; } + return Sampler.traceIdRatioBased(ratio); + } - String key = null; - Object value = null; - if (model.getJaegerRemoteDevelopment() != null) { - key = "jaeger_remote/development"; - value = model.getJaegerRemoteDevelopment(); + private static Sampler createParedBasedSampler( + ParentBasedSamplerModel parentBasedModel, DeclarativeConfigContext context) { + Sampler root = + parentBasedModel.getRoot() == null + ? Sampler.alwaysOn() + : INSTANCE.create(parentBasedModel.getRoot(), context); + ParentBasedSamplerBuilder builder = Sampler.parentBasedBuilder(root); + if (parentBasedModel.getRemoteParentSampled() != null) { + Sampler sampler = INSTANCE.create(parentBasedModel.getRemoteParentSampled(), context); + builder.setRemoteParentSampled(sampler); } - if (key == null || value == null) { - Map.Entry keyValue = - FileConfigUtil.getSingletonMapEntry(model.getAdditionalProperties(), "sampler"); - key = keyValue.getKey(); - value = keyValue.getValue(); + if (parentBasedModel.getRemoteParentNotSampled() != null) { + Sampler sampler = INSTANCE.create(parentBasedModel.getRemoteParentNotSampled(), context); + builder.setRemoteParentNotSampled(sampler); + } + if (parentBasedModel.getLocalParentSampled() != null) { + Sampler sampler = INSTANCE.create(parentBasedModel.getLocalParentSampled(), context); + builder.setLocalParentSampled(sampler); + } + if (parentBasedModel.getLocalParentNotSampled() != null) { + Sampler sampler = INSTANCE.create(parentBasedModel.getLocalParentNotSampled(), context); + builder.setLocalParentNotSampled(sampler); + } + return builder.build(); + } + + private static Sampler createProbabilitySampler( + ExperimentalProbabilitySamplerModel probabilityModel) { + Double ratio = probabilityModel.getRatio(); + if (ratio == null) { + ratio = 1.0d; } - return context.loadComponent(Sampler.class, key, value); + return CompositeSampler.wrap(ComposableSampler.probability(ratio)); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java index 08ac568fb60..9fb740a5ef7 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java @@ -7,8 +7,6 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel; import io.opentelemetry.sdk.trace.export.SpanExporter; -import java.util.LinkedHashMap; -import java.util.Map; final class SpanExporterFactory implements Factory { @@ -22,26 +20,8 @@ static SpanExporterFactory getInstance() { @Override public SpanExporter create(SpanExporterModel model, DeclarativeConfigContext context) { - Map exporterResourceByName = new LinkedHashMap<>(); - - if (model.getOtlpHttp() != null) { - exporterResourceByName.put("otlp_http", model.getOtlpHttp()); - } - if (model.getOtlpGrpc() != null) { - exporterResourceByName.put("otlp_grpc", model.getOtlpGrpc()); - } - if (model.getOtlpFileDevelopment() != null) { - exporterResourceByName.put("otlp_file/development", model.getOtlpFileDevelopment()); - } - if (model.getConsole() != null) { - exporterResourceByName.put("console", model.getConsole()); - } - exporterResourceByName.putAll(model.getAdditionalProperties()); - - Map.Entry keyValue = - FileConfigUtil.getSingletonMapEntry(exporterResourceByName, "span exporter"); - SpanExporter spanExporter = - context.loadComponent(SpanExporter.class, keyValue.getKey(), keyValue.getValue()); - return context.addCloseable(spanExporter); + ConfigKeyValue spanExporterKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "span exporter"); + return context.loadComponent(SpanExporter.class, spanExporterKeyValue); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java index 5720141483c..75b0a557cc3 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java @@ -10,7 +10,6 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleSpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorPropertyModel; import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; import io.opentelemetry.sdk.trace.export.BatchSpanProcessorBuilder; @@ -18,7 +17,6 @@ import io.opentelemetry.sdk.trace.export.SimpleSpanProcessorBuilder; import io.opentelemetry.sdk.trace.export.SpanExporter; import java.time.Duration; -import java.util.Map; final class SpanProcessorFactory implements Factory { @@ -32,50 +30,57 @@ static SpanProcessorFactory getInstance() { @Override public SpanProcessor create(SpanProcessorModel model, DeclarativeConfigContext context) { - BatchSpanProcessorModel batchModel = model.getBatch(); - if (batchModel != null) { - SpanExporterModel exporterModel = - FileConfigUtil.requireNonNull(batchModel.getExporter(), "batch span processor exporter"); - SpanExporter spanExporter = SpanExporterFactory.getInstance().create(exporterModel, context); - BatchSpanProcessorBuilder builder = BatchSpanProcessor.builder(spanExporter); - if (batchModel.getExportTimeout() != null) { - builder.setExporterTimeout(Duration.ofMillis(batchModel.getExportTimeout())); - } - if (batchModel.getMaxExportBatchSize() != null) { - builder.setMaxExportBatchSize(batchModel.getMaxExportBatchSize()); - } - if (batchModel.getMaxQueueSize() != null) { - builder.setMaxQueueSize(batchModel.getMaxQueueSize()); - } - if (batchModel.getScheduleDelay() != null) { - builder.setScheduleDelay(Duration.ofMillis(batchModel.getScheduleDelay())); - } - MeterProvider meterProvider = context.getMeterProvider(); - if (meterProvider != null) { - builder.setMeterProvider(() -> meterProvider); - } + // We don't use the variable till later but call validate first to confirm there are not + // multiple samplers. + ConfigKeyValue processorKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "span processor"); - return context.addCloseable(builder.build()); + if (model.getBatch() != null) { + return createBatchLogRecordProcessor(model.getBatch(), context); } + if (model.getSimple() != null) { + return createSimpleLogRecordProcessor(model.getSimple(), context); + } + + return context.loadComponent(SpanProcessor.class, processorKeyValue); + } - SimpleSpanProcessorModel simpleModel = model.getSimple(); - if (simpleModel != null) { - SpanExporterModel exporterModel = - FileConfigUtil.requireNonNull( - simpleModel.getExporter(), "simple span processor exporter"); - SpanExporter spanExporter = SpanExporterFactory.getInstance().create(exporterModel, context); - SimpleSpanProcessorBuilder builder = SimpleSpanProcessor.builder(spanExporter); - MeterProvider meterProvider = context.getMeterProvider(); - if (meterProvider != null) { - builder.setMeterProvider(() -> meterProvider); - } - return context.addCloseable(builder.build()); + private static SpanProcessor createBatchLogRecordProcessor( + BatchSpanProcessorModel batchModel, DeclarativeConfigContext context) { + SpanExporterModel exporterModel = + FileConfigUtil.requireNonNull(batchModel.getExporter(), "batch span processor exporter"); + SpanExporter spanExporter = SpanExporterFactory.getInstance().create(exporterModel, context); + BatchSpanProcessorBuilder builder = BatchSpanProcessor.builder(spanExporter); + if (batchModel.getExportTimeout() != null) { + builder.setExporterTimeout(Duration.ofMillis(batchModel.getExportTimeout())); + } + if (batchModel.getMaxExportBatchSize() != null) { + builder.setMaxExportBatchSize(batchModel.getMaxExportBatchSize()); + } + if (batchModel.getMaxQueueSize() != null) { + builder.setMaxQueueSize(batchModel.getMaxQueueSize()); + } + if (batchModel.getScheduleDelay() != null) { + builder.setScheduleDelay(Duration.ofMillis(batchModel.getScheduleDelay())); + } + MeterProvider meterProvider = context.getMeterProvider(); + if (meterProvider != null) { + builder.setMeterProvider(() -> meterProvider); } - Map.Entry keyValue = - FileConfigUtil.getSingletonMapEntry(model.getAdditionalProperties(), "span processor"); - SpanProcessor spanProcessor = - context.loadComponent(SpanProcessor.class, keyValue.getKey(), keyValue.getValue()); - return context.addCloseable(spanProcessor); + return context.addCloseable(builder.build()); + } + + private static SpanProcessor createSimpleLogRecordProcessor( + SimpleSpanProcessorModel simpleModel, DeclarativeConfigContext context) { + SpanExporterModel exporterModel = + FileConfigUtil.requireNonNull(simpleModel.getExporter(), "simple span processor exporter"); + SpanExporter spanExporter = SpanExporterFactory.getInstance().create(exporterModel, context); + SimpleSpanProcessorBuilder builder = SimpleSpanProcessor.builder(spanExporter); + MeterProvider meterProvider = context.getMeterProvider(); + if (meterProvider != null) { + builder.setMeterProvider(() -> meterProvider); + } + return context.addCloseable(builder.build()); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java index ac85badb3fd..c9cf9a890a7 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java @@ -9,9 +9,6 @@ import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TextMapPropagatorModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TextMapPropagatorPropertyModel; -import java.util.Collections; -import java.util.Map; final class TextMapPropagatorFactory implements Factory { @@ -27,41 +24,22 @@ static TextMapPropagatorFactory getInstance() { @Override public TextMapPropagatorAndName create( TextMapPropagatorModel model, DeclarativeConfigContext context) { - if (model.getTracecontext() != null) { - return getPropagator(context, "tracecontext"); - } - if (model.getBaggage() != null) { - return getPropagator(context, "baggage"); - } - if (model.getB3() != null) { - return getPropagator(context, "b3"); - } - if (model.getB3multi() != null) { - return getPropagator(context, "b3multi"); - } - if (model.getJaeger() != null) { - return getPropagator(context, "jaeger"); - } - if (model.getOttrace() != null) { - return getPropagator(context, "ottrace"); - } - - Map.Entry keyValue = - FileConfigUtil.getSingletonMapEntry(model.getAdditionalProperties(), "propagator"); - TextMapPropagator propagator = - context.loadComponent(TextMapPropagator.class, keyValue.getKey(), keyValue.getValue()); - return TextMapPropagatorAndName.create(propagator, keyValue.getKey()); + ConfigKeyValue propagatorKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "propagator"); + return getPropagator(context, propagatorKeyValue); } - static TextMapPropagatorAndName getPropagator(DeclarativeConfigContext context, String name) { + static TextMapPropagatorAndName getPropagator( + DeclarativeConfigContext context, ConfigKeyValue configKeyValue) { + String name = configKeyValue.getKey(); + TextMapPropagator textMapPropagator; if (name.equals("tracecontext")) { textMapPropagator = W3CTraceContextPropagator.getInstance(); } else if (name.equals("baggage")) { textMapPropagator = W3CBaggagePropagator.getInstance(); } else { - textMapPropagator = - context.loadComponent(TextMapPropagator.class, name, Collections.emptyMap()); + textMapPropagator = context.loadComponent(TextMapPropagator.class, configKeyValue); } return TextMapPropagatorAndName.create(textMapPropagator, name); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComposableRuleBasedSamplerFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComposableRuleBasedSamplerFactoryTest.java index 683acf3c9cd..9825ab5699c 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComposableRuleBasedSamplerFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComposableRuleBasedSamplerFactoryTest.java @@ -13,7 +13,6 @@ import static io.opentelemetry.sdk.extension.incubator.fileconfig.ComposableRuleBasedSamplerFactory.DeclarativeConfigSamplingPredicate.toSpanParent; import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; @@ -22,6 +21,7 @@ import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.ComposableRuleBasedSamplerFactory.AttributeMatcher; import io.opentelemetry.sdk.extension.incubator.fileconfig.ComposableRuleBasedSamplerFactory.DeclarativeConfigSamplingPredicate; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalComposableAlwaysOffSamplerModel; @@ -47,12 +47,14 @@ class ComposableRuleBasedSamplerFactoryTest { + private final DeclarativeConfigContext context = + new DeclarativeConfigContext(SpiHelper.create(SamplerFactoryTest.class.getClassLoader())); + @ParameterizedTest @MethodSource("createTestCases") void create(ExperimentalComposableRuleBasedSamplerModel model, ComposableSampler expectedResult) { ComposableSampler composableSampler = - ComposableRuleBasedSamplerFactory.getInstance() - .create(model, mock(DeclarativeConfigContext.class)); + ComposableRuleBasedSamplerFactory.getInstance().create(model, context); assertThat(composableSampler.toString()).isEqualTo(expectedResult.toString()); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java index bc63ca7bdcb..265c30b58d1 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java @@ -153,7 +153,7 @@ void create_PullPrometheusDefault() throws IOException { assertThat(reader.toString()).isEqualTo(expectedReader.toString()); assertThat(readerAndCardinalityLimits.getCardinalityLimitsSelector()).isNull(); // TODO(jack-berg): validate prometheus component provider was invoked with correct arguments - verify(context).loadComponent(eq(MetricReader.class), eq("prometheus/development"), any()); + verify(context).loadComponent(eq(MetricReader.class), any(ConfigKeyValue.class)); } @Test @@ -206,7 +206,7 @@ void create_PullPrometheusConfigured() throws IOException { .getCardinalityLimit(InstrumentType.COUNTER)) .isEqualTo(100); // TODO(jack-berg): validate prometheus component provider was invoked with correct arguments - verify(context).loadComponent(eq(MetricReader.class), eq("prometheus/development"), any()); + verify(context).loadComponent(eq(MetricReader.class), any(ConfigKeyValue.class)); } @Test @@ -228,7 +228,7 @@ void create_InvalidPullReader() { .withExporter(new PullMetricExporterModel())), context)) .isInstanceOf(DeclarativeConfigException.class) - .hasMessage("prometheus is the only currently supported pull reader"); + .hasMessage("metric reader must have exactly one entry but has 0"); } /** diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ResourceFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ResourceFactoryTest.java index 1ed195376f6..58da73d00cf 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ResourceFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ResourceFactoryTest.java @@ -170,13 +170,13 @@ private static Stream createInvalidDetectorsArgs() { new ExperimentalResourceDetectorModel() .withAdditionalProperty("foo", null) .withAdditionalProperty("bar", null)))), - "Invalid configuration - multiple resource detectors set: [foo,bar]"), + "resource detector must have exactly one entry but has 2: [foo,bar]"), Arguments.of( new ResourceModel() .withDetectionDevelopment( new ExperimentalResourceDetectionModel() .withDetectors( Collections.singletonList(new ExperimentalResourceDetectorModel()))), - "resource detector must be set")); + "resource detector must have exactly one entry but has 0")); } }