Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalInstrumentationModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalLanguageSpecificInstrumentationModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalLanguageSpecificInstrumentationPropertyModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.OpenTelemetryConfigurationModelAccessor;
import io.opentelemetry.sdk.internal.SdkConfigProvider;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
Expand Down Expand Up @@ -132,9 +133,9 @@ private static ConfigProvider withInstrumentationConfig(
javaConfig.withAdditionalProperty(instrumentationName, instrumentationConfig);
DeclarativeConfigProperties modelProperties =
DeclarativeConfiguration.toConfigProperties(
new OpenTelemetryConfigurationModel()
.withInstrumentationDevelopment(
new ExperimentalInstrumentationModel().withJava(javaConfig)));
OpenTelemetryConfigurationModelAccessor.withInstrumentation(
new OpenTelemetryConfigurationModel(),
new ExperimentalInstrumentationModel().withJava(javaConfig)));

return SdkConfigProvider.create(modelProperties);
}
Expand Down

Large diffs are not rendered by default.

8 changes: 6 additions & 2 deletions sdk-extensions/declarative-config/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,12 @@ val syncPojoModelsToSrc = tasks.register("syncPojoModelsToSrc") {
val modelSrcDir = File(projectDir, "src/main/java")
doLast {
val modelDir = File(modelSrcDir, modelPackage.replace('.', '/'))
// Delete first so schema type removals don't leave stale classes.
modelDir.deleteRecursively()
// Delete only @Generated files so hand-written files (ModelMapper, ExtensionPropertyUtil)
// in model.internal survive the regeneration cycle.
modelDir.walkTopDown()
.filter { it.isFile && it.extension == "java" }
.filter { it.readText().contains("@Generated(") }
.forEach { it.delete() }
DeclarativeConfigPojoGenerator(schemaFile, modelSrcDir, modelPackage).generate()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@

package io.opentelemetry.sdk.autoconfigure.declarativeconfig;

import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.Nulls;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
Expand All @@ -15,6 +13,7 @@
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.SamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ModelMapper;
import io.opentelemetry.sdk.autoconfigure.spi.Ordered;
import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
Expand Down Expand Up @@ -56,27 +55,8 @@
* <h2>For Implementers</h2>
*
* <p>External consumers needing to parse OpenTelemetry YAML configuration files should use the same
* Jackson ObjectMapper configuration for compatibility. This configuration is intentionally not
* exposed as API to avoid coupling. Instead, copy the following setup:
*
* <pre>{@code
* ObjectMapper mapper = new ObjectMapper()
* // Create empty object instances for keys which are present but have null values
* .setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
* // Boxed primitives which are present but have null values should be set to null,
* // rather than empty instances
* mapper.configOverride(String.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));
* mapper.configOverride(Integer.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));
* mapper.configOverride(Double.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));
* mapper.configOverride(Boolean.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));
* }</pre>
*
* <p><b>Why this configuration:</b>
*
* <ul>
* <li>Default behavior creates empty objects for null values to match YAML schema expectations
* <li>Boxed primitives remain null to distinguish between absent and explicitly null values
* </ul>
* Jackson {@code ObjectMapper} configuration for compatibility. See {@link
* io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ModelMapper#MAPPER}.
*/
public final class DeclarativeConfiguration {

Expand All @@ -87,34 +67,8 @@ public final class DeclarativeConfiguration {
private static final ComponentLoader DEFAULT_COMPONENT_LOADER =
ComponentLoader.forClassLoader(DeclarativeConfigProperties.class.getClassLoader());

/**
* ObjectMapper configured for YAML declarative configuration parsing.
*
* <p>Configuration:
*
* <ul>
* <li>Default: Creates empty objects for present keys with null values
* <li>Boxed primitives (String, Integer, Double, Boolean): Remain null when null
* </ul>
*
* <p>External consumers needing compatible parsing should copy this configuration. See class
* javadoc for details and code example.
*/
// Visible for testing
static final ObjectMapper MAPPER;

static {
MAPPER =
new ObjectMapper()
// Create empty object instances for keys which are present but have null values
.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
// Boxed primitives which are present but have null values should be set to null, rather than
// empty instances
MAPPER.configOverride(String.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));
MAPPER.configOverride(Integer.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));
MAPPER.configOverride(Double.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));
MAPPER.configOverride(Boolean.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));
}
static final ObjectMapper MAPPER = ModelMapper.MAPPER;

