diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/InternalTelemetryConfiguration.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/InternalTelemetryConfiguration.java new file mode 100644 index 00000000000..89af16ccbb4 --- /dev/null +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/InternalTelemetryConfiguration.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.exporter.otlp.internal; + +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.sdk.common.InternalTelemetryVersion; +import java.util.Locale; + +/** + * Reads the desired SDK internal telemetry version from {@link ConfigProperties}. + * + *

This is the same as {@code io.opentelemetry.sdk.autoconfigure.InternalTelemetryConfiguration}. + * Any changes should be reflected there as well. + */ +final class InternalTelemetryConfiguration { + + static InternalTelemetryVersion getVersion(ConfigProperties config) { + String version = config.getString("otel.experimental.sdk.telemetry.version"); + if (version == null) { + return InternalTelemetryVersion.LEGACY; + } + + switch (version.toLowerCase(Locale.ROOT)) { + case "legacy": + return InternalTelemetryVersion.LEGACY; + case "latest": + return InternalTelemetryVersion.LATEST; + default: + throw new ConfigurationException("Invalid sdk telemetry version: " + version); + } + } + + private InternalTelemetryConfiguration() {} +} diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java index 427d79e7ac4..b2fbea35461 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java @@ -9,6 +9,7 @@ import io.opentelemetry.exporter.internal.ExporterBuilderUtil; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.sdk.common.InternalTelemetryVersion; import io.opentelemetry.sdk.common.export.MemoryMode; import io.opentelemetry.sdk.common.export.RetryPolicy; import java.io.File; @@ -62,7 +63,8 @@ public static void configureOtlpExporterBuilder( Consumer setTrustedCertificates, BiConsumer setClientTls, Consumer setRetryPolicy, - Consumer setMemoryMode) { + Consumer setMemoryMode, + Consumer setInternalTelemetryVersion) { setComponentLoader.accept(config.getComponentLoader()); String protocol = getOtlpProtocol(dataType, config); @@ -107,6 +109,9 @@ public static void configureOtlpExporterBuilder( setTimeout.accept(timeout); } + InternalTelemetryVersion telemetryVersion = InternalTelemetryConfiguration.getVersion(config); + setInternalTelemetryVersion.accept(telemetryVersion); + String certificatePath = config.getString( determinePropertyByType(config, "otel.exporter.otlp", dataType, "certificate")); diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProvider.java index 1262bc7250f..6a478db1984 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProvider.java @@ -53,7 +53,8 @@ public LogRecordExporter createExporter(ConfigProperties config) { builder::setTrustedCertificates, builder::setClientTls, builder::setRetryPolicy, - builder::setMemoryMode); + builder::setMemoryMode, + builder::setInternalTelemetryVersion); builder.setMeterProvider(meterProviderRef::get); return builder.build(); @@ -71,7 +72,8 @@ public LogRecordExporter createExporter(ConfigProperties config) { builder::setTrustedCertificates, builder::setClientTls, builder::setRetryPolicy, - builder::setMemoryMode); + builder::setMemoryMode, + builder::setInternalTelemetryVersion); builder.setMeterProvider(meterProviderRef::get); return builder.build(); diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProvider.java index eb286b09b94..35039182f23 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProvider.java @@ -54,7 +54,8 @@ public MetricExporter createExporter(ConfigProperties config) { builder::setTrustedCertificates, builder::setClientTls, builder::setRetryPolicy, - builder::setMemoryMode); + builder::setMemoryMode, + builder::setInternalTelemetryVersion); ExporterBuilderUtil.configureOtlpAggregationTemporality( config, builder::setAggregationTemporalitySelector); ExporterBuilderUtil.configureOtlpHistogramDefaultAggregation( @@ -76,7 +77,8 @@ public MetricExporter createExporter(ConfigProperties config) { builder::setTrustedCertificates, builder::setClientTls, builder::setRetryPolicy, - builder::setMemoryMode); + builder::setMemoryMode, + builder::setInternalTelemetryVersion); ExporterBuilderUtil.configureOtlpAggregationTemporality( config, builder::setAggregationTemporalitySelector); ExporterBuilderUtil.configureOtlpHistogramDefaultAggregation( diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProvider.java index 1561c057b29..f4467a2f601 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProvider.java @@ -52,7 +52,8 @@ public SpanExporter createExporter(ConfigProperties config) { builder::setTrustedCertificates, builder::setClientTls, builder::setRetryPolicy, - builder::setMemoryMode); + builder::setMemoryMode, + builder::setInternalTelemetryVersion); builder.setMeterProvider(meterProviderRef::get); return builder.build(); @@ -70,7 +71,8 @@ public SpanExporter createExporter(ConfigProperties config) { builder::setTrustedCertificates, builder::setClientTls, builder::setRetryPolicy, - builder::setMemoryMode); + builder::setMemoryMode, + builder::setInternalTelemetryVersion); builder.setMeterProvider(meterProviderRef::get); return builder.build(); diff --git a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtilTest.java b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtilTest.java index fb1061ae3fa..420c2f57e1e 100644 --- a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtilTest.java +++ b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtilTest.java @@ -379,6 +379,7 @@ private static String configureEndpoint(String dataType, Map pro value -> {}, (value1, value2) -> {}, value -> {}, + value -> {}, value -> {}); return endpoint.get(); diff --git a/sdk-extensions/autoconfigure/build.gradle.kts b/sdk-extensions/autoconfigure/build.gradle.kts index 3d54ea736c4..f78a0f12134 100644 --- a/sdk-extensions/autoconfigure/build.gradle.kts +++ b/sdk-extensions/autoconfigure/build.gradle.kts @@ -77,6 +77,7 @@ testing { environment("OTEL_EXPORTER_OTLP_TIMEOUT", "5000") environment("OTEL_TEST_CONFIGURED", "true") environment("OTEL_TEST_WRAPPED", "1") + environment("OTEL_EXPERIMENTAL_SDK_TELEMETRY_VERSION", "latest") } } } diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/InternalTelemetryConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/InternalTelemetryConfiguration.java new file mode 100644 index 00000000000..7f16f705c0b --- /dev/null +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/InternalTelemetryConfiguration.java @@ -0,0 +1,39 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure; + +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.sdk.common.InternalTelemetryVersion; +import java.util.Locale; + +/** + * Reads the desired SDK internal telemetry version from {@link ConfigProperties}. + * + *

This is the same as {@code + * io.opentelemetry.exporter.otlp.internal.InternalTelemetryConfiguration}. Any changes should be + * reflected there as well. + */ +final class InternalTelemetryConfiguration { + + static InternalTelemetryVersion getVersion(ConfigProperties config) { + String version = config.getString("otel.experimental.sdk.telemetry.version"); + if (version == null) { + return InternalTelemetryVersion.LEGACY; + } + + switch (version.toLowerCase(Locale.ROOT)) { + case "legacy": + return InternalTelemetryVersion.LEGACY; + case "latest": + return InternalTelemetryVersion.LATEST; + default: + throw new ConfigurationException("Invalid sdk telemetry version: " + version); + } + } + + private InternalTelemetryConfiguration() {} +} diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/LoggerProviderConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/LoggerProviderConfiguration.java index 0c080e1333d..d2ee66685a5 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/LoggerProviderConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/LoggerProviderConfiguration.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.common.InternalTelemetryVersion; import io.opentelemetry.sdk.logs.LogLimits; import io.opentelemetry.sdk.logs.LogLimitsBuilder; import io.opentelemetry.sdk.logs.LogRecordProcessor; @@ -18,6 +19,7 @@ import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessorBuilder; import io.opentelemetry.sdk.logs.export.LogRecordExporter; import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; +import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessorBuilder; import java.io.Closeable; import java.time.Duration; import java.util.ArrayList; @@ -44,13 +46,17 @@ static void configureLoggerProvider( List closeables) { loggerProviderBuilder.setLogLimits(() -> configureLogLimits(config)); - loggerProviderBuilder.setMeterProvider(() -> meterProvider); + InternalTelemetryVersion telemetryVersion = InternalTelemetryConfiguration.getVersion(config); + if (telemetryVersion != InternalTelemetryVersion.LEGACY) { + loggerProviderBuilder.setMeterProvider(() -> meterProvider); + } Map exportersByName = configureLogRecordExporters(config, spiHelper, logRecordExporterCustomizer, closeables); List processors = - configureLogRecordProcessors(config, exportersByName, meterProvider, closeables); + configureLogRecordProcessors( + config, exportersByName, telemetryVersion, meterProvider, closeables); for (LogRecordProcessor processor : processors) { LogRecordProcessor wrapped = logRecordProcessorCustomizer.apply(processor, config); if (wrapped != processor) { @@ -64,6 +70,7 @@ static void configureLoggerProvider( static List configureLogRecordProcessors( ConfigProperties config, Map exportersByName, + InternalTelemetryVersion telemetryVersion, MeterProvider meterProvider, List closeables) { Map exportersByNameCopy = new HashMap<>(exportersByName); @@ -72,10 +79,12 @@ static List configureLogRecordProcessors( for (String simpleProcessorExporterName : simpleProcessorExporterNames) { LogRecordExporter exporter = exportersByNameCopy.remove(simpleProcessorExporterName); if (exporter != null) { - LogRecordProcessor logRecordProcessor = - SimpleLogRecordProcessor.builder(exporter) - .setMeterProvider(() -> meterProvider) - .build(); + SimpleLogRecordProcessorBuilder logRecordProcessorBuilder = + SimpleLogRecordProcessor.builder(exporter); + if (telemetryVersion != InternalTelemetryVersion.LEGACY) { + logRecordProcessorBuilder.setMeterProvider(() -> meterProvider); + } + LogRecordProcessor logRecordProcessor = logRecordProcessorBuilder.build(); closeables.add(logRecordProcessor); logRecordProcessors.add(logRecordProcessor); } @@ -85,7 +94,8 @@ static List configureLogRecordProcessors( LogRecordExporter compositeLogRecordExporter = LogRecordExporter.composite(exportersByNameCopy.values()); LogRecordProcessor logRecordProcessor = - configureBatchLogRecordProcessor(config, compositeLogRecordExporter, meterProvider); + configureBatchLogRecordProcessor( + config, compositeLogRecordExporter, telemetryVersion, meterProvider); closeables.add(logRecordProcessor); logRecordProcessors.add(logRecordProcessor); } @@ -95,7 +105,10 @@ static List configureLogRecordProcessors( // VisibleForTesting static BatchLogRecordProcessor configureBatchLogRecordProcessor( - ConfigProperties config, LogRecordExporter exporter, MeterProvider meterProvider) { + ConfigProperties config, + LogRecordExporter exporter, + InternalTelemetryVersion telemetryVersion, + MeterProvider meterProvider) { BatchLogRecordProcessorBuilder builder = BatchLogRecordProcessor.builder(exporter).setMeterProvider(meterProvider); @@ -119,6 +132,8 @@ static BatchLogRecordProcessor configureBatchLogRecordProcessor( builder.setExporterTimeout(timeout); } + builder.setInternalTelemetryVersion(telemetryVersion); + return builder.build(); } 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 7ecc048ff3d..8a5bde466a2 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 @@ -11,6 +11,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSamplerProvider; +import io.opentelemetry.sdk.common.InternalTelemetryVersion; import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; import io.opentelemetry.sdk.trace.SpanLimits; import io.opentelemetry.sdk.trace.SpanLimitsBuilder; @@ -18,6 +19,7 @@ import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; import io.opentelemetry.sdk.trace.export.BatchSpanProcessorBuilder; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessorBuilder; import io.opentelemetry.sdk.trace.export.SpanExporter; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.io.Closeable; @@ -49,7 +51,10 @@ static void configureTracerProvider( List closeables) { tracerProviderBuilder.setSpanLimits(configureSpanLimits(config)); - tracerProviderBuilder.setMeterProvider(() -> meterProvider); + InternalTelemetryVersion telemetryVersion = InternalTelemetryConfiguration.getVersion(config); + if (telemetryVersion != InternalTelemetryVersion.LEGACY) { + tracerProviderBuilder.setMeterProvider(() -> meterProvider); + } String sampler = config.getString("otel.traces.sampler", PARENTBASED_ALWAYS_ON); tracerProviderBuilder.setSampler( @@ -60,7 +65,8 @@ static void configureTracerProvider( config, spiHelper, spanExporterCustomizer, closeables); List processors = - configureSpanProcessors(config, exportersByName, meterProvider, closeables); + configureSpanProcessors( + config, exportersByName, telemetryVersion, meterProvider, closeables); for (SpanProcessor processor : processors) { SpanProcessor wrapped = spanProcessorCustomizer.apply(processor, config); if (wrapped != processor) { @@ -73,6 +79,7 @@ static void configureTracerProvider( static List configureSpanProcessors( ConfigProperties config, Map exportersByName, + InternalTelemetryVersion telemetryVersion, MeterProvider meterProvider, List closeables) { Map exportersByNameCopy = new HashMap<>(exportersByName); @@ -81,8 +88,11 @@ static List configureSpanProcessors( for (String simpleProcessorExporterNames : simpleProcessorExporterNames) { SpanExporter exporter = exportersByNameCopy.remove(simpleProcessorExporterNames); if (exporter != null) { - SpanProcessor spanProcessor = - SimpleSpanProcessor.builder(exporter).setMeterProvider(() -> meterProvider).build(); + SimpleSpanProcessorBuilder spanProcessorBuilder = SimpleSpanProcessor.builder(exporter); + if (telemetryVersion != InternalTelemetryVersion.LEGACY) { + spanProcessorBuilder.setMeterProvider(() -> meterProvider); + } + SpanProcessor spanProcessor = spanProcessorBuilder.build(); closeables.add(spanProcessor); spanProcessors.add(spanProcessor); } @@ -91,7 +101,8 @@ static List configureSpanProcessors( if (!exportersByNameCopy.isEmpty()) { SpanExporter compositeSpanExporter = SpanExporter.composite(exportersByNameCopy.values()); SpanProcessor spanProcessor = - configureBatchSpanProcessor(config, compositeSpanExporter, meterProvider); + configureBatchSpanProcessor( + config, compositeSpanExporter, telemetryVersion, meterProvider); closeables.add(spanProcessor); spanProcessors.add(spanProcessor); } @@ -101,7 +112,10 @@ static List configureSpanProcessors( // VisibleForTesting static BatchSpanProcessor configureBatchSpanProcessor( - ConfigProperties config, SpanExporter exporter, MeterProvider meterProvider) { + ConfigProperties config, + SpanExporter exporter, + InternalTelemetryVersion telemetryVersion, + MeterProvider meterProvider) { BatchSpanProcessorBuilder builder = BatchSpanProcessor.builder(exporter).setMeterProvider(() -> meterProvider); @@ -125,6 +139,8 @@ static BatchSpanProcessor configureBatchSpanProcessor( builder.setExporterTimeout(timeout); } + builder.setInternalTelemetryVersion(telemetryVersion); + return builder.build(); } 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 e0ddcb438fe..450c98cacad 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 @@ -17,6 +17,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.common.InternalTelemetryVersion; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; import io.opentelemetry.sdk.trace.SpanLimits; @@ -100,7 +101,7 @@ void configureTracerProvider() { void configureBatchSpanProcessor_empty() { try (BatchSpanProcessor processor = TracerProviderConfiguration.configureBatchSpanProcessor( - EMPTY, mockSpanExporter, MeterProvider.noop())) { + EMPTY, mockSpanExporter, InternalTelemetryVersion.LEGACY, MeterProvider.noop())) { assertThat(processor) .extracting("worker") .satisfies( @@ -133,6 +134,7 @@ void configureBatchSpanProcessor_configured() { TracerProviderConfiguration.configureBatchSpanProcessor( DefaultConfigProperties.createFromMap(properties), mockSpanExporter, + InternalTelemetryVersion.LEGACY, MeterProvider.noop())) { assertThat(processor) .extracting("worker") diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/ConfigurableSpanExporterTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/ConfigurableSpanExporterTest.java index 69a86641084..cce800d494d 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/ConfigurableSpanExporterTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/ConfigurableSpanExporterTest.java @@ -20,6 +20,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; +import io.opentelemetry.sdk.common.InternalTelemetryVersion; import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; @@ -149,6 +150,7 @@ void configureSpanProcessors_simpleSpanProcessor() { DefaultConfigProperties.createFromMap( Collections.singletonMap("otel.traces.exporter", "console,logging")), exportersByName, + InternalTelemetryVersion.LEGACY, MeterProvider.noop(), closeables); cleanup.addCloseables(closeables); @@ -171,6 +173,7 @@ void configureSpanProcessors_batchSpanProcessor() { ImmutableMap.of( exporterName, io.opentelemetry.exporter.zipkin.ZipkinSpanExporter.builder().build()), + InternalTelemetryVersion.LEGACY, MeterProvider.noop(), closeables); cleanup.addCloseables(closeables); @@ -192,6 +195,7 @@ void configureSpanProcessors_multipleExporters() { OtlpGrpcSpanExporter.builder().build(), "zipkin", io.opentelemetry.exporter.zipkin.ZipkinSpanExporter.builder().build()), + InternalTelemetryVersion.LEGACY, MeterProvider.noop(), closeables); cleanup.addCloseables(closeables); @@ -235,6 +239,7 @@ void configureSpanProcessors_multipleExportersWithLogging() { LoggingSpanExporter.create(), "zipkin", io.opentelemetry.exporter.zipkin.ZipkinSpanExporter.builder().build()), + InternalTelemetryVersion.LEGACY, MeterProvider.noop(), closeables); cleanup.addCloseables(closeables); 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 5469bd9684d..b1802b4c89c 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 @@ -35,6 +35,7 @@ import io.opentelemetry.proto.common.v1.AnyValue; import io.opentelemetry.proto.common.v1.KeyValue; import io.opentelemetry.proto.metrics.v1.Metric; +import io.opentelemetry.proto.metrics.v1.ScopeMetrics; import io.opentelemetry.sdk.OpenTelemetrySdk; import java.util.ArrayList; import java.util.Collection; @@ -42,6 +43,7 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -220,6 +222,8 @@ void configures() throws Exception { assertHasKeyValue(span.getAttributesList(), "cat", "meow"); assertHasKeyValue(span.getAttributesList(), "extra-key", "extra-value"); + // Flush again to get metric exporter metrics. + openTelemetrySdk.getSdkMeterProvider().forceFlush().join(10, TimeUnit.SECONDS); // await on assertions since metrics may come in different order for BatchSpanProcessor, // exporter, or the ones we created in the test. await() @@ -252,19 +256,62 @@ void configures() throws Exception { }) // This verifies that AutoConfigureListener was invoked and the OTLP // span / log exporters received the autoconfigured OpenTelemetrySdk - // instance + // instance as well as setting telemetry version. .anySatisfy( scopeMetrics -> { assertThat(scopeMetrics.getScope().getName()) - .isEqualTo("io.opentelemetry.exporters.otlp-grpc"); - assertThat(scopeMetrics.getMetricsList()) - .satisfiesExactlyInAnyOrder( - metric -> - assertThat(metric.getName()) - .isEqualTo("otlp.exporter.seen"), - metric -> - assertThat(metric.getName()) - .isEqualTo("otlp.exporter.exported")); + .isEqualTo( + "io.opentelemetry.exporters.otlp_grpc_metric_exporter"); + assertMetricNames( + scopeMetrics, + "otel.sdk.exporter.metric_data_point.inflight", + "otel.sdk.exporter.operation.duration", + "otel.sdk.exporter.metric_data_point.exported"); + }) + .anySatisfy( + scopeMetrics -> { + assertThat(scopeMetrics.getScope().getName()) + .isEqualTo( + "io.opentelemetry.exporters.otlp_grpc_log_exporter"); + assertMetricNames( + scopeMetrics, + "otel.sdk.exporter.log.inflight", + "otel.sdk.exporter.operation.duration", + "otel.sdk.exporter.log.exported"); + }) + .anySatisfy( + scopeMetrics -> { + assertThat(scopeMetrics.getScope().getName()) + .isEqualTo( + "io.opentelemetry.exporters.otlp_grpc_span_exporter"); + assertMetricNames( + scopeMetrics, + "otel.sdk.exporter.span.inflight", + "otel.sdk.exporter.operation.duration", + "otel.sdk.exporter.span.exported"); + }) + .anySatisfy( + scopeMetrics -> { + assertThat(scopeMetrics.getScope().getName()) + .isEqualTo("io.opentelemetry.sdk.logs"); + assertMetricNames( + scopeMetrics, + "otel.sdk.log.created", + "otel.sdk.processor.log.processed", + "otel.sdk.processor.log.queue.capacity", + "otel.sdk.processor.log.queue.size"); + }) + .anySatisfy( + scopeMetrics -> { + assertThat(scopeMetrics.getScope().getName()) + .isEqualTo("io.opentelemetry.sdk.trace"); + assertMetricNames( + scopeMetrics, + "otel.sdk.span.live", + "otel.sdk.span.started", + "otel.sdk.processor.span.processed", + "otel.sdk.processor.span.queue.capacity", + "otel.sdk.processor.span.queue.size"); }); }); }); @@ -318,6 +365,12 @@ private static void assertHasKeyValue(List keyValues, String key, Stri .build()); } + private static void assertMetricNames(ScopeMetrics scopeMetrics, String... names) { + assertThat( + scopeMetrics.getMetricsList().stream().map(Metric::getName).collect(Collectors.toSet())) + .containsExactlyInAnyOrder(names); + } + private static List getFirstDataPointLabels(Metric metric) { switch (metric.getDataCase()) { case GAUGE: diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/LoggerProviderConfigurationTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/LoggerProviderConfigurationTest.java index 9609f8cb4d3..f76bcad0fe8 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/LoggerProviderConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/LoggerProviderConfigurationTest.java @@ -13,6 +13,7 @@ import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; +import io.opentelemetry.sdk.common.InternalTelemetryVersion; import io.opentelemetry.sdk.logs.LogRecordProcessor; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder; @@ -93,6 +94,7 @@ void configureLogRecordProcessors_multipleExportersWithLogging() { LoggerProviderConfiguration.configureLogRecordProcessors( DefaultConfigProperties.createFromMap(Collections.emptyMap()), exportersByName, + InternalTelemetryVersion.LEGACY, MeterProvider.noop(), closeables); cleanup.addCloseables(closeables); @@ -123,6 +125,7 @@ void configureBatchLogRecordProcessor() { LoggerProviderConfiguration.configureBatchLogRecordProcessor( DefaultConfigProperties.createFromMap(properties), SystemOutLogRecordExporter.create(), + InternalTelemetryVersion.LEGACY, MeterProvider.noop())) { assertThat(processor) .extracting("worker") diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/provider/MetricCustomizer.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/provider/MetricCustomizer.java index c65434cf908..3171f8d91e5 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/provider/MetricCustomizer.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/provider/MetricCustomizer.java @@ -55,7 +55,11 @@ public CompletableResultCode export(Collection metrics) { || metricData .getInstrumentationScopeInfo() .getName() - .startsWith("io.opentelemetry.exporters")) + .startsWith("io.opentelemetry.exporters") + || metricData + .getInstrumentationScopeInfo() + .getName() + .startsWith("io.opentelemetry.sdk")) .collect(Collectors.toList()); return delegate.export(filtered); }