diff --git a/sdk-extensions/autoconfigure/build.gradle b/sdk-extensions/autoconfigure/build.gradle index cc57d4f5fc..3435e3fc3a 100644 --- a/sdk-extensions/autoconfigure/build.gradle +++ b/sdk-extensions/autoconfigure/build.gradle @@ -12,7 +12,9 @@ ext.moduleName = "io.opentelemetry.sdk.autoconfigure" testSets { testConfigError testFullConfig + testJaeger testPrometheus + testZipkin } dependencies { @@ -43,6 +45,10 @@ dependencies { testFullConfigImplementation libraries.prometheus_client_httpserver testFullConfigImplementation project(':exporters:zipkin') + testJaegerImplementation project(':exporters:jaeger') + + testZipkinImplementation project(':exporters:zipkin') + testConfigErrorImplementation project(':extensions:trace-propagators') testConfigErrorImplementation project(':exporters:jaeger') testConfigErrorImplementation project(':exporters:logging') @@ -59,7 +65,8 @@ dependencies { testFullConfig { environment("OTEL_RESOURCE_ATTRIBUTES", "service.name=test,cat=meow") - environment("OTEL_EXPORTER", "otlp,jaeger,zipkin") + environment("OTEL_TRACE_EXPORTER", "otlp") + environment("OTEL_METRICS_EXPORTER", "otlp") environment("OTEL_PROPAGATORS", "tracecontext,baggage,b3,b3multi,jaeger,ottracer,xray,test") environment("OTEL_BSP_SCHEDULE_DELAY_MILLIS", "10") environment("OTEL_IMR_EXPORT_INTERVAL", "10") @@ -68,7 +75,19 @@ testFullConfig { environment("OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT", "2") } +testJaeger { + environment("OTEL_TRACE_EXPORTER", "jaeger") + environment("OTEL_BSP_SCHEDULE_DELAY_MILLIS", "10") +} + +testZipkin { + environment("OTEL_TRACE_EXPORTER", "zipkin") + environment("OTEL_BSP_SCHEDULE_DELAY_MILLIS", "10") +} + testPrometheus { - environment("OTEL_EXPORTER", "prometheus") + environment("OTEL_METRICS_EXPORTER", "prometheus") environment("OTEL_IMR_EXPORT_INTERVAL", "10") -} \ No newline at end of file +} + +check.dependsOn(testConfigError, testFullConfig, testJaeger, testPrometheus, testZipkin) diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java index 51db58497f..67ac817908 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java @@ -14,39 +14,22 @@ import io.opentelemetry.sdk.metrics.export.IntervalMetricReaderBuilder; import io.prometheus.client.exporter.HTTPServer; import java.io.IOException; import java.time.Duration; -import java.util.Arrays; import java.util.Collections; -import java.util.List; final class MetricExporterConfiguration { - static final List RECOGNIZED_NAMES = Arrays.asList("otlp", "otlp_metrics", "prometheus"); - - static boolean configureExporter( - String name, - ConfigProperties config, - boolean metricsAlreadyRegistered, - SdkMeterProvider meterProvider) { + static void configureExporter( + String name, ConfigProperties config, SdkMeterProvider meterProvider) { switch (name) { case "otlp": case "otlp_metrics": - if (metricsAlreadyRegistered) { - throw new ConfigurationException( - "Multiple metrics exporters configured. Only one metrics exporter can be " - + "configured at a time."); - } configureOtlpMetrics(config, meterProvider); - return true; + return; case "prometheus": - if (metricsAlreadyRegistered) { - throw new ConfigurationException( - "Multiple metrics exporters configured. Only one metrics exporter can be " - + "configured at a time."); - } configurePrometheusMetrics(config, meterProvider); - return true; + return; default: - return false; + return; } } diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/OpenTelemetrySdkAutoConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/OpenTelemetrySdkAutoConfiguration.java index b35f022494..e1ee1adacd 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/OpenTelemetrySdkAutoConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/OpenTelemetrySdkAutoConfiguration.java @@ -12,9 +12,6 @@ import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.Set; /** * Auto-configuration for the OpenTelemetry SDK. As an alternative to programmatically configuring @@ -33,21 +30,10 @@ public final class OpenTelemetrySdkAutoConfiguration { Resource resource = configureResource(config); - Set exporterNames = - new LinkedHashSet<>(config.getCommaSeparatedValues("otel.exporter")); - - Set unrecognizedExporters = new LinkedHashSet<>(exporterNames); - unrecognizedExporters.removeAll(SpanExporterConfiguration.RECOGNIZED_NAMES); - unrecognizedExporters.removeAll(MetricExporterConfiguration.RECOGNIZED_NAMES); - if (!unrecognizedExporters.isEmpty()) { - throw new ConfigurationException( - "Unrecognized value for otel.exporter: " + String.join(",", exporterNames)); - } - - configureMeterProvider(resource, exporterNames, config); + configureMeterProvider(resource, config); SdkTracerProvider tracerProvider = - TracerProviderConfiguration.configureTracerProvider(resource, exporterNames, config); + TracerProviderConfiguration.configureTracerProvider(resource, config); return OpenTelemetrySdk.builder() .setTracerProvider(tracerProvider) @@ -55,16 +41,13 @@ public final class OpenTelemetrySdkAutoConfiguration { .build(); } - private static void configureMeterProvider( - Resource resource, Set exporterNames, ConfigProperties config) { + private static void configureMeterProvider(Resource resource, ConfigProperties config) { SdkMeterProvider meterProvider = SdkMeterProvider.builder().setResource(resource).buildAndRegisterGlobal(); - boolean metricsConfigured = false; - for (String exporterName : new ArrayList<>(exporterNames)) { - metricsConfigured = - MetricExporterConfiguration.configureExporter( - exporterName, config, metricsConfigured, meterProvider); + String exporterName = config.getString("otel.metrics.exporter"); + if (exporterName != null) { + MetricExporterConfiguration.configureExporter(exporterName, config, meterProvider); } } diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/SpanExporterConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/SpanExporterConfiguration.java index b6def07cec..24359efd6f 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/SpanExporterConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/SpanExporterConfiguration.java @@ -14,15 +14,10 @@ import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter; import io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder; import io.opentelemetry.sdk.trace.export.SpanExporter; import java.time.Duration; -import java.util.Arrays; -import java.util.List; import javax.annotation.Nullable; final class SpanExporterConfiguration { - static final List RECOGNIZED_NAMES = - Arrays.asList("otlp", "otlp_span", "jaeger", "zipkin", "logging"); - @Nullable static SpanExporter configureExporter(String name, ConfigProperties config) { switch (name) { diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/TracerProviderConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/TracerProviderConfiguration.java index f9944df48d..abd1f85625 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/TracerProviderConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/TracerProviderConfiguration.java @@ -16,15 +16,11 @@ import io.opentelemetry.sdk.trace.export.BatchSpanProcessorBuilder; import io.opentelemetry.sdk.trace.export.SpanExporter; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.time.Duration; -import java.util.ArrayList; -import java.util.List; import java.util.ServiceLoader; -import java.util.Set; final class TracerProviderConfiguration { - static SdkTracerProvider configureTracerProvider( - Resource resource, Set exporterNames, ConfigProperties config) { + static SdkTracerProvider configureTracerProvider(Resource resource, ConfigProperties config) { SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder() .setResource(resource) @@ -37,27 +33,21 @@ final class TracerProviderConfiguration { configurer.configure(tracerProviderBuilder); } - List spanExporters = new ArrayList<>(); - for (String name : new ArrayList<>(exporterNames)) { - SpanExporter exporter = SpanExporterConfiguration.configureExporter(name, config); + String exporterName = config.getString("otel.trace.exporter"); + if (exporterName != null) { + SpanExporter exporter = SpanExporterConfiguration.configureExporter(exporterName, config); if (exporter != null) { - spanExporters.add(exporter); + tracerProviderBuilder.addSpanProcessor(configureSpanProcessor(config, exporter)); } } - if (!spanExporters.isEmpty()) { - tracerProviderBuilder.addSpanProcessor(configureSpanProcessor(config, spanExporters)); - } - SdkTracerProvider tracerProvider = tracerProviderBuilder.build(); Runtime.getRuntime().addShutdownHook(new Thread(tracerProvider::shutdown)); return tracerProvider; } // VisibleForTesting - static BatchSpanProcessor configureSpanProcessor( - ConfigProperties config, List exporters) { - SpanExporter exporter = SpanExporter.composite(exporters); + static BatchSpanProcessor configureSpanProcessor(ConfigProperties config, SpanExporter exporter) { BatchSpanProcessorBuilder builder = BatchSpanProcessor.builder(exporter); Long scheduleDelayMillis = config.getLong("otel.bsp.schedule.delay.millis"); diff --git a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/NotOnClasspathTest.java b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/NotOnClasspathTest.java index 27081de6f9..7d3277207b 100644 --- a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/NotOnClasspathTest.java +++ b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/NotOnClasspathTest.java @@ -56,7 +56,7 @@ class NotOnClasspathTest { assertThatThrownBy( () -> MetricExporterConfiguration.configureExporter( - "otlp", EMPTY, false, SdkMeterProvider.builder().build())) + "otlp", EMPTY, SdkMeterProvider.builder().build())) .isInstanceOf(ConfigurationException.class) .hasMessageContaining( "OTLP Metrics Exporter enabled but opentelemetry-exporter-otlp-metrics not found on " @@ -68,7 +68,7 @@ class NotOnClasspathTest { assertThatThrownBy( () -> MetricExporterConfiguration.configureExporter( - "prometheus", EMPTY, false, SdkMeterProvider.builder().build())) + "prometheus", EMPTY, SdkMeterProvider.builder().build())) .isInstanceOf(ConfigurationException.class) .hasMessageContaining( "Prometheus Metrics Server enabled but opentelemetry-exporter-prometheus not found on " diff --git a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/TracerProviderConfigurationTest.java b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/TracerProviderConfigurationTest.java index b8860a4718..e866ef6ac4 100644 --- a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/TracerProviderConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/TracerProviderConfigurationTest.java @@ -47,7 +47,7 @@ class TracerProviderConfigurationTest { // are verified in other test sets like testFullConfig. SdkTracerProvider tracerProvider = TracerProviderConfiguration.configureTracerProvider( - resource, Collections.emptySet(), ConfigProperties.createForTest(properties)); + resource, ConfigProperties.createForTest(properties)); try { assertThat(tracerProvider.getActiveTraceConfig().getSampler()).isEqualTo(Sampler.alwaysOff()); @@ -68,8 +68,7 @@ class TracerProviderConfigurationTest { @Test void configureSpanProcessor_empty() { BatchSpanProcessor processor = - TracerProviderConfiguration.configureSpanProcessor( - EMPTY, Collections.singletonList(exporter)); + TracerProviderConfiguration.configureSpanProcessor(EMPTY, exporter); try { assertThat(processor) @@ -105,7 +104,7 @@ class TracerProviderConfigurationTest { BatchSpanProcessor processor = TracerProviderConfiguration.configureSpanProcessor( - ConfigProperties.createForTest(properties), Collections.singletonList(exporter)); + ConfigProperties.createForTest(properties), exporter); try { assertThat(processor) diff --git a/sdk-extensions/autoconfigure/src/testConfigError/java/io/opentelemetry/sdk/autoconfigure/ConfigErrorTest.java b/sdk-extensions/autoconfigure/src/testConfigError/java/io/opentelemetry/sdk/autoconfigure/ConfigErrorTest.java index f67969e6b9..ec1eacadb0 100644 --- a/sdk-extensions/autoconfigure/src/testConfigError/java/io/opentelemetry/sdk/autoconfigure/ConfigErrorTest.java +++ b/sdk-extensions/autoconfigure/src/testConfigError/java/io/opentelemetry/sdk/autoconfigure/ConfigErrorTest.java @@ -25,26 +25,6 @@ class ConfigErrorTest { @RegisterExtension LogCapturer logs = LogCapturer.create().captureForType(GlobalOpenTelemetry.class); - @Test - @SetSystemProperty(key = "otel.exporter", value = "otlp_metrics,prometheus") - void multipleMetricExportersPrometheusThrows() { - assertThatThrownBy(OpenTelemetrySdkAutoConfiguration::initialize) - .isInstanceOf(ConfigurationException.class) - .hasMessage( - "Multiple metrics exporters configured. " - + "Only one metrics exporter can be configured at a time."); - } - - @Test - @SetSystemProperty(key = "otel.exporter", value = "prometheus,otlp_metrics") - void multipleMetricExportersOtlpThrows() { - assertThatThrownBy(OpenTelemetrySdkAutoConfiguration::initialize) - .isInstanceOf(ConfigurationException.class) - .hasMessage( - "Multiple metrics exporters configured. " - + "Only one metrics exporter can be configured at a time."); - } - @Test @SetSystemProperty(key = "otel.propagators", value = "cat") void invalidPropagator() { @@ -53,16 +33,6 @@ class ConfigErrorTest { .hasMessage("Unrecognized value for otel.propagators: cat"); } - @Test - @SetSystemProperty(key = "otel.trace.sampler", value = "traceidratio") - void missingTraceIdRatio() { - assertThatThrownBy(OpenTelemetrySdkAutoConfiguration::initialize) - .isInstanceOf(ConfigurationException.class) - .hasMessage( - "otel.trace.sampler=traceidratio but otel.trace.sampler.arg is not provided. " - + "Set otel.trace.sampler.arg to a value in the range [0.0, 1.0]."); - } - @Test @SetSystemProperty(key = "otel.trace.sampler", value = "traceidratio") @SetSystemProperty(key = "otel.trace.sampler.arg", value = "bar") @@ -72,16 +42,6 @@ class ConfigErrorTest { .hasMessage("Invalid value for property otel.trace.sampler.arg=bar. Must be a double."); } - @Test - @SetSystemProperty(key = "otel.trace.sampler", value = "parentbased_traceidratio") - void missingTraceIdRatioWithParent() { - assertThatThrownBy(OpenTelemetrySdkAutoConfiguration::initialize) - .isInstanceOf(ConfigurationException.class) - .hasMessage( - "otel.trace.sampler=parentbased_traceidratio but otel.trace.sampler.arg is " - + "not provided. Set otel.trace.sampler.arg to a value in the range [0.0, 1.0]."); - } - @Test @SetSystemProperty(key = "otel.trace.sampler", value = "parentbased_traceidratio") @SetSystemProperty(key = "otel.trace.sampler.arg", value = "bar") @@ -100,15 +60,8 @@ class ConfigErrorTest { } @Test - @SetSystemProperty(key = "otel.exporter", value = "otlp,cat,dog") - void invalidExporter() { - assertThatThrownBy(OpenTelemetrySdkAutoConfiguration::initialize) - .isInstanceOf(ConfigurationException.class) - .hasMessage("Unrecognized value for otel.exporter: cat,dog"); - } - - @Test - @SetSystemProperty(key = "otel.exporter", value = "bar") + @SetSystemProperty(key = "otel.trace.sampler", value = "traceidratio") + @SetSystemProperty(key = "otel.trace.sampler.arg", value = "bar") void globalOpenTelemetryWhenError() { assertThat(GlobalOpenTelemetry.get()) .isInstanceOf(OpenTelemetrySdk.class) @@ -121,8 +74,6 @@ class ConfigErrorTest { "Error automatically configuring OpenTelemetry SDK. " + "OpenTelemetry will not be enabled."); assertThat(log.getLevel()).isEqualTo(Level.ERROR); - assertThat(log.getThrowable()) - .isInstanceOf(ConfigurationException.class) - .hasMessage("Unrecognized value for otel.exporter: bar"); + assertThat(log.getThrowable()).isInstanceOf(ConfigurationException.class); } } diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FullConfigTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FullConfigTest.java index 94b0643702..cc3bbf21cd 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FullConfigTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FullConfigTest.java @@ -8,8 +8,6 @@ package io.opentelemetry.sdk.autoconfigure; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -import com.linecorp.armeria.common.HttpResponse; -import com.linecorp.armeria.common.HttpStatus; import com.linecorp.armeria.common.RequestHeaders; import com.linecorp.armeria.server.ServerBuilder; import com.linecorp.armeria.server.ServiceRequestContext; @@ -19,8 +17,6 @@ import io.grpc.stub.StreamObserver; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; -import io.opentelemetry.exporter.jaeger.proto.api_v2.Collector; -import io.opentelemetry.exporter.jaeger.proto.api_v2.CollectorServiceGrpc; import io.opentelemetry.extension.trace.propagation.AwsXrayPropagator; import io.opentelemetry.extension.trace.propagation.B3Propagator; import io.opentelemetry.extension.trace.propagation.JaegerPropagator; @@ -45,13 +41,10 @@ import org.junit.jupiter.api.extension.RegisterExtension; @SuppressWarnings("InterruptedExceptionSwallowed") class FullConfigTest { - private static final BlockingQueue jaegerRequests = - new LinkedBlockingDeque<>(); private static final BlockingQueue otlpTraceRequests = new LinkedBlockingDeque<>(); private static final BlockingQueue otlpMetricsRequests = new LinkedBlockingDeque<>(); - private static final BlockingQueue zipkinJsonRequests = new LinkedBlockingDeque<>(); @RegisterExtension public static final ServerExtension server = @@ -105,32 +98,8 @@ class FullConfigTest { responseObserver.onCompleted(); } }) - // Jaeger - .addService( - new CollectorServiceGrpc.CollectorServiceImplBase() { - @Override - public void postSpans( - Collector.PostSpansRequest request, - StreamObserver responseObserver) { - jaegerRequests.add(request); - responseObserver.onNext(Collector.PostSpansResponse.getDefaultInstance()); - responseObserver.onCompleted(); - } - }) .useBlockingTaskExecutor(true) .build()); - - // Zipkin - sb.service( - "/api/v2/spans", - (ctx, req) -> - HttpResponse.from( - req.aggregate() - .thenApply( - aggRes -> { - zipkinJsonRequests.add(aggRes.contentUtf8()); - return HttpResponse.of(HttpStatus.OK); - }))); } }; @@ -138,8 +107,6 @@ class FullConfigTest { void setUp() { otlpTraceRequests.clear(); otlpMetricsRequests.clear(); - jaegerRequests.clear(); - zipkinJsonRequests.clear(); } @Test @@ -177,9 +144,7 @@ class FullConfigTest { await() .untilAsserted( () -> { - assertThat(jaegerRequests).hasSize(1); assertThat(otlpTraceRequests).hasSize(1); - assertThat(zipkinJsonRequests).hasSize(1); // Not well defined how many metric exports would have happened by now, check that // any diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java index 7abf3756f8..ef60f0f1c1 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java @@ -10,6 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import java.util.Collections; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; class MetricExporterConfigurationTest { @@ -25,7 +26,10 @@ class MetricExporterConfigurationTest { assertThat(exporter) .isInstanceOfSatisfying( OtlpGrpcMetricExporter.class, - otlp -> assertThat(otlp).extracting("deadlineMs").isEqualTo(10L)); + otlp -> + assertThat(otlp) + .extracting("timeoutNanos") + .isEqualTo(TimeUnit.MILLISECONDS.toNanos(10L))); } finally { exporter.shutdown(); } diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/SpanExporterConfigurationTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/SpanExporterConfigurationTest.java index bbf3065dfd..c03e70caa3 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/SpanExporterConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/SpanExporterConfigurationTest.java @@ -10,6 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; import io.opentelemetry.sdk.trace.export.SpanExporter; import java.util.Collections; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; class SpanExporterConfigurationTest { @@ -29,7 +30,10 @@ class SpanExporterConfigurationTest { assertThat(exporter) .isInstanceOfSatisfying( OtlpGrpcSpanExporter.class, - otlp -> assertThat(otlp).extracting("deadlineMs").isEqualTo(10L)); + otlp -> + assertThat(otlp) + .extracting("timeoutNanos") + .isEqualTo(TimeUnit.MILLISECONDS.toNanos(10L))); } finally { exporter.shutdown(); } diff --git a/sdk-extensions/autoconfigure/src/testJaeger/java/io/opentelemetry/sdk/autoconfigure/JaegerConfigTest.java b/sdk-extensions/autoconfigure/src/testJaeger/java/io/opentelemetry/sdk/autoconfigure/JaegerConfigTest.java new file mode 100644 index 0000000000..f3c6baf25a --- /dev/null +++ b/sdk-extensions/autoconfigure/src/testJaeger/java/io/opentelemetry/sdk/autoconfigure/JaegerConfigTest.java @@ -0,0 +1,70 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +import com.linecorp.armeria.server.ServerBuilder; +import com.linecorp.armeria.server.grpc.GrpcService; +import com.linecorp.armeria.testing.junit5.server.ServerExtension; +import io.grpc.stub.StreamObserver; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.exporter.jaeger.proto.api_v2.Collector; +import io.opentelemetry.exporter.jaeger.proto.api_v2.CollectorServiceGrpc; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingDeque; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class JaegerConfigTest { + + private static final BlockingQueue jaegerRequests = + new LinkedBlockingDeque<>(); + + @RegisterExtension + public static final ServerExtension server = + new ServerExtension() { + @Override + protected void configure(ServerBuilder sb) { + sb.service( + GrpcService.builder() + // Jaeger + .addService( + new CollectorServiceGrpc.CollectorServiceImplBase() { + @Override + public void postSpans( + Collector.PostSpansRequest request, + StreamObserver responseObserver) { + jaegerRequests.add(request); + responseObserver.onNext(Collector.PostSpansResponse.getDefaultInstance()); + responseObserver.onCompleted(); + } + }) + .useBlockingTaskExecutor(true) + .build()); + } + }; + + @BeforeEach + void setUp() { + jaegerRequests.clear(); + } + + @Test + void configures() { + String endpoint = "localhost:" + server.httpPort(); + + System.setProperty("otel.exporter.jaeger.endpoint", endpoint); + + OpenTelemetrySdkAutoConfiguration.initialize(); + + GlobalOpenTelemetry.get().getTracer("test").spanBuilder("test").startSpan().end(); + + await().untilAsserted(() -> assertThat(jaegerRequests).hasSize(1)); + } +} diff --git a/sdk-extensions/autoconfigure/src/testZipkin/java/io/opentelemetry/sdk/autoconfigure/ZipkinConfigTest.java b/sdk-extensions/autoconfigure/src/testZipkin/java/io/opentelemetry/sdk/autoconfigure/ZipkinConfigTest.java new file mode 100644 index 0000000000..592eb58999 --- /dev/null +++ b/sdk-extensions/autoconfigure/src/testZipkin/java/io/opentelemetry/sdk/autoconfigure/ZipkinConfigTest.java @@ -0,0 +1,62 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +import com.linecorp.armeria.common.HttpResponse; +import com.linecorp.armeria.common.HttpStatus; +import com.linecorp.armeria.server.ServerBuilder; +import com.linecorp.armeria.testing.junit5.server.ServerExtension; +import io.opentelemetry.api.GlobalOpenTelemetry; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingDeque; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class ZipkinConfigTest { + + private static final BlockingQueue zipkinJsonRequests = new LinkedBlockingDeque<>(); + + @RegisterExtension + public static final ServerExtension server = + new ServerExtension() { + @Override + protected void configure(ServerBuilder sb) { + // Zipkin + sb.service( + "/api/v2/spans", + (ctx, req) -> + HttpResponse.from( + req.aggregate() + .thenApply( + aggRes -> { + zipkinJsonRequests.add(aggRes.contentUtf8()); + return HttpResponse.of(HttpStatus.OK); + }))); + } + }; + + @BeforeEach + void setUp() { + zipkinJsonRequests.clear(); + } + + @Test + void configures() { + String endpoint = "localhost:" + server.httpPort(); + + System.setProperty("otel.exporter.zipkin.endpoint", "http://" + endpoint + "/api/v2/spans"); + + OpenTelemetrySdkAutoConfiguration.initialize(); + + GlobalOpenTelemetry.get().getTracer("test").spanBuilder("test").startSpan().end(); + + await().untilAsserted(() -> assertThat(zipkinJsonRequests).hasSize(1)); + } +}