Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…y-java into sampler-factory
  • Loading branch information
jack-berg committed Aug 24, 2023
2 parents fc0a620 + d64793a commit 458b5e0
Show file tree
Hide file tree
Showing 12 changed files with 234 additions and 19 deletions.
3 changes: 2 additions & 1 deletion buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ dependencies {
implementation("me.champeau.jmh:jmh-gradle-plugin:0.7.1")
implementation("net.ltgt.gradle:gradle-errorprone-plugin:3.1.0")
implementation("net.ltgt.gradle:gradle-nullaway-plugin:1.6.0")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.10")
// at the moment 1.9.0 is the latest version supported by codeql
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0")
implementation("org.owasp:dependency-check-gradle:8.4.0")
implementation("ru.vyarus:gradle-animalsniffer-plugin:1.7.1")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,6 @@ class OtelVersionClassPlugin : Plugin<Project> {
}

private fun buildOutDir(project: Project): File {
return File(project.buildDir, "generated/sources/version/java/main")
return File(project.layout.buildDirectory.asFile.get(), "generated/sources/version/java/main")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,20 @@ package io.opentelemetry.gradle
import com.squareup.wire.schema.SchemaHandler

class ProtoFieldsWireHandlerFactory : SchemaHandler.Factory{
@Deprecated("deprecated in parent")
override fun create(): SchemaHandler {
return ProtoFieldsWireHandler()
}
}

override fun create(
includes: List<String>,
excludes: List<String>,
exclusive: Boolean,
outDirectory: String,
options: Map<String, String>
): SchemaHandler {
@Suppress("DEPRECATION")
return create()
}

}
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/otel.bom-conventions.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ afterEvaluate {
.filter { it.plugins.hasPlugin("maven-publish") }

generateBuildSubstitutions {
val outputFile = File(buildDir, "substitutions.gradle.kts")
val outputFile = File(layout.buildDirectory.asFile.get(), "substitutions.gradle.kts")
outputs.file(outputFile)
val substitutionSnippet = bomProjects.joinToString(
separator = "\n",
Expand Down
4 changes: 2 additions & 2 deletions buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ plugins.withId("otel.publish-conventions") {
tasks {
register("generateVersionResource") {
val moduleName = otelJava.moduleName
val propertiesDir = moduleName.map { File(buildDir, "generated/properties/${it.replace('.', '/')}") }
val propertiesDir = moduleName.map { File(layout.buildDirectory.asFile.get(), "generated/properties/${it.replace('.', '/')}") }

inputs.property("project.version", project.version.toString())
outputs.dir(propertiesDir)
Expand All @@ -176,7 +176,7 @@ plugins.withId("otel.publish-conventions") {

sourceSets {
main {
output.dir("$buildDir/generated/properties", "builtBy" to "generateVersionResource")
output.dir("${layout.buildDirectory.asFile.get()}/generated/properties", "builtBy" to "generateVersionResource")
}
}
}
Expand Down
5 changes: 3 additions & 2 deletions buildSrc/src/main/kotlin/otel.jmh-conventions.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ jmh {
}

jmhReport {
jmhResultPath = file("$buildDir/results/jmh/results.json").absolutePath
jmhReportOutput = file("$buildDir/results/jmh").absolutePath
val buildDirectory = layout.buildDirectory.asFile.get()
jmhResultPath = file("$buildDirectory/results/jmh/results.json").absolutePath
jmhReportOutput = file("$buildDirectory/results/jmh").absolutePath
}

tasks {
Expand Down
1 change: 1 addition & 0 deletions dependencyManagement/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ val DEPENDENCIES = listOf(
"io.github.netmikey.logunit:logunit-jul:2.0.0",
"io.jaegertracing:jaeger-client:1.8.1",
"io.opentelemetry.proto:opentelemetry-proto:1.0.0-alpha",
"io.opentelemetry.contrib:opentelemetry-aws-xray-propagator:1.29.0-alpha",
"io.opentracing:opentracing-api:0.33.0",
"io.opentracing:opentracing-noop:0.33.0",
"junit:junit:4.13.2",
Expand Down
24 changes: 14 additions & 10 deletions sdk-extensions/incubator/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ dependencies {
testImplementation(project(":sdk-extensions:autoconfigure"))
testImplementation(project(":exporters:otlp:all"))
testImplementation(project(":sdk-extensions:jaeger-remote-sampler"))
testImplementation(project(":extensions:trace-propagators"))
// As a part of the tests we check that we can parse examples without error. The https://github.com/open-telemetry/opentelemetry-configuration/blob/main/examples/kitchen-sink.yam contains a reference to the xray propagator
testImplementation("io.opentelemetry.contrib:opentelemetry-aws-xray-propagator")
testImplementation("com.linecorp.armeria:armeria-junit5")

testImplementation("com.google.guava:guava-testlib")
Expand All @@ -51,10 +54,11 @@ dependencies {
// TODO(jack-berg): update ref to be released version when available
val configurationRef = "2107dbb6f2a6c99fe2f55d550796ee7e2286fd1d"
val configurationRepoZip = "https://github.com/open-telemetry/opentelemetry-configuration/archive/$configurationRef.zip"
val buildDirectory = layout.buildDirectory.asFile.get()

val downloadConfigurationSchema by tasks.registering(Download::class) {
src(configurationRepoZip)
dest("$buildDir/configuration/opentelemetry-configuration.zip")
dest("$buildDirectory/configuration/opentelemetry-configuration.zip")
overwrite(false)
}

Expand All @@ -67,12 +71,12 @@ val unzipConfigurationSchema by tasks.registering(Copy::class) {
val pathParts = path.split("/")
path = pathParts.subList(1, pathParts.size).joinToString("/")
})
into("$buildDir/configuration/")
into("$buildDirectory/configuration/")
}

jsonSchema2Pojo {
sourceFiles = setOf(file("$buildDir/configuration/schema"))
targetDirectory = file("$buildDir/generated/sources/js2p/java/main")
sourceFiles = setOf(file("$buildDirectory/configuration/schema"))
targetDirectory = file("$buildDirectory/generated/sources/js2p/java/main")
targetPackage = "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model"

// Clear old source files to avoid contaminated source dir when updating
Expand Down Expand Up @@ -100,8 +104,8 @@ generateJsonSchema2Pojo.dependsOn(unzipConfigurationSchema)
val jsonSchema2PojoPostProcessing by tasks.registering(Copy::class) {
dependsOn(generateJsonSchema2Pojo)

from("$buildDir/generated/sources/js2p")
into("$buildDir/generated/sources/js2p-tmp")
from("$buildDirectory/generated/sources/js2p")
into("$buildDirectory/generated/sources/js2p-tmp")
filter {
it
// Remove @Nullable annotation so it can be deterministically added later
Expand All @@ -117,13 +121,13 @@ val jsonSchema2PojoPostProcessing by tasks.registering(Copy::class) {
val overwriteJs2p by tasks.registering(Copy::class) {
dependsOn(jsonSchema2PojoPostProcessing)

from("$buildDir/generated/sources/js2p-tmp")
into("$buildDir/generated/sources/js2p")
from("$buildDirectory/generated/sources/js2p-tmp")
into("$buildDirectory/generated/sources/js2p")
}
val deleteJs2pTmp by tasks.registering(Delete::class) {
dependsOn(overwriteJs2p)

delete("$buildDir/generated/sources/js2p-tmp/")
delete("$buildDirectory/generated/sources/js2p-tmp/")
}

tasks.getByName("compileJava").dependsOn(deleteJs2pTmp)
Expand All @@ -139,7 +143,7 @@ tasks {
environment(
mapOf(
// Expose the kitchen sink example file to tests
"CONFIG_EXAMPLE_DIR" to "$buildDir/configuration/examples/"
"CONFIG_EXAMPLE_DIR" to "$buildDirectory/configuration/examples/"
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ public OpenTelemetrySdk create(

OpenTelemetrySdkBuilder builder = OpenTelemetrySdk.builder();

builder.setPropagators(
PropagatorsFactory.getInstance().create(model.getPropagators(), spiHelper, closeables));

if (model.getLoggerProvider() != null) {
builder.setLoggerProvider(
FileConfigUtil.addAndReturn(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.sdk.extension.incubator.fileconfig;

import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import java.io.Closeable;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;

final class PropagatorsFactory implements Factory<List<String>, ContextPropagators> {

private static final PropagatorsFactory INSTANCE = new PropagatorsFactory();

private PropagatorsFactory() {}

static PropagatorsFactory getInstance() {
return INSTANCE;
}

@Override
public ContextPropagators create(
@Nullable List<String> model, SpiHelper spiHelper, List<Closeable> closeables) {
if (model == null || model.isEmpty()) {
model = Arrays.asList("tracecontext", "baggage");
}

if (model.contains("none")) {
if (model.size() > 1) {
throw new ConfigurationException(
"propagators contains \"none\" along with other propagators");
}
return ContextPropagators.noop();
}

NamedSpiManager<TextMapPropagator> spiPropagatorsManager =
spiHelper.loadConfigurable(
ConfigurablePropagatorProvider.class,
ConfigurablePropagatorProvider::getName,
ConfigurablePropagatorProvider::getPropagator,
DefaultConfigProperties.createForTest(Collections.emptyMap()));
Set<TextMapPropagator> propagators = new LinkedHashSet<>();
for (String propagator : model) {
propagators.add(getPropagator(propagator, spiPropagatorsManager));
}

return ContextPropagators.create(TextMapPropagator.composite(propagators));
}

private static TextMapPropagator getPropagator(
String name, NamedSpiManager<TextMapPropagator> spiPropagatorsManager) {
if (name.equals("tracecontext")) {
return W3CTraceContextPropagator.getInstance();
}
if (name.equals("baggage")) {
return W3CBaggagePropagator.getInstance();
}

TextMapPropagator spiPropagator = spiPropagatorsManager.getByName(name);
if (spiPropagator != null) {
return spiPropagator;
}
throw new ConfigurationException("Unrecognized value for otel.propagators: " + name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,15 @@
import static io.opentelemetry.sdk.trace.samplers.Sampler.alwaysOn;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.extension.trace.propagation.B3Propagator;
import io.opentelemetry.extension.trace.propagation.JaegerPropagator;
import io.opentelemetry.extension.trace.propagation.OtTracePropagator;
import io.opentelemetry.internal.testing.CleanupExtension;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
Expand Down Expand Up @@ -82,7 +89,14 @@ void create_InvalidFileFormat() {
@Test
void create_Defaults() {
List<Closeable> closeables = new ArrayList<>();
OpenTelemetrySdk expectedSdk = OpenTelemetrySdk.builder().build();
OpenTelemetrySdk expectedSdk =
OpenTelemetrySdk.builder()
.setPropagators(
ContextPropagators.create(
TextMapPropagator.composite(
W3CTraceContextPropagator.getInstance(),
W3CBaggagePropagator.getInstance())))
.build();
cleanup.addCloseable(expectedSdk);

OpenTelemetrySdk sdk =
Expand All @@ -99,6 +113,15 @@ void create_Configured() {
List<Closeable> closeables = new ArrayList<>();
OpenTelemetrySdk expectedSdk =
OpenTelemetrySdk.builder()
.setPropagators(
ContextPropagators.create(
TextMapPropagator.composite(
W3CTraceContextPropagator.getInstance(),
W3CBaggagePropagator.getInstance(),
OtTracePropagator.getInstance(),
B3Propagator.injectingMultiHeaders(),
B3Propagator.injectingSingleHeader(),
JaegerPropagator.getInstance())))
.setLoggerProvider(
SdkLoggerProvider.builder()
.setLogLimits(
Expand Down Expand Up @@ -137,6 +160,9 @@ void create_Configured() {
.create(
new OpenTelemetryConfiguration()
.withFileFormat("0.1")
.withPropagators(
Arrays.asList(
"tracecontext", "baggage", "ottrace", "b3multi", "b3", "jaeger"))
.withLoggerProvider(
new LoggerProvider()
.withLimits(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.sdk.extension.incubator.fileconfig;

import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.extension.trace.propagation.B3Propagator;
import io.opentelemetry.extension.trace.propagation.JaegerPropagator;
import io.opentelemetry.extension.trace.propagation.OtTracePropagator;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

class PropagatorsFactoryTest {

private final SpiHelper spiHelper =
SpiHelper.create(PropagatorsFactoryTest.class.getClassLoader());

@ParameterizedTest
@MethodSource("createArguments")
void create(List<String> model, ContextPropagators expectedPropagators) {
ContextPropagators propagators =
PropagatorsFactory.getInstance().create(model, spiHelper, Collections.emptyList());

assertThat(propagators.toString()).isEqualTo(expectedPropagators.toString());
}

private static Stream<Arguments> createArguments() {
return Stream.of(
Arguments.of(
null,
ContextPropagators.create(
TextMapPropagator.composite(
W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance()))),
Arguments.of(
Collections.emptyList(),
ContextPropagators.create(
TextMapPropagator.composite(
W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance()))),
Arguments.of(Collections.singletonList("none"), ContextPropagators.noop()),
Arguments.of(
Arrays.asList("tracecontext", "baggage", "ottrace", "b3multi", "b3", "jaeger"),
ContextPropagators.create(
TextMapPropagator.composite(
W3CTraceContextPropagator.getInstance(),
W3CBaggagePropagator.getInstance(),
OtTracePropagator.getInstance(),
B3Propagator.injectingMultiHeaders(),
B3Propagator.injectingSingleHeader(),
JaegerPropagator.getInstance()))));
}

@Test
void create_NoneAndOther() {
assertThatThrownBy(
() ->
PropagatorsFactory.getInstance()
.create(Arrays.asList("none", "foo"), spiHelper, Collections.emptyList()))
.isInstanceOf(ConfigurationException.class)
.hasMessage("propagators contains \"none\" along with other propagators");
}

@Test
void create_UnknownSpiPropagator() {
assertThatThrownBy(
() ->
PropagatorsFactory.getInstance()
.create(Collections.singletonList("foo"), spiHelper, Collections.emptyList()))
.isInstanceOf(ConfigurationException.class)
.hasMessage("Unrecognized value for otel.propagators: foo");
}
}

0 comments on commit 458b5e0

Please sign in to comment.