Skip to content
Merged
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 @@ -15,10 +15,10 @@
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.DeclarativeConfiguration;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalInstrumentationModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalLanguageSpecificInstrumentationModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalLanguageSpecificInstrumentationPropertyModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.OpenTelemetryConfigurationModel;
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.internal.SdkConfigProvider;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.gradle.js2p;

import com.fasterxml.jackson.databind.JsonNode;
import com.sun.codemodel.JPackage;
import org.jsonschema2pojo.rules.RuleFactory;

/**
* Routes generated types whose name starts with {@code Experimental} into an {@code internal}
* sub-package.
*
* <p>Declarative config exposes both stable and unstable (experimental) model types. Unstable types
* are subject to breaking changes in minor versions, so they must live in an {@code internal}
* package that is exempt from the stability guarantees in {@code VERSIONING.md}. Experimental types
* are identified by the {@code Experimental} prefix, which is derived from the schema {@code title}
* (see {@code useTitleAsClassname} in {@code build.gradle.kts}).
*
* <p>jsonschema2pojo generates every type into a single {@code targetPackage}. Both {@link
* OtelObjectRule} and {@link OtelEnumRule} consult this helper before delegating to the stock rule
* so the type is created in the correct package. Because the type is created in its final package,
* codemodel resolves cross-package references and emits the necessary imports automatically.
*/
final class ExperimentalPackages {

private static final String EXPERIMENTAL_PREFIX = "Experimental";
private static final String INTERNAL_SUBPACKAGE = "internal";

private ExperimentalPackages() {}

/**
* Returns the package the type generated for {@code node} should be created in: the {@code
* internal} sub-package for experimental types, the model root for everything else.
*
* <p>The routing is symmetric so that the package is determined purely by the {@code Experimental}
* name prefix, regardless of the incoming {@code pkg}. This matters because jsonschema2pojo
* creates {@code $ref} targets in the referrer's package context: a shared stable type (e.g. one
* without a {@code title}, such as {@code SpanKind}) that is first referenced from inside an
* experimental type would otherwise be pulled into {@code internal}. Forcing non-experimental
* types back out keeps them in the public model package.
*/
static JPackage resolve(RuleFactory ruleFactory, String nodeName, JsonNode node, JPackage pkg) {
// getClassName applies the configured prefix/suffix and resolves the title-based name. The
// Model suffix differs for enums, but the Experimental prefix (derived from the title or the
// $def name) is present either way, which is all that matters for the routing decision.
String className = ruleFactory.getNameHelper().getClassName(nodeName, node, pkg);
boolean experimental = className.startsWith(EXPERIMENTAL_PREFIX);
boolean inInternal = pkg.name().endsWith("." + INTERNAL_SUBPACKAGE);
JPackage root = inInternal ? pkg.parent() : pkg;
return experimental ? root.subPackage(INTERNAL_SUBPACKAGE) : root;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.gradle.js2p;

import com.fasterxml.jackson.databind.JsonNode;
import com.sun.codemodel.JClassContainer;
import com.sun.codemodel.JPackage;
import com.sun.codemodel.JType;
import org.jsonschema2pojo.Schema;
import org.jsonschema2pojo.rules.EnumRule;
import org.jsonschema2pojo.rules.RuleFactory;

/**
* An {@link EnumRule} that routes top-level experimental enums into the {@code internal}
* sub-package, mirroring {@link OtelObjectRule} for classes.
*
* <p>Only top-level enums (where the container is a {@link JPackage}) are routed. Nested enums are
* created inside their owning class and move with it automatically.
*
* <p>Referenced from {@link OtelRuleFactory#getEnumRule()}.
*/
public class OtelEnumRule extends EnumRule {

private final RuleFactory ruleFactory;

public OtelEnumRule(RuleFactory ruleFactory) {
super(ruleFactory);
this.ruleFactory = ruleFactory;
}

@Override
public JType apply(
String nodeName, JsonNode node, JsonNode parent, JClassContainer container, Schema schema) {
if (container instanceof JPackage) {
JPackage targetPackage =
ExperimentalPackages.resolve(ruleFactory, nodeName, node, (JPackage) container);
return super.apply(nodeName, node, parent, targetPackage, schema);
}
return super.apply(nodeName, node, parent, container, schema);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,22 @@
*/
public class OtelObjectRule extends ObjectRule {

private final RuleFactory ruleFactory;

public OtelObjectRule(
RuleFactory ruleFactory,
ParcelableHelper parcelableHelper,
ReflectionHelper reflectionHelper) {
super(ruleFactory, parcelableHelper, reflectionHelper);
this.ruleFactory = ruleFactory;
}

@Override
public JType apply(
String nodeName, JsonNode node, JsonNode parent, JPackage pkg, Schema schema) {
JType type = super.apply(nodeName, node, parent, pkg, schema);
// Route experimental types into the internal sub-package before the class is created.
JPackage targetPackage = ExperimentalPackages.resolve(ruleFactory, nodeName, node, pkg);
JType type = super.apply(nodeName, node, parent, targetPackage, schema);
if (type instanceof JDefinedClass
&& ((JDefinedClass) type).getClassType() == ClassType.CLASS) {
addValueMethods((JDefinedClass) type);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

package io.opentelemetry.gradle.js2p;

import com.sun.codemodel.JClassContainer;
import com.sun.codemodel.JPackage;
import com.sun.codemodel.JType;
import org.jsonschema2pojo.rules.ObjectRule;
Expand All @@ -15,7 +16,8 @@
/**
* Custom {@link RuleFactory} that swaps in {@link OtelObjectRule} so generated POJOs get
* AutoValue-style {@code toString}/{@code equals}/{@code hashCode} implementations instead of
* jsonschema2pojo's defaults.
* jsonschema2pojo's defaults, and {@link OtelEnumRule} so top-level experimental enums are routed
* into the {@code internal} sub-package.
*
* <p>Referenced from {@code sdk-extensions/declarative-config/build.gradle.kts} via {@code
* jsonSchema2Pojo.customRuleFactory}.
Expand All @@ -26,4 +28,9 @@ public class OtelRuleFactory extends RuleFactory {
public Rule<JPackage, JType> getObjectRule() {
return new OtelObjectRule(this, new ParcelableHelper(), getReflectionHelper());
}

@Override
public Rule<JClassContainer, JType> getEnumRule() {
return new OtelEnumRule(this);
}
}
31 changes: 25 additions & 6 deletions sdk-extensions/declarative-config/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,9 @@ generateJsonSchema2Pojo.dependsOn(unzipConfigurationSchema)
val syncPojoModelsToSrc by tasks.registering(Copy::class) {
dependsOn(generateJsonSchema2Pojo)
finalizedBy("spotlessApply")
val modelDir = File(projectDir, "src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/model")
val modelPackage = "io.opentelemetry.sdk.autoconfigure.declarativeconfig.model"
val internalPackage = "$modelPackage.internal"
val modelDir = File(projectDir, "src/main/java/${modelPackage.replace('.', '/')}")
doFirst {
require(JavaVersion.current() == JavaVersion.VERSION_21) {
"syncPojoModelsToSrc requires Java 21 (current: ${JavaVersion.current()}). jsonschema2pojo output is JVM-version-sensitive; using the wrong version produces spurious diffs."
Expand All @@ -154,12 +156,29 @@ val syncPojoModelsToSrc by tasks.registering(Copy::class) {

from("$buildDirectory/generated/sources/js2p/java/main")
into("$projectDir/src/main/java")
// Replace java 9+ @Generated annotation with java 8 version (path-independent).
filter {
it
// Shorten FQCNs for same-package references generated by jsonschema2pojo
.replace("io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.", "")
// Replace java 9+ @Generated annotation with java 8 version, add @Nullable annotation
.replace("import javax.annotation.processing.Generated;", "import javax.annotation.Generated;")
it.replace("import javax.annotation.processing.Generated;", "import javax.annotation.Generated;")
}

doLast {
// Experimental types live in the internal sub-package; stable types in the model package.
// codemodel emits imports for cross-package top-level references automatically, but always
// fully-qualifies nested type references (e.g. OuterModel.NestedEnum) regardless of package.
// Shorten only references to a file's OWN package; cross-package FQCNs are left intact and
// valid. For model files the prefix must not match the longer internal prefix.
val stripModelPrefix = Regex(Regex.escape("$modelPackage.") + "(?!internal\\.)")
modelDir.walkTopDown().filter { it.isFile && it.extension == "java" }.forEach { file ->
val inInternal = file.parentFile.name == "internal"
val text = file.readText()
val shortened =
if (inInternal) {
text.replace("$internalPackage.", "")
} else {
text.replace(stripModelPrefix, "")
}
file.writeText(shortened)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalComposableRuleBasedSamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalComposableRuleBasedSamplerRuleAttributePatternsModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalComposableRuleBasedSamplerRuleAttributeValuesModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalComposableRuleBasedSamplerRuleModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalSpanParent;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalComposableRuleBasedSamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalComposableRuleBasedSamplerRuleAttributePatternsModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalComposableRuleBasedSamplerRuleAttributeValuesModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalComposableRuleBasedSamplerRuleModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalSpanParent;
import io.opentelemetry.sdk.common.internal.IncludeExcludePredicate;
import io.opentelemetry.sdk.extension.incubator.trace.samplers.ComposableRuleBasedSamplerBuilder;
import io.opentelemetry.sdk.extension.incubator.trace.samplers.ComposableSampler;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

package io.opentelemetry.sdk.autoconfigure.declarativeconfig;

import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalComposableParentThresholdSamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalComposableProbabilitySamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalComposableSamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalComposableParentThresholdSamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalComposableProbabilitySamplerModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalComposableSamplerModel;
import io.opentelemetry.sdk.extension.incubator.trace.samplers.ComposableSampler;

final class ComposableSamplerFactory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
import static io.opentelemetry.sdk.autoconfigure.declarativeconfig.FileConfigUtil.requireNonNull;

import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalLoggerConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalLoggerConfiguratorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalLoggerMatcherAndConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.LogRecordProcessorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.LoggerProviderModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.OpenTelemetryConfigurationModel.SeverityNumber;
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.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.common.internal.ScopeConfiguratorBuilder;
import io.opentelemetry.sdk.logs.LogLimits;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@

import static io.opentelemetry.sdk.autoconfigure.declarativeconfig.FileConfigUtil.requireNonNull;

import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalMeterConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalMeterConfiguratorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalMeterMatcherAndConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.MeterProviderModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.MetricReaderModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ViewModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ViewSelectorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ViewStreamModel;
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.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.common.internal.ScopeConfiguratorBuilder;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

package io.opentelemetry.sdk.autoconfigure.declarativeconfig;

import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalResourceDetectorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalResourceDetectorModel;
import io.opentelemetry.sdk.resources.Resource;

final class ResourceDetectorFactory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@

import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.AttributeNameValueModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalResourceDetectionModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalResourceDetectorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.IncludeExcludeModel;
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.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.resources.ResourceBuilder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@

package io.opentelemetry.sdk.autoconfigure.declarativeconfig;

import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalProbabilitySamplerModel;
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.ExperimentalProbabilitySamplerModel;
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
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@

import static io.opentelemetry.sdk.autoconfigure.declarativeconfig.FileConfigUtil.requireNonNull;

import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalTracerConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalTracerConfiguratorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ExperimentalTracerMatcherAndConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.SpanProcessorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.TracerProviderModel;
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.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.common.internal.ScopeConfiguratorBuilder;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalOtlpFileExporterModel;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.Generated;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalEventToSpanEventBridgeLogRecordProcessorModel;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.Generated;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalLoggerConfiguratorModel;
import java.util.List;
import javax.annotation.Generated;
import javax.annotation.Nullable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonValue;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterConfiguratorModel;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down
Loading
Loading