diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java index d1989a04039..420b92eb343 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java @@ -46,17 +46,17 @@ public MetricReader create(DeclarativeConfigProperties config) { prometheusBuilder.setHost(host); } - Boolean withoutTargetInfo = config.getBoolean("without_target_info"); + Boolean withoutTargetInfo = config.getBoolean("target_info_enabled/development"); if (withoutTargetInfo != null) { prometheusBuilder.setTargetInfoMetricEnabled(!withoutTargetInfo); } - Boolean withoutScopeInfo = config.getBoolean("without_scope_info"); + Boolean withoutScopeInfo = config.getBoolean("scope_info_enabled"); if (withoutScopeInfo != null) { prometheusBuilder.setOtelScopeLabelsEnabled(!withoutScopeInfo); } DeclarativeConfigProperties withResourceConstantLabels = - config.getStructured("with_resource_constant_labels"); + config.getStructured("resource_constant_labels"); if (withResourceConstantLabels != null) { List included = withResourceConstantLabels.getScalarList("included", String.class); List excluded = withResourceConstantLabels.getScalarList("excluded", String.class); diff --git a/sdk-extensions/declarative-config/build.gradle.kts b/sdk-extensions/declarative-config/build.gradle.kts index 6d499203028..5dca2b822db 100644 --- a/sdk-extensions/declarative-config/build.gradle.kts +++ b/sdk-extensions/declarative-config/build.gradle.kts @@ -59,7 +59,7 @@ dependencies { // The generated POJOs are committed to src/main/java and are NOT regenerated as part of the normal build. // To regenerate (e.g. after a schema update), run: ./gradlew :sdk-extensions:declarative-config:syncPojoModelsToSrc -val configurationTag = "1.0.0" +val configurationTag = "1.1.0" val configurationRef = "refs/tags/v$configurationTag" // Replace with commit SHA to point to experiment with a specific commit val configurationRepoZip = "https://github.com/open-telemetry/opentelemetry-configuration/archive/$configurationRef.zip" val buildDirectory = layout.buildDirectory.asFile.get() diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/IdGeneratorFactory.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/IdGeneratorFactory.java new file mode 100644 index 00000000000..219d332f461 --- /dev/null +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/IdGeneratorFactory.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure.declarativeconfig; + +import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.IdGeneratorModel; +import io.opentelemetry.sdk.trace.IdGenerator; + +final class IdGeneratorFactory implements Factory { + + private static final IdGeneratorFactory INSTANCE = new IdGeneratorFactory(); + + private IdGeneratorFactory() {} + + static IdGeneratorFactory getInstance() { + return INSTANCE; + } + + @Override + public IdGenerator create(IdGeneratorModel model, DeclarativeConfigContext context) { + // We don't use the variable till later but call validate first to confirm there are not + // multiple IdGenerators. + ConfigKeyValue processorKeyValue = + FileConfigUtil.validateSingleKeyValue(context, model, "id generator"); + + if (model.getRandom() != null) { + return IdGenerator.random(); + } + + return context.loadComponent(IdGenerator.class, processorKeyValue); + } +} diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/LogRecordProcessorFactory.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/LogRecordProcessorFactory.java index 32952123100..c1eea4047b1 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/LogRecordProcessorFactory.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/LogRecordProcessorFactory.java @@ -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.extension.incubator.logs.EventToSpanEventBridge; import io.opentelemetry.sdk.logs.LogRecordProcessor; import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor; import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessorBuilder; @@ -42,6 +43,9 @@ public LogRecordProcessor create( if (model.getSimple() != null) { return createSimpleLogRecordProcessor(model.getSimple(), context); } + if (model.getEventToSpanEventBridgeDevelopment() != null) { + return EventToSpanEventBridge.create(); + } return context.loadComponent(LogRecordProcessor.class, processorKeyValue); } diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/MetricReaderFactory.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/MetricReaderFactory.java index b2a6ec14f5b..0b61cc5658e 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/MetricReaderFactory.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/MetricReaderFactory.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.metrics.export.MetricReader; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReaderBuilder; +import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil; import java.time.Duration; final class MetricReaderFactory @@ -71,6 +72,10 @@ public MetricReaderAndCardinalityLimits create( cardinalityLimitSelector = CardinalityLimitsFactory.getInstance().create(model.getCardinalityLimits(), context); } + if (model.getMaxExportBatchSizeDevelopment() != null) { + SdkMeterProviderUtil.setMaxExportBatchSize( + builder, model.getMaxExportBatchSizeDevelopment()); + } MetricReader reader = context.addCloseable(builder.build()); return MetricReaderAndCardinalityLimits.create(reader, cardinalityLimitSelector); diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/OpenTelemetryConfigurationFactory.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/OpenTelemetryConfigurationFactory.java index f5be20703a1..aff411903e0 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/OpenTelemetryConfigurationFactory.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/OpenTelemetryConfigurationFactory.java @@ -27,8 +27,9 @@ final class OpenTelemetryConfigurationFactory private static final Logger logger = Logger.getLogger(OpenTelemetryConfigurationFactory.class.getName()); - private static final Pattern SUPPORTED_FILE_FORMATS = Pattern.compile("^(0.4)|(1.0(-rc.\\d*)?)$"); - private static final String EXPECTED_FILE_FORMAT = "1.0"; + private static final Pattern SUPPORTED_FILE_FORMATS = + Pattern.compile("^(0.4)|(1.\\d+(-rc.\\d+)?)$"); + private static final String EXPECTED_FILE_FORMAT = "1.1"; private static final OpenTelemetryConfigurationFactory INSTANCE = new OpenTelemetryConfigurationFactory(); @@ -52,7 +53,7 @@ public DeclarativeConfigResult create( String fileFormat = model.getFileFormat(); if (fileFormat == null || !SUPPORTED_FILE_FORMATS.matcher(fileFormat).matches()) { throw new DeclarativeConfigException( - "Unsupported file format '" + fileFormat + "'. Supported formats include 0.4, 1.0*"); + "Unsupported file format '" + fileFormat + "'. Supported formats include 0.4, 1.*"); } if (!EXPECTED_FILE_FORMAT.equals(fileFormat)) { logger.warning( diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/TracerProviderFactory.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/TracerProviderFactory.java index b960e0d48bd..f7923f878fd 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/TracerProviderFactory.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/TracerProviderFactory.java @@ -66,6 +66,11 @@ public SdkTracerProviderBuilder create( SpanProcessorFactory.getInstance().create(processor, context))); } + if (tracerProviderModel.getIdGenerator() != null) { + builder.setIdGenerator( + IdGeneratorFactory.getInstance().create(tracerProviderModel.getIdGenerator(), context)); + } + ExperimentalTracerConfiguratorModel tracerConfiguratorModel = tracerProviderModel.getTracerConfiguratorDevelopment(); if (tracerConfiguratorModel != null) { diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/AttributeNameValueModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/AttributeNameValueModel.java index 5cd48851c19..77762836576 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/AttributeNameValueModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/AttributeNameValueModel.java @@ -34,14 +34,14 @@ public class AttributeNameValueModel { private String name; /** - * The attribute value. The type of value must match .type. Property is required and must be - * non-null. + * The attribute value. The type of value must match .type. Property must be present, but if null + * the entry is ignored. * *

(Required) */ @JsonProperty("value") @JsonPropertyDescription( - "The attribute value.\nThe type of value must match .type.\nProperty is required and must be non-null.\n") + "The attribute value.\nThe type of value must match .type.\nProperty must be present, but if null the entry is ignored.\n") @Nonnull private Object value; @@ -67,8 +67,8 @@ public AttributeNameValueModel withName(String name) { } /** - * The attribute value. The type of value must match .type. Property is required and must be - * non-null. + * The attribute value. The type of value must match .type. Property must be present, but if null + * the entry is ignored. * *

(Required) */ diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalComposableRuleBasedSamplerRuleAttributePatternsModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalComposableRuleBasedSamplerRuleAttributePatternsModel.java index e2540ab176a..a22593994fa 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalComposableRuleBasedSamplerRuleAttributePatternsModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalComposableRuleBasedSamplerRuleAttributePatternsModel.java @@ -32,32 +32,32 @@ public class ExperimentalComposableRuleBasedSamplerRuleAttributePatternsModel { private String key; /** - * Configure list of value patterns to include. Values are evaluated to match as follows: * If the - * value exactly matches. * If the value matches the wildcard pattern, where '?' matches any - * single character and '*' matches any number of characters including none. If omitted, all - * values are included. + * Configure list of value patterns to include. Matching is case-sensitive. Values are evaluated + * to match as follows: * If the value exactly matches. * If the value matches the wildcard + * pattern, where '?' matches any single character and '*' matches any number of characters + * including none. If omitted, all values are included. * *

(Can be null) */ @Nullable @JsonProperty("included") @JsonPropertyDescription( - "Configure list of value patterns to include.\nValues are evaluated to match as follows:\n * If the value exactly matches.\n * If the value matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nIf omitted, all values are included.\n") + "Configure list of value patterns to include.\nMatching is case-sensitive. Values are evaluated to match as follows:\n * If the value exactly matches.\n * If the value matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nIf omitted, all values are included.\n") private List included; /** * Configure list of value patterns to exclude. Applies after .included (i.e. excluded has higher - * priority than included). Values are evaluated to match as follows: * If the value exactly - * matches. * If the value matches the wildcard pattern, where '?' matches any single character - * and '*' matches any number of characters including none. If omitted, .included attributes are - * included. + * priority than included). Matching is case-sensitive. Values are evaluated to match as follows: + * * If the value exactly matches. * If the value matches the wildcard pattern, where '?' matches + * any single character and '*' matches any number of characters including none. If omitted, + * .included attributes are included. * *

(Can be null) */ @Nullable @JsonProperty("excluded") @JsonPropertyDescription( - "Configure list of value patterns to exclude. Applies after .included (i.e. excluded has higher priority than included).\nValues are evaluated to match as follows:\n * If the value exactly matches.\n * If the value matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nIf omitted, .included attributes are included.\n") + "Configure list of value patterns to exclude. Applies after .included (i.e. excluded has higher priority than included).\nMatching is case-sensitive. Values are evaluated to match as follows:\n * If the value exactly matches.\n * If the value matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nIf omitted, .included attributes are included.\n") private List excluded; /** @@ -77,10 +77,10 @@ public ExperimentalComposableRuleBasedSamplerRuleAttributePatternsModel withKey( } /** - * Configure list of value patterns to include. Values are evaluated to match as follows: * If the - * value exactly matches. * If the value matches the wildcard pattern, where '?' matches any - * single character and '*' matches any number of characters including none. If omitted, all - * values are included. + * Configure list of value patterns to include. Matching is case-sensitive. Values are evaluated + * to match as follows: * If the value exactly matches. * If the value matches the wildcard + * pattern, where '?' matches any single character and '*' matches any number of characters + * including none. If omitted, all values are included. */ @JsonProperty("included") @Nullable @@ -96,10 +96,10 @@ public ExperimentalComposableRuleBasedSamplerRuleAttributePatternsModel withIncl /** * Configure list of value patterns to exclude. Applies after .included (i.e. excluded has higher - * priority than included). Values are evaluated to match as follows: * If the value exactly - * matches. * If the value matches the wildcard pattern, where '?' matches any single character - * and '*' matches any number of characters including none. If omitted, .included attributes are - * included. + * priority than included). Matching is case-sensitive. Values are evaluated to match as follows: + * * If the value exactly matches. * If the value matches the wildcard pattern, where '?' matches + * any single character and '*' matches any number of characters including none. If omitted, + * .included attributes are included. */ @JsonProperty("excluded") @Nullable diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalEventToSpanEventBridgeLogRecordProcessorModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalEventToSpanEventBridgeLogRecordProcessorModel.java new file mode 100644 index 00000000000..ae31e8c771a --- /dev/null +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalEventToSpanEventBridgeLogRecordProcessorModel.java @@ -0,0 +1,51 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure.declarativeconfig.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import javax.annotation.Generated; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({}) +@Generated("jsonschema2pojo") +@SuppressWarnings({"NullAway", "rawtypes", "BoxedPrimitiveEquality"}) +public class ExperimentalEventToSpanEventBridgeLogRecordProcessorModel { + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(ExperimentalEventToSpanEventBridgeLogRecordProcessorModel.class.getName()) + .append('@') + .append(Integer.toHexString(System.identityHashCode(this))) + .append('['); + if (sb.charAt((sb.length() - 1)) == ',') { + sb.setCharAt((sb.length() - 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof ExperimentalEventToSpanEventBridgeLogRecordProcessorModel) == false) { + return false; + } + ExperimentalEventToSpanEventBridgeLogRecordProcessorModel rhs = + ((ExperimentalEventToSpanEventBridgeLogRecordProcessorModel) other); + return true; + } +} diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalLoggerMatcherAndConfigModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalLoggerMatcherAndConfigModel.java index fd4ff99b648..f9b0bc43595 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalLoggerMatcherAndConfigModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalLoggerMatcherAndConfigModel.java @@ -20,7 +20,7 @@ public class ExperimentalLoggerMatcherAndConfigModel { /** - * Configure logger names to match, evaluated as follows: + * Configure logger names to match. Matching is case-sensitive, evaluated as follows: * *

* If the logger name exactly matches. * If the logger name matches the wildcard pattern, * where '?' matches any single character and '*' matches any number of characters including none. @@ -30,7 +30,7 @@ public class ExperimentalLoggerMatcherAndConfigModel { */ @JsonProperty("name") @JsonPropertyDescription( - "Configure logger names to match, evaluated as follows:\n\n * If the logger name exactly matches.\n * If the logger name matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nProperty is required and must be non-null.\n") + "Configure logger names to match. Matching is case-sensitive, evaluated as follows:\n\n * If the logger name exactly matches.\n * If the logger name matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nProperty is required and must be non-null.\n") @Nonnull private String name; @@ -40,7 +40,7 @@ public class ExperimentalLoggerMatcherAndConfigModel { private ExperimentalLoggerConfigModel config; /** - * Configure logger names to match, evaluated as follows: + * Configure logger names to match. Matching is case-sensitive, evaluated as follows: * *

* If the logger name exactly matches. * If the logger name matches the wildcard pattern, * where '?' matches any single character and '*' matches any number of characters including none. diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalMeterMatcherAndConfigModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalMeterMatcherAndConfigModel.java index 9b2b18b8753..65517f7bc5a 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalMeterMatcherAndConfigModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalMeterMatcherAndConfigModel.java @@ -20,7 +20,7 @@ public class ExperimentalMeterMatcherAndConfigModel { /** - * Configure meter names to match, evaluated as follows: + * Configure meter names to match. Matching is case-sensitive, evaluated as follows: * *

* If the meter name exactly matches. * If the meter name matches the wildcard pattern, where * '?' matches any single character and '*' matches any number of characters including none. @@ -30,7 +30,7 @@ public class ExperimentalMeterMatcherAndConfigModel { */ @JsonProperty("name") @JsonPropertyDescription( - "Configure meter names to match, evaluated as follows:\n\n * If the meter name exactly matches.\n * If the meter name matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nProperty is required and must be non-null.\n") + "Configure meter names to match. Matching is case-sensitive, evaluated as follows:\n\n * If the meter name exactly matches.\n * If the meter name matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nProperty is required and must be non-null.\n") @Nonnull private String name; @@ -40,7 +40,7 @@ public class ExperimentalMeterMatcherAndConfigModel { private ExperimentalMeterConfigModel config; /** - * Configure meter names to match, evaluated as follows: + * Configure meter names to match. Matching is case-sensitive, evaluated as follows: * *

* If the meter name exactly matches. * If the meter name matches the wildcard pattern, where * '?' matches any single character and '*' matches any number of characters including none. diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalPrometheusMetricExporterModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalPrometheusMetricExporterModel.java index b2aae00650e..73f3b0cea85 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalPrometheusMetricExporterModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalPrometheusMetricExporterModel.java @@ -20,9 +20,9 @@ @JsonPropertyOrder({ "host", "port", - "without_scope_info", - "without_target_info/development", - "with_resource_constant_labels", + "scope_info_enabled", + "target_info_enabled/development", + "resource_constant_labels", "translation_strategy" }) @Generated("jsonschema2pojo") @@ -50,33 +50,33 @@ public class ExperimentalPrometheusMetricExporterModel { private Integer port; /** - * Configure Prometheus Exporter to produce metrics without scope labels. If omitted or null, - * false is used. + * Configure Prometheus Exporter to produce metrics with scope labels. If omitted or null, true is + * used. * *

(Can be null) */ @Nullable - @JsonProperty("without_scope_info") + @JsonProperty("scope_info_enabled") @JsonPropertyDescription( - "Configure Prometheus Exporter to produce metrics without scope labels.\nIf omitted or null, false is used.\n") - private Boolean withoutScopeInfo; + "Configure Prometheus Exporter to produce metrics with scope labels.\nIf omitted or null, true is used.\n") + private Boolean scopeInfoEnabled; /** - * Configure Prometheus Exporter to produce metrics without a target info metric for the resource. - * If omitted or null, false is used. + * Configure Prometheus Exporter to produce metrics with a target info metric for the resource. If + * omitted or null, true is used. * *

(Can be null) */ @Nullable - @JsonProperty("without_target_info/development") + @JsonProperty("target_info_enabled/development") @JsonPropertyDescription( - "Configure Prometheus Exporter to produce metrics without a target info metric for the resource.\nIf omitted or null, false is used.\n") - private Boolean withoutTargetInfoDevelopment; + "Configure Prometheus Exporter to produce metrics with a target info metric for the resource.\nIf omitted or null, true is used.\n") + private Boolean targetInfoEnabledDevelopment; /** (Can be null) */ @Nullable - @JsonProperty("with_resource_constant_labels") - private IncludeExcludeModel withResourceConstantLabels; + @JsonProperty("resource_constant_labels") + private IncludeExcludeModel resourceConstantLabels; /** (Can be null) */ @Nullable @@ -109,45 +109,45 @@ public ExperimentalPrometheusMetricExporterModel withPort(Integer port) { } /** - * Configure Prometheus Exporter to produce metrics without scope labels. If omitted or null, - * false is used. + * Configure Prometheus Exporter to produce metrics with scope labels. If omitted or null, true is + * used. */ - @JsonProperty("without_scope_info") + @JsonProperty("scope_info_enabled") @Nullable - public Boolean getWithoutScopeInfo() { - return withoutScopeInfo; + public Boolean getScopeInfoEnabled() { + return scopeInfoEnabled; } - public ExperimentalPrometheusMetricExporterModel withWithoutScopeInfo(Boolean withoutScopeInfo) { - this.withoutScopeInfo = withoutScopeInfo; + public ExperimentalPrometheusMetricExporterModel withScopeInfoEnabled(Boolean scopeInfoEnabled) { + this.scopeInfoEnabled = scopeInfoEnabled; return this; } /** - * Configure Prometheus Exporter to produce metrics without a target info metric for the resource. - * If omitted or null, false is used. + * Configure Prometheus Exporter to produce metrics with a target info metric for the resource. If + * omitted or null, true is used. */ - @JsonProperty("without_target_info/development") + @JsonProperty("target_info_enabled/development") @Nullable - public Boolean getWithoutTargetInfoDevelopment() { - return withoutTargetInfoDevelopment; + public Boolean getTargetInfoEnabledDevelopment() { + return targetInfoEnabledDevelopment; } - public ExperimentalPrometheusMetricExporterModel withWithoutTargetInfoDevelopment( - Boolean withoutTargetInfoDevelopment) { - this.withoutTargetInfoDevelopment = withoutTargetInfoDevelopment; + public ExperimentalPrometheusMetricExporterModel withTargetInfoEnabledDevelopment( + Boolean targetInfoEnabledDevelopment) { + this.targetInfoEnabledDevelopment = targetInfoEnabledDevelopment; return this; } - @JsonProperty("with_resource_constant_labels") + @JsonProperty("resource_constant_labels") @Nullable - public IncludeExcludeModel getWithResourceConstantLabels() { - return withResourceConstantLabels; + public IncludeExcludeModel getResourceConstantLabels() { + return resourceConstantLabels; } - public ExperimentalPrometheusMetricExporterModel withWithResourceConstantLabels( - IncludeExcludeModel withResourceConstantLabels) { - this.withResourceConstantLabels = withResourceConstantLabels; + public ExperimentalPrometheusMetricExporterModel withResourceConstantLabels( + IncludeExcludeModel resourceConstantLabels) { + this.resourceConstantLabels = resourceConstantLabels; return this; } @@ -180,21 +180,20 @@ public String toString() { sb.append('='); sb.append(((this.port == null) ? "" : this.port)); sb.append(','); - sb.append("withoutScopeInfo"); + sb.append("scopeInfoEnabled"); sb.append('='); - sb.append(((this.withoutScopeInfo == null) ? "" : this.withoutScopeInfo)); + sb.append(((this.scopeInfoEnabled == null) ? "" : this.scopeInfoEnabled)); sb.append(','); - sb.append("withoutTargetInfoDevelopment"); + sb.append("targetInfoEnabledDevelopment"); sb.append('='); sb.append( - ((this.withoutTargetInfoDevelopment == null) + ((this.targetInfoEnabledDevelopment == null) ? "" - : this.withoutTargetInfoDevelopment)); + : this.targetInfoEnabledDevelopment)); sb.append(','); - sb.append("withResourceConstantLabels"); + sb.append("resourceConstantLabels"); sb.append('='); - sb.append( - ((this.withResourceConstantLabels == null) ? "" : this.withResourceConstantLabels)); + sb.append(((this.resourceConstantLabels == null) ? "" : this.resourceConstantLabels)); sb.append(','); sb.append("translationStrategy"); sb.append('='); @@ -212,22 +211,20 @@ public String toString() { public int hashCode() { int result = 1; result = ((result * 31) + ((this.host == null) ? 0 : this.host.hashCode())); - result = - ((result * 31) + ((this.withoutScopeInfo == null) ? 0 : this.withoutScopeInfo.hashCode())); - result = ((result * 31) + ((this.port == null) ? 0 : this.port.hashCode())); result = ((result * 31) - + ((this.withoutTargetInfoDevelopment == null) + + ((this.targetInfoEnabledDevelopment == null) ? 0 - : this.withoutTargetInfoDevelopment.hashCode())); + : this.targetInfoEnabledDevelopment.hashCode())); result = ((result * 31) - + ((this.withResourceConstantLabels == null) - ? 0 - : this.withResourceConstantLabels.hashCode())); + + ((this.resourceConstantLabels == null) ? 0 : this.resourceConstantLabels.hashCode())); + result = ((result * 31) + ((this.port == null) ? 0 : this.port.hashCode())); result = ((result * 31) + ((this.translationStrategy == null) ? 0 : this.translationStrategy.hashCode())); + result = + ((result * 31) + ((this.scopeInfoEnabled == null) ? 0 : this.scopeInfoEnabled.hashCode())); return result; } @@ -242,21 +239,20 @@ public boolean equals(Object other) { ExperimentalPrometheusMetricExporterModel rhs = ((ExperimentalPrometheusMetricExporterModel) other); return (((((((this.host == rhs.host) || ((this.host != null) && this.host.equals(rhs.host))) - && ((this.withoutScopeInfo == rhs.withoutScopeInfo) - || ((this.withoutScopeInfo != null) - && this.withoutScopeInfo.equals(rhs.withoutScopeInfo)))) - && ((this.port == rhs.port) - || ((this.port != null) && this.port.equals(rhs.port)))) - && ((this.withoutTargetInfoDevelopment == rhs.withoutTargetInfoDevelopment) - || ((this.withoutTargetInfoDevelopment != null) - && this.withoutTargetInfoDevelopment.equals( - rhs.withoutTargetInfoDevelopment)))) - && ((this.withResourceConstantLabels == rhs.withResourceConstantLabels) - || ((this.withResourceConstantLabels != null) - && this.withResourceConstantLabels.equals(rhs.withResourceConstantLabels)))) - && ((this.translationStrategy == rhs.translationStrategy) - || ((this.translationStrategy != null) - && this.translationStrategy.equals(rhs.translationStrategy)))); + && ((this.targetInfoEnabledDevelopment == rhs.targetInfoEnabledDevelopment) + || ((this.targetInfoEnabledDevelopment != null) + && this.targetInfoEnabledDevelopment.equals( + rhs.targetInfoEnabledDevelopment)))) + && ((this.resourceConstantLabels == rhs.resourceConstantLabels) + || ((this.resourceConstantLabels != null) + && this.resourceConstantLabels.equals(rhs.resourceConstantLabels)))) + && ((this.port == rhs.port) || ((this.port != null) && this.port.equals(rhs.port)))) + && ((this.translationStrategy == rhs.translationStrategy) + || ((this.translationStrategy != null) + && this.translationStrategy.equals(rhs.translationStrategy)))) + && ((this.scopeInfoEnabled == rhs.scopeInfoEnabled) + || ((this.scopeInfoEnabled != null) + && this.scopeInfoEnabled.equals(rhs.scopeInfoEnabled)))); } @Generated("jsonschema2pojo") diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalTracerMatcherAndConfigModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalTracerMatcherAndConfigModel.java index 262246fb068..f89f2af9679 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalTracerMatcherAndConfigModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/ExperimentalTracerMatcherAndConfigModel.java @@ -20,7 +20,7 @@ public class ExperimentalTracerMatcherAndConfigModel { /** - * Configure tracer names to match, evaluated as follows: + * Configure tracer names to match. Matching is case-sensitive, evaluated as follows: * *

* If the tracer name exactly matches. * If the tracer name matches the wildcard pattern, * where '?' matches any single character and '*' matches any number of characters including none. @@ -30,7 +30,7 @@ public class ExperimentalTracerMatcherAndConfigModel { */ @JsonProperty("name") @JsonPropertyDescription( - "Configure tracer names to match, evaluated as follows:\n\n * If the tracer name exactly matches.\n * If the tracer name matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nProperty is required and must be non-null.\n") + "Configure tracer names to match. Matching is case-sensitive, evaluated as follows:\n\n * If the tracer name exactly matches.\n * If the tracer name matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nProperty is required and must be non-null.\n") @Nonnull private String name; @@ -40,7 +40,7 @@ public class ExperimentalTracerMatcherAndConfigModel { private ExperimentalTracerConfigModel config; /** - * Configure tracer names to match, evaluated as follows: + * Configure tracer names to match. Matching is case-sensitive, evaluated as follows: * *

* If the tracer name exactly matches. * If the tracer name matches the wildcard pattern, * where '?' matches any single character and '*' matches any number of characters including none. diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IdGeneratorModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IdGeneratorModel.java new file mode 100644 index 00000000000..d9464dc849f --- /dev/null +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IdGeneratorModel.java @@ -0,0 +1,108 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure.declarativeconfig.model; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.LinkedHashMap; +import java.util.Map; +import javax.annotation.Generated; +import javax.annotation.Nullable; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"random"}) +@Generated("jsonschema2pojo") +@SuppressWarnings({"NullAway", "rawtypes", "BoxedPrimitiveEquality"}) +public class IdGeneratorModel { + + /** (Can be null) */ + @Nullable + @JsonProperty("random") + private RandomIdGeneratorModel random; + + @JsonIgnore + private Map additionalProperties = + new LinkedHashMap(); + + @JsonProperty("random") + @Nullable + public RandomIdGeneratorModel getRandom() { + return random; + } + + public IdGeneratorModel withRandom(RandomIdGeneratorModel random) { + this.random = random; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, IdGeneratorPropertyModel value) { + this.additionalProperties.put(name, value); + } + + public IdGeneratorModel withAdditionalProperty(String name, IdGeneratorPropertyModel value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(IdGeneratorModel.class.getName()) + .append('@') + .append(Integer.toHexString(System.identityHashCode(this))) + .append('['); + sb.append("random"); + sb.append('='); + sb.append(((this.random == null) ? "" : this.random)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null) ? "" : this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length() - 1)) == ',') { + sb.setCharAt((sb.length() - 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result * 31) + ((this.random == null) ? 0 : this.random.hashCode())); + result = + ((result * 31) + + ((this.additionalProperties == null) ? 0 : this.additionalProperties.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof IdGeneratorModel) == false) { + return false; + } + IdGeneratorModel rhs = ((IdGeneratorModel) other); + return (((this.random == rhs.random) + || ((this.random != null) && this.random.equals(rhs.random))) + && ((this.additionalProperties == rhs.additionalProperties) + || ((this.additionalProperties != null) + && this.additionalProperties.equals(rhs.additionalProperties)))); + } +} diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IdGeneratorPropertyModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IdGeneratorPropertyModel.java new file mode 100644 index 00000000000..e888e97ad18 --- /dev/null +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IdGeneratorPropertyModel.java @@ -0,0 +1,82 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure.declarativeconfig.model; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.LinkedHashMap; +import java.util.Map; +import javax.annotation.Generated; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({}) +@Generated("jsonschema2pojo") +@SuppressWarnings({"NullAway", "rawtypes", "BoxedPrimitiveEquality"}) +public class IdGeneratorPropertyModel { + + @JsonIgnore + private Map additionalProperties = new LinkedHashMap(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public IdGeneratorPropertyModel withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(IdGeneratorPropertyModel.class.getName()) + .append('@') + .append(Integer.toHexString(System.identityHashCode(this))) + .append('['); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null) ? "" : this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length() - 1)) == ',') { + sb.setCharAt((sb.length() - 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = + ((result * 31) + + ((this.additionalProperties == null) ? 0 : this.additionalProperties.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof IdGeneratorPropertyModel) == false) { + return false; + } + IdGeneratorPropertyModel rhs = ((IdGeneratorPropertyModel) other); + return ((this.additionalProperties == rhs.additionalProperties) + || ((this.additionalProperties != null) + && this.additionalProperties.equals(rhs.additionalProperties))); + } +} diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IncludeExcludeModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IncludeExcludeModel.java index 029c91aa201..dbd6c594f7f 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IncludeExcludeModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/IncludeExcludeModel.java @@ -20,39 +20,39 @@ public class IncludeExcludeModel { /** - * Configure list of value patterns to include. Values are evaluated to match as follows: * If the - * value exactly matches. * If the value matches the wildcard pattern, where '?' matches any - * single character and '*' matches any number of characters including none. If omitted, all - * values are included. + * Configure list of value patterns to include. Matching is case-sensitive. Values are evaluated + * to match as follows: * If the value exactly matches. * If the value matches the wildcard + * pattern, where '?' matches any single character and '*' matches any number of characters + * including none. If omitted, all values are included. * *

(Can be null) */ @Nullable @JsonProperty("included") @JsonPropertyDescription( - "Configure list of value patterns to include.\nValues are evaluated to match as follows:\n * If the value exactly matches.\n * If the value matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nIf omitted, all values are included.\n") + "Configure list of value patterns to include.\nMatching is case-sensitive. Values are evaluated to match as follows:\n * If the value exactly matches.\n * If the value matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nIf omitted, all values are included.\n") private List included; /** * Configure list of value patterns to exclude. Applies after .included (i.e. excluded has higher - * priority than included). Values are evaluated to match as follows: * If the value exactly - * matches. * If the value matches the wildcard pattern, where '?' matches any single character - * and '*' matches any number of characters including none. If omitted, .included attributes are - * included. + * priority than included). Matching is case-sensitive. Values are evaluated to match as follows: + * * If the value exactly matches. * If the value matches the wildcard pattern, where '?' matches + * any single character and '*' matches any number of characters including none. If omitted, + * .included attributes are included. * *

(Can be null) */ @Nullable @JsonProperty("excluded") @JsonPropertyDescription( - "Configure list of value patterns to exclude. Applies after .included (i.e. excluded has higher priority than included).\nValues are evaluated to match as follows:\n * If the value exactly matches.\n * If the value matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nIf omitted, .included attributes are included.\n") + "Configure list of value patterns to exclude. Applies after .included (i.e. excluded has higher priority than included).\nMatching is case-sensitive. Values are evaluated to match as follows:\n * If the value exactly matches.\n * If the value matches the wildcard pattern, where '?' matches any single character and '*' matches any number of characters including none.\nIf omitted, .included attributes are included.\n") private List excluded; /** - * Configure list of value patterns to include. Values are evaluated to match as follows: * If the - * value exactly matches. * If the value matches the wildcard pattern, where '?' matches any - * single character and '*' matches any number of characters including none. If omitted, all - * values are included. + * Configure list of value patterns to include. Matching is case-sensitive. Values are evaluated + * to match as follows: * If the value exactly matches. * If the value matches the wildcard + * pattern, where '?' matches any single character and '*' matches any number of characters + * including none. If omitted, all values are included. */ @JsonProperty("included") @Nullable @@ -67,10 +67,10 @@ public IncludeExcludeModel withIncluded(List included) { /** * Configure list of value patterns to exclude. Applies after .included (i.e. excluded has higher - * priority than included). Values are evaluated to match as follows: * If the value exactly - * matches. * If the value matches the wildcard pattern, where '?' matches any single character - * and '*' matches any number of characters including none. If omitted, .included attributes are - * included. + * priority than included). Matching is case-sensitive. Values are evaluated to match as follows: + * * If the value exactly matches. * If the value matches the wildcard pattern, where '?' matches + * any single character and '*' matches any number of characters including none. If omitted, + * .included attributes are included. */ @JsonProperty("excluded") @Nullable diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/LogRecordProcessorModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/LogRecordProcessorModel.java index fc53cfe18d8..c2c326d0ac6 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/LogRecordProcessorModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/LogRecordProcessorModel.java @@ -17,7 +17,7 @@ import javax.annotation.Nullable; @JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({"batch", "simple"}) +@JsonPropertyOrder({"batch", "simple", "event_to_span_event_bridge/development"}) @Generated("jsonschema2pojo") @SuppressWarnings({"NullAway", "rawtypes", "BoxedPrimitiveEquality"}) public class LogRecordProcessorModel { @@ -30,6 +30,12 @@ public class LogRecordProcessorModel { @JsonProperty("simple") private SimpleLogRecordProcessorModel simple; + /** (Can be null) */ + @Nullable + @JsonProperty("event_to_span_event_bridge/development") + private ExperimentalEventToSpanEventBridgeLogRecordProcessorModel + eventToSpanEventBridgeDevelopment; + @JsonIgnore private Map additionalProperties = new LinkedHashMap(); @@ -56,6 +62,19 @@ public LogRecordProcessorModel withSimple(SimpleLogRecordProcessorModel simple) return this; } + @JsonProperty("event_to_span_event_bridge/development") + @Nullable + public ExperimentalEventToSpanEventBridgeLogRecordProcessorModel + getEventToSpanEventBridgeDevelopment() { + return eventToSpanEventBridgeDevelopment; + } + + public LogRecordProcessorModel withEventToSpanEventBridgeDevelopment( + ExperimentalEventToSpanEventBridgeLogRecordProcessorModel eventToSpanEventBridgeDevelopment) { + this.eventToSpanEventBridgeDevelopment = eventToSpanEventBridgeDevelopment; + return this; + } + @JsonAnyGetter public Map getAdditionalProperties() { return this.additionalProperties; @@ -87,6 +106,13 @@ public String toString() { sb.append('='); sb.append(((this.simple == null) ? "" : this.simple)); sb.append(','); + sb.append("eventToSpanEventBridgeDevelopment"); + sb.append('='); + sb.append( + ((this.eventToSpanEventBridgeDevelopment == null) + ? "" + : this.eventToSpanEventBridgeDevelopment)); + sb.append(','); sb.append("additionalProperties"); sb.append('='); sb.append(((this.additionalProperties == null) ? "" : this.additionalProperties)); @@ -107,6 +133,11 @@ public int hashCode() { result = ((result * 31) + ((this.additionalProperties == null) ? 0 : this.additionalProperties.hashCode())); + result = + ((result * 31) + + ((this.eventToSpanEventBridgeDevelopment == null) + ? 0 + : this.eventToSpanEventBridgeDevelopment.hashCode())); return result; } @@ -119,11 +150,15 @@ public boolean equals(Object other) { return false; } LogRecordProcessorModel rhs = ((LogRecordProcessorModel) other); - return ((((this.batch == rhs.batch) || ((this.batch != null) && this.batch.equals(rhs.batch))) - && ((this.simple == rhs.simple) - || ((this.simple != null) && this.simple.equals(rhs.simple)))) - && ((this.additionalProperties == rhs.additionalProperties) - || ((this.additionalProperties != null) - && this.additionalProperties.equals(rhs.additionalProperties)))); + return (((((this.batch == rhs.batch) || ((this.batch != null) && this.batch.equals(rhs.batch))) + && ((this.simple == rhs.simple) + || ((this.simple != null) && this.simple.equals(rhs.simple)))) + && ((this.additionalProperties == rhs.additionalProperties) + || ((this.additionalProperties != null) + && this.additionalProperties.equals(rhs.additionalProperties)))) + && ((this.eventToSpanEventBridgeDevelopment == rhs.eventToSpanEventBridgeDevelopment) + || ((this.eventToSpanEventBridgeDevelopment != null) + && this.eventToSpanEventBridgeDevelopment.equals( + rhs.eventToSpanEventBridgeDevelopment)))); } } diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/PeriodicMetricReaderModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/PeriodicMetricReaderModel.java index 1f6b13d9231..31e2004d74c 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/PeriodicMetricReaderModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/PeriodicMetricReaderModel.java @@ -15,7 +15,14 @@ import javax.annotation.Nullable; @JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({"interval", "timeout", "exporter", "producers", "cardinality_limits"}) +@JsonPropertyOrder({ + "interval", + "timeout", + "max_export_batch_size/development", + "exporter", + "producers", + "cardinality_limits" +}) @Generated("jsonschema2pojo") @SuppressWarnings({"NullAway", "rawtypes", "BoxedPrimitiveEquality"}) public class PeriodicMetricReaderModel { @@ -44,6 +51,17 @@ public class PeriodicMetricReaderModel { "Configure maximum allowed time (in milliseconds) to export data. \nValue must be non-negative. A value of 0 indicates no limit (infinity).\nIf omitted or null, 30000 is used.\n") private Integer timeout; + /** + * Configure maximum export batch size. If omitted or null, no limit is used. + * + *

(Can be null) + */ + @Nullable + @JsonProperty("max_export_batch_size/development") + @JsonPropertyDescription( + "Configure maximum export batch size.\nIf omitted or null, no limit is used.\n") + private Integer maxExportBatchSizeDevelopment; + /** (Required) */ @JsonProperty("exporter") @Nonnull @@ -95,6 +113,19 @@ public PeriodicMetricReaderModel withTimeout(Integer timeout) { return this; } + /** Configure maximum export batch size. If omitted or null, no limit is used. */ + @JsonProperty("max_export_batch_size/development") + @Nullable + public Integer getMaxExportBatchSizeDevelopment() { + return maxExportBatchSizeDevelopment; + } + + public PeriodicMetricReaderModel withMaxExportBatchSizeDevelopment( + Integer maxExportBatchSizeDevelopment) { + this.maxExportBatchSizeDevelopment = maxExportBatchSizeDevelopment; + return this; + } + /** (Required) */ @JsonProperty("exporter") @Nullable @@ -145,6 +176,13 @@ public String toString() { sb.append('='); sb.append(((this.timeout == null) ? "" : this.timeout)); sb.append(','); + sb.append("maxExportBatchSizeDevelopment"); + sb.append('='); + sb.append( + ((this.maxExportBatchSizeDevelopment == null) + ? "" + : this.maxExportBatchSizeDevelopment)); + sb.append(','); sb.append("exporter"); sb.append('='); sb.append(((this.exporter == null) ? "" : this.exporter)); @@ -174,6 +212,11 @@ public int hashCode() { ((result * 31) + ((this.cardinalityLimits == null) ? 0 : this.cardinalityLimits.hashCode())); result = ((result * 31) + ((this.timeout == null) ? 0 : this.timeout.hashCode())); + result = + ((result * 31) + + ((this.maxExportBatchSizeDevelopment == null) + ? 0 + : this.maxExportBatchSizeDevelopment.hashCode())); result = ((result * 31) + ((this.producers == null) ? 0 : this.producers.hashCode())); return result; } @@ -187,15 +230,19 @@ public boolean equals(Object other) { return false; } PeriodicMetricReaderModel rhs = ((PeriodicMetricReaderModel) other); - return ((((((this.interval == rhs.interval) - || ((this.interval != null) && this.interval.equals(rhs.interval))) - && ((this.exporter == rhs.exporter) - || ((this.exporter != null) && this.exporter.equals(rhs.exporter)))) - && ((this.cardinalityLimits == rhs.cardinalityLimits) - || ((this.cardinalityLimits != null) - && this.cardinalityLimits.equals(rhs.cardinalityLimits)))) - && ((this.timeout == rhs.timeout) - || ((this.timeout != null) && this.timeout.equals(rhs.timeout)))) + return (((((((this.interval == rhs.interval) + || ((this.interval != null) && this.interval.equals(rhs.interval))) + && ((this.exporter == rhs.exporter) + || ((this.exporter != null) && this.exporter.equals(rhs.exporter)))) + && ((this.cardinalityLimits == rhs.cardinalityLimits) + || ((this.cardinalityLimits != null) + && this.cardinalityLimits.equals(rhs.cardinalityLimits)))) + && ((this.timeout == rhs.timeout) + || ((this.timeout != null) && this.timeout.equals(rhs.timeout)))) + && ((this.maxExportBatchSizeDevelopment == rhs.maxExportBatchSizeDevelopment) + || ((this.maxExportBatchSizeDevelopment != null) + && this.maxExportBatchSizeDevelopment.equals( + rhs.maxExportBatchSizeDevelopment)))) && ((this.producers == rhs.producers) || ((this.producers != null) && this.producers.equals(rhs.producers)))); } diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/RandomIdGeneratorModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/RandomIdGeneratorModel.java new file mode 100644 index 00000000000..14883deba3d --- /dev/null +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/RandomIdGeneratorModel.java @@ -0,0 +1,50 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure.declarativeconfig.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import javax.annotation.Generated; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({}) +@Generated("jsonschema2pojo") +@SuppressWarnings({"NullAway", "rawtypes", "BoxedPrimitiveEquality"}) +public class RandomIdGeneratorModel { + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(RandomIdGeneratorModel.class.getName()) + .append('@') + .append(Integer.toHexString(System.identityHashCode(this))) + .append('['); + if (sb.charAt((sb.length() - 1)) == ',') { + sb.setCharAt((sb.length() - 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof RandomIdGeneratorModel) == false) { + return false; + } + RandomIdGeneratorModel rhs = ((RandomIdGeneratorModel) other); + return true; + } +} diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/TracerProviderModel.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/TracerProviderModel.java index e8514146730..05cbdc5c90f 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/TracerProviderModel.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model/TracerProviderModel.java @@ -15,7 +15,13 @@ import javax.annotation.Nullable; @JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({"processors", "limits", "sampler", "tracer_configurator/development"}) +@JsonPropertyOrder({ + "processors", + "limits", + "sampler", + "id_generator", + "tracer_configurator/development" +}) @Generated("jsonschema2pojo") @SuppressWarnings({"NullAway", "rawtypes", "BoxedPrimitiveEquality"}) public class TracerProviderModel { @@ -41,6 +47,11 @@ public class TracerProviderModel { @JsonProperty("sampler") private SamplerModel sampler; + /** (Can be null) */ + @Nullable + @JsonProperty("id_generator") + private IdGeneratorModel idGenerator; + /** (Can be null) */ @Nullable @JsonProperty("tracer_configurator/development") @@ -84,6 +95,17 @@ public TracerProviderModel withSampler(SamplerModel sampler) { return this; } + @JsonProperty("id_generator") + @Nullable + public IdGeneratorModel getIdGenerator() { + return idGenerator; + } + + public TracerProviderModel withIdGenerator(IdGeneratorModel idGenerator) { + this.idGenerator = idGenerator; + return this; + } + @JsonProperty("tracer_configurator/development") @Nullable public ExperimentalTracerConfiguratorModel getTracerConfiguratorDevelopment() { @@ -115,6 +137,10 @@ public String toString() { sb.append('='); sb.append(((this.sampler == null) ? "" : this.sampler)); sb.append(','); + sb.append("idGenerator"); + sb.append('='); + sb.append(((this.idGenerator == null) ? "" : this.idGenerator)); + sb.append(','); sb.append("tracerConfiguratorDevelopment"); sb.append('='); sb.append( @@ -133,6 +159,7 @@ public String toString() { @Override public int hashCode() { int result = 1; + result = ((result * 31) + ((this.idGenerator == null) ? 0 : this.idGenerator.hashCode())); result = ((result * 31) + ((this.tracerConfiguratorDevelopment == null) @@ -153,10 +180,12 @@ public boolean equals(Object other) { return false; } TracerProviderModel rhs = ((TracerProviderModel) other); - return (((((this.tracerConfiguratorDevelopment == rhs.tracerConfiguratorDevelopment) - || ((this.tracerConfiguratorDevelopment != null) - && this.tracerConfiguratorDevelopment.equals( - rhs.tracerConfiguratorDevelopment))) + return ((((((this.idGenerator == rhs.idGenerator) + || ((this.idGenerator != null) && this.idGenerator.equals(rhs.idGenerator))) + && ((this.tracerConfiguratorDevelopment == rhs.tracerConfiguratorDevelopment) + || ((this.tracerConfiguratorDevelopment != null) + && this.tracerConfiguratorDevelopment.equals( + rhs.tracerConfiguratorDevelopment)))) && ((this.processors == rhs.processors) || ((this.processors != null) && this.processors.equals(rhs.processors)))) && ((this.limits == rhs.limits) diff --git a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigurationCreateTest.java b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigurationCreateTest.java index 7ee1e7e0377..89674fd798d 100644 --- a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigurationCreateTest.java +++ b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigurationCreateTest.java @@ -95,7 +95,10 @@ void parseAndCreate_Examples(File example, @TempDir Path tempDir) "cert_file: .*\n", "cert_file: " + clientCertificatePath.replace("\\", "\\\\") - + System.lineSeparator()); + + System.lineSeparator()) + // A snippet references a custom id generator named my_custom_id_generator. Replace with + // one named test, which we provide via SPI + .replace("my_custom_id_generator", "test"); InputStream is = new ByteArrayInputStream(rewrittenExampleContent.getBytes(StandardCharsets.UTF_8)); diff --git a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/IdGeneratorFactoryTest.java b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/IdGeneratorFactoryTest.java new file mode 100644 index 00000000000..236b6f0380a --- /dev/null +++ b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/IdGeneratorFactoryTest.java @@ -0,0 +1,72 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure.declarativeconfig; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.common.ComponentLoader; +import io.opentelemetry.internal.testing.CleanupExtension; +import io.opentelemetry.sdk.autoconfigure.declarativeconfig.component.IdGeneratorComponentProvider; +import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.IdGeneratorModel; +import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.IdGeneratorPropertyModel; +import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.RandomIdGeneratorModel; +import io.opentelemetry.sdk.trace.IdGenerator; +import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class IdGeneratorFactoryTest { + + @RegisterExtension CleanupExtension cleanup = new CleanupExtension(); + + private static final DeclarativeConfigContext context = + new DeclarativeConfigContext( + ComponentLoader.forClassLoader(IdGeneratorFactoryTest.class.getClassLoader())); + + @BeforeEach + void setup() { + context.setBuilder(new DeclarativeConfigurationBuilder()); + } + + @ParameterizedTest + @MethodSource("createTestCases") + void create(IdGeneratorModel model, IdGenerator expectedIdGenerator) { + IdGenerator idGenerator = IdGeneratorFactory.getInstance().create(model, context); + assertThat(idGenerator.toString()).isEqualTo(expectedIdGenerator.toString()); + } + + private static Stream createTestCases() { + return Stream.of( + Arguments.of( + new IdGeneratorModel().withRandom(new RandomIdGeneratorModel()), IdGenerator.random()), + Arguments.of( + new IdGeneratorModel().withAdditionalProperty("test", new IdGeneratorPropertyModel()), + IdGeneratorComponentProvider.TestIdGenerator.create())); + } + + @ParameterizedTest + @MethodSource("createInvalidTestCases") + void create_Invalid(IdGeneratorModel model, String expectedMessage) { + assertThatThrownBy(() -> IdGeneratorFactory.getInstance().create(model, context)) + .isInstanceOf(DeclarativeConfigException.class) + .hasMessage(expectedMessage); + } + + private static Stream createInvalidTestCases() { + return Stream.of( + Arguments.of( + new IdGeneratorModel() + .withAdditionalProperty( + "unknown_key", + new IdGeneratorPropertyModel().withAdditionalProperty("key1", "value")), + "No component provider detected for io.opentelemetry.sdk.trace.IdGenerator with name \"unknown_key\".")); + } +} diff --git a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/LogRecordProcessorFactoryTest.java b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/LogRecordProcessorFactoryTest.java index 9e2c313a5d7..3a542a65dc6 100644 --- a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/LogRecordProcessorFactoryTest.java +++ b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/LogRecordProcessorFactoryTest.java @@ -14,6 +14,7 @@ import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.component.LogRecordProcessorComponentProvider; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.BatchLogRecordProcessorModel; +import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalEventToSpanEventBridgeLogRecordProcessorModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.LogRecordExporterModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.LogRecordProcessorModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.LogRecordProcessorPropertyModel; @@ -95,9 +96,8 @@ private static Stream createTestCases() { Arguments.argumentSet( "event_to_span_event_bridge/development", new LogRecordProcessorModel() - .withAdditionalProperty( - "event_to_span_event_bridge/development", - new LogRecordProcessorPropertyModel()), + .withEventToSpanEventBridgeDevelopment( + new ExperimentalEventToSpanEventBridgeLogRecordProcessorModel()), EventToSpanEventBridge.create()), Arguments.argumentSet( "spi test processor", diff --git a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/MetricReaderFactoryTest.java b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/MetricReaderFactoryTest.java index 040f9a1e19c..1d6e7ed4f9a 100644 --- a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/MetricReaderFactoryTest.java +++ b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/MetricReaderFactoryTest.java @@ -10,10 +10,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import io.github.netmikey.logunit.api.LogCapturer; import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; @@ -32,221 +32,178 @@ import io.opentelemetry.sdk.metrics.InstrumentType; import io.opentelemetry.sdk.metrics.export.MetricReader; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; -import java.io.Closeable; +import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil; import java.io.IOException; import java.net.ServerSocket; import java.time.Duration; -import java.util.ArrayList; -import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; class MetricReaderFactoryTest { @RegisterExtension CleanupExtension cleanup = new CleanupExtension(); - @RegisterExtension - LogCapturer logCapturer = - LogCapturer.create().captureForLogger(DeclarativeConfiguration.class.getName()); - - private final DeclarativeConfigContext context = + private static final DeclarativeConfigContext context = spy( new DeclarativeConfigContext( - ComponentLoader.forClassLoader(getClass().getClassLoader()))); + ComponentLoader.forClassLoader(MetricReaderFactoryTest.class.getClassLoader()))); @BeforeEach void setup() { context.setBuilder(new DeclarativeConfigurationBuilder()); + clearInvocations(context); } - @Test - void create_PeriodicNullExporter() { - assertThatThrownBy( - () -> - MetricReaderFactory.getInstance() - .create( - new MetricReaderModel().withPeriodic(new PeriodicMetricReaderModel()), - context)) - .isInstanceOf(DeclarativeConfigException.class) - .hasMessage("periodic metric reader exporter is required but is null"); - } - - @Test - void create_PeriodicDefaults() { - List closeables = new ArrayList<>(); - PeriodicMetricReader expectedReader = - PeriodicMetricReader.builder( - OtlpHttpMetricExporter.builder().setComponentLoader(context).build()) - .build(); + @ParameterizedTest + @MethodSource("createTestCases") + void create( + MetricReaderModel model, + MetricReader expectedReader, + Integer expectedDefaultCardinalityLimit, + boolean verifyLoadComponent) { cleanup.addCloseable(expectedReader); - MetricReaderAndCardinalityLimits readerAndCardinalityLimits = - MetricReaderFactory.getInstance() - .create( - new MetricReaderModel() - .withPeriodic( - new PeriodicMetricReaderModel() - .withExporter( - new PushMetricExporterModel() - .withOtlpHttp(new OtlpHttpMetricExporterModel()))), - context); + MetricReaderFactory.getInstance().create(model, context); MetricReader reader = readerAndCardinalityLimits.getMetricReader(); cleanup.addCloseable(reader); - cleanup.addCloseables(closeables); assertThat(reader.toString()).isEqualTo(expectedReader.toString()); - assertThat(readerAndCardinalityLimits.getCardinalityLimitsSelector()).isNull(); - } - - @Test - void create_PeriodicConfigured() { - List closeables = new ArrayList<>(); - MetricReader expectedReader = - PeriodicMetricReader.builder( - OtlpHttpMetricExporter.builder().setComponentLoader(context).build()) - .setInterval(Duration.ofMillis(1)) - .build(); - cleanup.addCloseable(expectedReader); - - MetricReaderAndCardinalityLimits readerAndCardinalityLimits = - MetricReaderFactory.getInstance() - .create( - new MetricReaderModel() - .withPeriodic( - new PeriodicMetricReaderModel() - .withExporter( - new PushMetricExporterModel() - .withOtlpHttp(new OtlpHttpMetricExporterModel())) - .withInterval(1) - .withCardinalityLimits(new CardinalityLimitsModel().withDefault(100))), - context); - MetricReader reader = readerAndCardinalityLimits.getMetricReader(); - cleanup.addCloseable(reader); - cleanup.addCloseables(closeables); - - assertThat(reader.toString()).isEqualTo(expectedReader.toString()); - assertThat( - readerAndCardinalityLimits - .getCardinalityLimitsSelector() - .getCardinalityLimit(InstrumentType.COUNTER)) - .isEqualTo(100); - } - - @Test - void create_PullPrometheusDefault() throws IOException { - int port = randomAvailablePort(); - List closeables = new ArrayList<>(); - PrometheusHttpServer expectedReader = PrometheusHttpServer.builder().setPort(port).build(); - // Close the reader to avoid port conflict with the new instance created by MetricReaderFactory - expectedReader.close(); - - MetricReaderAndCardinalityLimits readerAndCardinalityLimits = - MetricReaderFactory.getInstance() - .create( - new MetricReaderModel() - .withPull( - new PullMetricReaderModel() - .withExporter( - new PullMetricExporterModel() - .withPrometheusDevelopment( - new ExperimentalPrometheusMetricExporterModel() - .withPort(port)))), - context); - MetricReader reader = readerAndCardinalityLimits.getMetricReader(); - cleanup.addCloseable(reader); - cleanup.addCloseables(closeables); - - 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), any(ConfigKeyValue.class)); + if (expectedDefaultCardinalityLimit == null) { + assertThat(readerAndCardinalityLimits.getCardinalityLimitsSelector()).isNull(); + } else { + assertThat( + readerAndCardinalityLimits + .getCardinalityLimitsSelector() + .getCardinalityLimit(InstrumentType.COUNTER)) + .isEqualTo(expectedDefaultCardinalityLimit); + } + if (verifyLoadComponent) { + verify(context).loadComponent(eq(MetricReader.class), any(ConfigKeyValue.class)); + } } - @Test - void create_PullPrometheusConfigured() throws IOException { - int port = randomAvailablePort(); - - List closeables = new ArrayList<>(); - PrometheusHttpServer expectedReader = + /** + * Find a random unused port. There's a small race if another process takes it before we + * initialize. Consider adding retries to this test if it flakes, presumably it never will on CI + * since there's no prometheus there blocking the well-known port. + */ + static Stream createTestCases() throws IOException { + int prometheusDefaultPort = randomAvailablePort(); + PrometheusHttpServer prometheusDefaultExpected = + PrometheusHttpServer.builder().setPort(prometheusDefaultPort).build(); + // Close immediately to release the port before MetricReaderFactory creates a server on it + prometheusDefaultExpected.close(); + + int prometheusConfiguredPort = randomAvailablePort(); + PrometheusHttpServer prometheusConfiguredExpected = PrometheusHttpServer.builder() .setHost("localhost") - .setPort(port) + .setPort(prometheusConfiguredPort) .setAllowedResourceAttributesFilter( IncludeExcludePredicate.createPatternMatching( singletonList("foo"), singletonList("bar"))) .build(); - // Close the reader to avoid port conflict with the new instance created by MetricReaderFactory - expectedReader.close(); - - MetricReaderAndCardinalityLimits readerAndCardinalityLimits = - MetricReaderFactory.getInstance() - .create( - new MetricReaderModel() - .withPull( - new PullMetricReaderModel() - .withCardinalityLimits(new CardinalityLimitsModel().withDefault(100)) - .withExporter( - new PullMetricExporterModel() - .withPrometheusDevelopment( - new ExperimentalPrometheusMetricExporterModel() - .withHost("localhost") - .withPort(port) - .withWithResourceConstantLabels( - new IncludeExcludeModel() - .withIncluded(singletonList("foo")) - .withExcluded(singletonList("bar"))) - .withWithoutScopeInfo(false) - .withWithoutTargetInfoDevelopment(false) - .withTranslationStrategy( - ExperimentalPrometheusMetricExporterModel - .ExperimentalPrometheusTranslationStrategy - .UNDERSCORE_ESCAPING_WITHOUT_SUFFIXES_DEVELOPMENT)))), - context); - MetricReader reader = readerAndCardinalityLimits.getMetricReader(); - cleanup.addCloseable(reader); - cleanup.addCloseables(closeables); - - assertThat(reader.toString()).isEqualTo(expectedReader.toString()); - assertThat( - readerAndCardinalityLimits - .getCardinalityLimitsSelector() - .getCardinalityLimit(InstrumentType.COUNTER)) - .isEqualTo(100); - // TODO(jack-berg): validate prometheus component provider was invoked with correct arguments - verify(context).loadComponent(eq(MetricReader.class), any(ConfigKeyValue.class)); + // Close immediately to release the port before MetricReaderFactory creates a server on it + prometheusConfiguredExpected.close(); + + return Stream.of( + Arguments.of( + new MetricReaderModel() + .withPeriodic( + new PeriodicMetricReaderModel() + .withExporter( + new PushMetricExporterModel() + .withOtlpHttp(new OtlpHttpMetricExporterModel()))), + PeriodicMetricReader.builder( + OtlpHttpMetricExporter.builder().setComponentLoader(context).build()) + .build(), + null, + false), + Arguments.of( + new MetricReaderModel() + .withPeriodic( + new PeriodicMetricReaderModel() + .withExporter( + new PushMetricExporterModel() + .withOtlpHttp(new OtlpHttpMetricExporterModel())) + .withInterval(1) + .withCardinalityLimits(new CardinalityLimitsModel().withDefault(100)) + .withMaxExportBatchSizeDevelopment(200)), + SdkMeterProviderUtil.setMaxExportBatchSize( + PeriodicMetricReader.builder( + OtlpHttpMetricExporter.builder().setComponentLoader(context).build()) + .setInterval(Duration.ofMillis(1)), + 200) + .build(), + 100, + false), + Arguments.of( + new MetricReaderModel() + .withPull( + new PullMetricReaderModel() + .withExporter( + new PullMetricExporterModel() + .withPrometheusDevelopment( + new ExperimentalPrometheusMetricExporterModel() + .withPort(prometheusDefaultPort)))), + prometheusDefaultExpected, + null, + true), + Arguments.of( + new MetricReaderModel() + .withPull( + new PullMetricReaderModel() + .withCardinalityLimits(new CardinalityLimitsModel().withDefault(100)) + .withExporter( + new PullMetricExporterModel() + .withPrometheusDevelopment( + new ExperimentalPrometheusMetricExporterModel() + .withHost("localhost") + .withPort(prometheusConfiguredPort) + .withResourceConstantLabels( + new IncludeExcludeModel() + .withIncluded(singletonList("foo")) + .withExcluded(singletonList("bar"))) + .withScopeInfoEnabled(false) + .withTargetInfoEnabledDevelopment(false) + .withTranslationStrategy( + ExperimentalPrometheusMetricExporterModel + .ExperimentalPrometheusTranslationStrategy + .UNDERSCORE_ESCAPING_WITHOUT_SUFFIXES_DEVELOPMENT)))), + prometheusConfiguredExpected, + 100, + true)); } - @Test - void create_InvalidPullReader() { - assertThatThrownBy( - () -> - MetricReaderFactory.getInstance() - .create(new MetricReaderModel().withPull(new PullMetricReaderModel()), context)) + @ParameterizedTest + @MethodSource("createInvalidTestCases") + void create_Invalid(MetricReaderModel model, String expectedMessage) { + assertThatThrownBy(() -> MetricReaderFactory.getInstance().create(model, context)) .isInstanceOf(DeclarativeConfigException.class) - .hasMessage("pull metric reader exporter is required but is null"); + .hasMessage(expectedMessage); + } - assertThatThrownBy( - () -> - MetricReaderFactory.getInstance() - .create( - new MetricReaderModel() - .withPull( - new PullMetricReaderModel() - .withExporter(new PullMetricExporterModel())), - context)) - .isInstanceOf(DeclarativeConfigException.class) - .hasMessage("metric reader must have exactly one entry but has 0"); + static Stream createInvalidTestCases() { + return Stream.of( + Arguments.of( + new MetricReaderModel().withPeriodic(new PeriodicMetricReaderModel()), + "periodic metric reader exporter is required but is null"), + Arguments.of( + new MetricReaderModel().withPull(new PullMetricReaderModel()), + "pull metric reader exporter is required but is null"), + Arguments.of( + new MetricReaderModel() + .withPull(new PullMetricReaderModel().withExporter(new PullMetricExporterModel())), + "metric reader must have exactly one entry but has 0")); } - /** - * Find a random unused port. There's a small race if another process takes it before we - * initialize. Consider adding retries to this test if it flakes, presumably it never will on CI - * since there's no prometheus there blocking the well-known port. - */ private static int randomAvailablePort() throws IOException { - try (ServerSocket socket2 = new ServerSocket(0)) { - return socket2.getLocalPort(); + try (ServerSocket socket = new ServerSocket(0)) { + return socket.getLocalPort(); } } } diff --git a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/OpenTelemetryConfigurationFactoryTest.java b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/OpenTelemetryConfigurationFactoryTest.java index 8ea38490d67..6a214163c81 100644 --- a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/OpenTelemetryConfigurationFactoryTest.java +++ b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/OpenTelemetryConfigurationFactoryTest.java @@ -113,7 +113,7 @@ void create_FileFormat(String fileFormat, boolean isValid) { () -> OpenTelemetryConfigurationFactory.getInstance().create(model, context)) .isInstanceOf(DeclarativeConfigException.class) .hasMessageMatching( - "Unsupported file format '.+'\\. Supported formats include 0\\.4, 1\\.0\\*"); + "Unsupported file format '.+'\\. Supported formats include 0\\.4, 1\\.\\*"); } } @@ -128,14 +128,20 @@ private static Stream fileFormatArgs() { Arguments.argumentSet("1.0.0 invalid", "1.0.0", false), Arguments.argumentSet("1.0.3 invalid", "1.0.3", false), Arguments.argumentSet("1.0.0-rc.3 invalid", "1.0.0-rc.3", false), + Arguments.argumentSet("1.1.0 invalid", "1.1.0", false), + Arguments.argumentSet("1.a invalid", "1.a", false), Arguments.argumentSet("0.4 valid", "0.4", true), Arguments.argumentSet("1.0-rc.1 valid", "1.0-rc.1", true), Arguments.argumentSet("1.0-rc.2 valid", "1.0-rc.2", true), Arguments.argumentSet("1.0-rc.3 valid", "1.0-rc.3", true), - Arguments.argumentSet("1.0 valid", "1.0", true)); + Arguments.argumentSet("1.0 valid", "1.0", true), + Arguments.argumentSet("1.2 valid", "1.2", true), + Arguments.argumentSet("1.12 valid", "1.12", true), + Arguments.argumentSet("1.1 valid", "1.1", true)); } @Test + @SuppressLogger(OpenTelemetryConfigurationFactory.class) void create_FileFormatVersionMismatch_LogsWarning() { OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel().withFileFormat("1.0-rc.3"); @@ -145,13 +151,13 @@ void create_FileFormatVersionMismatch_LogsWarning() { cleanup.addCloseable(sdk); logCapturer.assertContains( - "Configuration file_format '1.0-rc.3' does not exactly match expected version '1.0'"); + "Configuration file_format '1.0-rc.3' does not exactly match expected version '1.1'"); } @Test void create_FileFormatExactMatch_NoWarning() { OpenTelemetryConfigurationModel model = - new OpenTelemetryConfigurationModel().withFileFormat("1.0"); + new OpenTelemetryConfigurationModel().withFileFormat("1.1"); ExtendedOpenTelemetrySdk sdk = OpenTelemetryConfigurationFactory.getInstance().create(model, context).getSdk(); @@ -164,7 +170,7 @@ void create_FileFormatExactMatch_NoWarning() { void create_Defaults() { List closeables = new ArrayList<>(); OpenTelemetryConfigurationModel model = - new OpenTelemetryConfigurationModel().withFileFormat("1.0"); + new OpenTelemetryConfigurationModel().withFileFormat("1.1"); OpenTelemetrySdk expectedSdk = OpenTelemetrySdkBuilderUtil.setConfigProvider( OpenTelemetrySdk.builder(), @@ -185,7 +191,7 @@ void create_Disabled() { List closeables = new ArrayList<>(); OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel() - .withFileFormat("1.0") + .withFileFormat("1.1") .withDisabled(true) // Logger provider configuration should be ignored since SDK is disabled .withLoggerProvider( @@ -228,7 +234,7 @@ void create_Configured() throws NoSuchFieldException { OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel() - .withFileFormat("1.0") + .withFileFormat("1.1") .withPropagator( new PropagatorModel().withCompositeList("tracecontext,baggage,b3multi,b3")) .withResource( diff --git a/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/component/IdGeneratorComponentProvider.java b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/component/IdGeneratorComponentProvider.java new file mode 100644 index 00000000000..cc90e512cea --- /dev/null +++ b/sdk-extensions/declarative-config/src/test/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/component/IdGeneratorComponentProvider.java @@ -0,0 +1,51 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure.declarativeconfig.component; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.trace.IdGenerator; + +public class IdGeneratorComponentProvider implements ComponentProvider { + @Override + public Class getType() { + return IdGenerator.class; + } + + @Override + public String getName() { + return "test"; + } + + @Override + public IdGenerator create(DeclarativeConfigProperties config) { + return TestIdGenerator.create(); + } + + public static class TestIdGenerator implements IdGenerator { + + private TestIdGenerator() {} + + public static TestIdGenerator create() { + return new TestIdGenerator(); + } + + @Override + public String generateSpanId() { + return "00000000"; + } + + @Override + public String generateTraceId() { + return "0000000000000000"; + } + + @Override + public String toString() { + return "TestIdGenerator{}"; + } + } +} diff --git a/sdk-extensions/declarative-config/src/test/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider b/sdk-extensions/declarative-config/src/test/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider index 15d144666ca..deed49c7019 100644 --- a/sdk-extensions/declarative-config/src/test/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider +++ b/sdk-extensions/declarative-config/src/test/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider @@ -8,3 +8,4 @@ io.opentelemetry.sdk.autoconfigure.declarativeconfig.component.LogRecordProcesso io.opentelemetry.sdk.autoconfigure.declarativeconfig.component.ResourceComponentProvider io.opentelemetry.sdk.autoconfigure.declarativeconfig.component.ResourceFirstComponentProvider io.opentelemetry.sdk.autoconfigure.declarativeconfig.component.ResourceSecondComponentProvider +io.opentelemetry.sdk.autoconfigure.declarativeconfig.component.IdGeneratorComponentProvider diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/logs/internal/EventToSpanEventBridgeComponentProvider.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/logs/internal/EventToSpanEventBridgeComponentProvider.java deleted file mode 100644 index 7b59be2f366..00000000000 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/logs/internal/EventToSpanEventBridgeComponentProvider.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.sdk.extension.incubator.logs.internal; - -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; -import io.opentelemetry.sdk.extension.incubator.logs.EventToSpanEventBridge; -import io.opentelemetry.sdk.logs.LogRecordProcessor; - -/** - * Declarative configuration SPI implementation for {@link EventToSpanEventBridge}. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -public class EventToSpanEventBridgeComponentProvider implements ComponentProvider { - - @Override - public Class getType() { - return LogRecordProcessor.class; - } - - @Override - public String getName() { - return "event_to_span_event_bridge/development"; - } - - @Override - public LogRecordProcessor create(DeclarativeConfigProperties config) { - return EventToSpanEventBridge.create(); - } -} diff --git a/sdk-extensions/incubator/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider b/sdk-extensions/incubator/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider deleted file mode 100644 index c166e5dce14..00000000000 --- a/sdk-extensions/incubator/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider +++ /dev/null @@ -1 +0,0 @@ -io.opentelemetry.sdk.extension.incubator.logs.internal.EventToSpanEventBridgeComponentProvider diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/SdkMeterProviderUtil.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/SdkMeterProviderUtil.java index 68206dab82e..84e9a914131 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/SdkMeterProviderUtil.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/SdkMeterProviderUtil.java @@ -10,6 +10,7 @@ import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; import io.opentelemetry.sdk.metrics.ViewBuilder; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReaderBuilder; import io.opentelemetry.sdk.metrics.internal.view.AttributesProcessor; import io.opentelemetry.sdk.metrics.internal.view.StringPredicates; import java.lang.reflect.InvocationTargetException; @@ -77,18 +78,18 @@ public static SdkMeterProviderBuilder addMeterConfiguratorCondition( } /** Reflectively set the max export batch size for the {@link SdkMeterProviderBuilder}. */ - public static SdkMeterProviderBuilder setMaxExportBatchSize( - SdkMeterProviderBuilder sdkMeterProviderBuilder, int maxExportBatchSize) { + public static PeriodicMetricReaderBuilder setMaxExportBatchSize( + PeriodicMetricReaderBuilder periodicMetricReaderBuilder, int maxExportBatchSize) { try { Method method = - SdkMeterProviderBuilder.class.getDeclaredMethod("setMaxExportBatchSize", int.class); + PeriodicMetricReaderBuilder.class.getDeclaredMethod("setMaxExportBatchSize", int.class); method.setAccessible(true); - method.invoke(sdkMeterProviderBuilder, maxExportBatchSize); + method.invoke(periodicMetricReaderBuilder, maxExportBatchSize); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new IllegalStateException( - "Error calling setMaxExportBatchSize on SdkMeterProviderBuilder", e); + "Error calling setMaxExportBatchSize on PeriodicMetricReaderBuilder", e); } - return sdkMeterProviderBuilder; + return periodicMetricReaderBuilder; } /**