private DeclarativeConfiguration() {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.LogRecordExporterModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.LogRecordProcessorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.SimpleLogRecordProcessorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.LogRecordProcessorModelAccessor;
import io.opentelemetry.sdk.extension.incubator.logs.EventToSpanEventBridge;
import io.opentelemetry.sdk.logs.LogRecordProcessor;
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor;
Expand Down Expand Up @@ -43,7 +44,7 @@ public LogRecordProcessor create(
if (model.getSimple() != null) {
return createSimpleLogRecordProcessor(model.getSimple(), context);
}
if (model.getEventToSpanEventBridgeDevelopment() != null) {
if (LogRecordProcessorModelAccessor.getEventToSpanEventBridge(model) != null) {
return EventToSpanEventBridge.create();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalLoggerConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalLoggerConfiguratorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalLoggerMatcherAndConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.LoggerProviderModelAccessor;
import io.opentelemetry.sdk.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.common.internal.ScopeConfiguratorBuilder;
import io.opentelemetry.sdk.logs.LogLimits;
Expand Down Expand Up @@ -64,7 +65,7 @@ public SdkLoggerProviderBuilder create(
}

ExperimentalLoggerConfiguratorModel loggerConfiguratorModel =
loggerProviderModel.getLoggerConfiguratorDevelopment();
LoggerProviderModelAccessor.getLoggerConfigurator(loggerProviderModel);
if (loggerConfiguratorModel != null) {
ExperimentalLoggerConfigModel defaultConfigModel = loggerConfiguratorModel.getDefaultConfig();
ScopeConfiguratorBuilder<LoggerConfig> configuratorBuilder = ScopeConfigurator.builder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterConfiguratorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterMatcherAndConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.MeterProviderModelAccessor;
import io.opentelemetry.sdk.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.common.internal.ScopeConfiguratorBuilder;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
Expand Down Expand Up @@ -70,7 +71,7 @@ public SdkMeterProviderBuilder create(
}

ExperimentalMeterConfiguratorModel meterConfiguratorModel =
model.getMeterConfiguratorDevelopment();
MeterProviderModelAccessor.getMeterConfigurator(model);
if (meterConfiguratorModel != null) {
ExperimentalMeterConfigModel defaultConfigModel = meterConfiguratorModel.getDefaultConfig();
ScopeConfiguratorBuilder<MeterConfig> configuratorBuilder = ScopeConfigurator.builder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.PullMetricExporterModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.PullMetricReaderModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.PushMetricExporterModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.PeriodicMetricReaderModelAccessor;
import io.opentelemetry.sdk.metrics.export.CardinalityLimitSelector;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.opentelemetry.sdk.metrics.export.MetricReader;
Expand Down Expand Up @@ -74,9 +75,9 @@ public MetricReaderAndCardinalityLimits create(
cardinalityLimitSelector =
CardinalityLimitsFactory.getInstance().create(model.getCardinalityLimits(), context);
}
if (model.getMaxExportBatchSizeDevelopment() != null) {
SdkMeterProviderUtil.setMaxExportBatchSize(
builder, model.getMaxExportBatchSizeDevelopment());
Integer maxExportBatchSize = PeriodicMetricReaderModelAccessor.getMaxExportBatchSize(model);
if (maxExportBatchSize != null) {
SdkMeterProviderUtil.setMaxExportBatchSize(builder, maxExportBatchSize);
}

MetricReader reader = context.addCloseable(builder.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ResourceModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalResourceDetectionModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalResourceDetectorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ResourceModelAccessor;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.resources.ResourceBuilder;
Expand All @@ -35,7 +36,7 @@ static ResourceFactory getInstance() {
public Resource create(ResourceModel model, DeclarativeConfigContext context) {
ResourceBuilder builder = Resource.getDefault().toBuilder();

ExperimentalResourceDetectionModel detectionModel = model.getDetectionDevelopment();
ExperimentalResourceDetectionModel detectionModel = ResourceModelAccessor.getDetection(model);
if (detectionModel != null) {
ResourceBuilder detectedResourceBuilder = Resource.builder();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ParentBasedSamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.SamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.TraceIdRatioBasedSamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalComposableSamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalProbabilitySamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.SamplerModelAccessor;
import io.opentelemetry.sdk.extension.incubator.trace.samplers.ComposableSampler;
import io.opentelemetry.sdk.extension.incubator.trace.samplers.CompositeSampler;
import io.opentelemetry.sdk.trace.samplers.ParentBasedSamplerBuilder;
Expand Down Expand Up @@ -43,12 +45,16 @@ public Sampler create(SamplerModel model, DeclarativeConfigContext context) {
if (model.getParentBased() != null) {
return createParedBasedSampler(model.getParentBased(), context);
}
if (model.getProbabilityDevelopment() != null) {
return createProbabilitySampler(model.getProbabilityDevelopment());
ExperimentalProbabilitySamplerModel probabilityDevelopment =
SamplerModelAccessor.getProbability(model);
if (probabilityDevelopment != null) {
return createProbabilitySampler(probabilityDevelopment);
}
if (model.getCompositeDevelopment() != null) {
ExperimentalComposableSamplerModel compositeDevelopment =
SamplerModelAccessor.getComposite(model);
if (compositeDevelopment != null) {
return CompositeSampler.wrap(
ComposableSamplerFactory.getInstance().create(model.getCompositeDevelopment(), context));
ComposableSamplerFactory.getInstance().create(compositeDevelopment, context));
}

return context.loadComponent(Sampler.class, samplerKeyValue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalTracerConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalTracerConfiguratorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalTracerMatcherAndConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.TracerProviderModelAccessor;
import io.opentelemetry.sdk.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.common.internal.ScopeConfiguratorBuilder;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
Expand Down Expand Up @@ -72,7 +73,7 @@ public SdkTracerProviderBuilder create(
}

ExperimentalTracerConfiguratorModel tracerConfiguratorModel =
tracerProviderModel.getTracerConfiguratorDevelopment();
TracerProviderModelAccessor.getTracerConfigurator(tracerProviderModel);
if (tracerConfiguratorModel != null) {
ExperimentalTracerConfigModel defaultConfigModel = tracerConfiguratorModel.getDefaultConfig();
ScopeConfiguratorBuilder<TracerConfig> configuratorBuilder = ScopeConfigurator.builder();
Expand Down
Loading
Loading