diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpConnectionDetails.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsConnectionDetails.java similarity index 81% rename from spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpConnectionDetails.java rename to spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsConnectionDetails.java index 7e294e1bac9..16f968a89de 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpConnectionDetails.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsConnectionDetails.java @@ -22,10 +22,14 @@ import org.springframework.boot.autoconfigure.service.connection.ConnectionDetai * Details required to establish a connection to a OpenTelemetry Collector service. * * @author Eddú Meléndez - * @since 3.1.0 + * @since 3.2.0 */ -public interface OtlpConnectionDetails extends ConnectionDetails { +public interface OtlpMetricsConnectionDetails extends ConnectionDetails { + /** + * Address to where metrics will be published. + * @return the address to where metrics will be published + */ String getUrl(); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfiguration.java index 8e87dc48994..546503c6d9a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfiguration.java @@ -50,17 +50,24 @@ import org.springframework.core.env.Environment; @EnableConfigurationProperties({ OtlpProperties.class, OpenTelemetryProperties.class }) public class OtlpMetricsExportAutoConfiguration { + private final OtlpProperties properties; + + OtlpMetricsExportAutoConfiguration(OtlpProperties properties) { + this.properties = properties; + } + @Bean - @ConditionalOnMissingBean(OtlpConnectionDetails.class) - public OtlpConnectionDetails otlpConnectionDetails(OtlpProperties properties) { - return new PropertiesOtlpConnectionDetails(properties); + @ConditionalOnMissingBean(OtlpMetricsConnectionDetails.class) + OtlpMetricsConnectionDetails otlpMetricsConnectionDetails() { + return new PropertiesOtlpMetricsConnectionDetails(this.properties); } @Bean @ConditionalOnMissingBean - OtlpConfig otlpConfig(OtlpProperties properties, OpenTelemetryProperties openTelemetryProperties, - OtlpConnectionDetails connectionDetails, Environment environment) { - return new OtlpPropertiesConfigAdapter(properties, openTelemetryProperties, connectionDetails, environment); + OtlpConfig otlpConfig(OpenTelemetryProperties openTelemetryProperties, + OtlpMetricsConnectionDetails connectionDetails, Environment environment) { + return new OtlpPropertiesConfigAdapter(this.properties, openTelemetryProperties, connectionDetails, + environment); } @Bean @@ -70,13 +77,13 @@ public class OtlpMetricsExportAutoConfiguration { } /** - * Adapts {@link OtlpProperties} to {@link OtlpConnectionDetails}. + * Adapts {@link OtlpProperties} to {@link OtlpMetricsConnectionDetails}. */ - static class PropertiesOtlpConnectionDetails implements OtlpConnectionDetails { + static class PropertiesOtlpMetricsConnectionDetails implements OtlpMetricsConnectionDetails { private final OtlpProperties properties; - PropertiesOtlpConnectionDetails(OtlpProperties properties) { + PropertiesOtlpMetricsConnectionDetails(OtlpProperties properties) { this.properties = properties; } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapter.java index e6ea8f14ba0..c77b39a9261 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapter.java @@ -45,12 +45,12 @@ class OtlpPropertiesConfigAdapter extends StepRegistryPropertiesConfigAdapter header : properties.getHeaders().entrySet()) { - builder.addHeader(header.getKey(), header.getValue()); - } - return builder.build(); - } - - /** - * Adapts {@link OtlpProperties} to {@link OtlpTracingConnectionDetails}. - */ - static class PropertiesOtlpTracingConnectionDetails implements OtlpTracingConnectionDetails { - - private final OtlpProperties properties; - - PropertiesOtlpTracingConnectionDetails(OtlpProperties properties) { - this.properties = properties; - } - - @Override - public String getEndpoint() { - return this.properties.getEndpoint(); - } - - } - } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConfigurations.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConfigurations.java new file mode 100644 index 00000000000..6fc5f21fd19 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConfigurations.java @@ -0,0 +1,93 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure.tracing.otlp; + +import java.util.Map.Entry; + +import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; +import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder; + +import org.springframework.boot.actuate.autoconfigure.tracing.ConditionalOnEnabledTracing; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configurations imported by {@link OtlpAutoConfiguration}. + * + * @author Moritz Halbritter + */ +final class OtlpTracingConfigurations { + + private OtlpTracingConfigurations() { + } + + @Configuration(proxyBeanMethods = false) + static class ConnectionDetails { + + @Bean + @ConditionalOnMissingBean(OtlpTracingConnectionDetails.class) + @ConditionalOnProperty(prefix = "management.otlp.tracing", name = "endpoint") + OtlpTracingConnectionDetails otlpTracingConnectionDetails(OtlpProperties properties) { + return new PropertiesOtlpTracingConnectionDetails(properties); + } + + /** + * Adapts {@link OtlpProperties} to {@link OtlpTracingConnectionDetails}. + */ + static class PropertiesOtlpTracingConnectionDetails implements OtlpTracingConnectionDetails { + + private final OtlpProperties properties; + + PropertiesOtlpTracingConnectionDetails(OtlpProperties properties) { + this.properties = properties; + } + + @Override + public String getEndpoint() { + return this.properties.getEndpoint(); + } + + } + + } + + @Configuration(proxyBeanMethods = false) + static class Exporters { + + @Bean + @ConditionalOnMissingBean(value = OtlpHttpSpanExporter.class, + type = "io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter") + @ConditionalOnBean(OtlpTracingConnectionDetails.class) + @ConditionalOnEnabledTracing + OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties, + OtlpTracingConnectionDetails connectionDetails) { + OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder() + .setEndpoint(connectionDetails.getEndpoint()) + .setTimeout(properties.getTimeout()) + .setCompression(properties.getCompression().name().toLowerCase()); + for (Entry header : properties.getHeaders().entrySet()) { + builder.addHeader(header.getKey(), header.getValue()); + } + return builder.build(); + } + + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConnectionDetails.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConnectionDetails.java index 9bbcf58aba7..e5c8e5b3753 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConnectionDetails.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConnectionDetails.java @@ -22,10 +22,14 @@ import org.springframework.boot.autoconfigure.service.connection.ConnectionDetai * Details required to establish a connection to a OpenTelemetry service. * * @author Eddú Meléndez - * @since 3.1.0 + * @since 3.2.0 */ public interface OtlpTracingConnectionDetails extends ConnectionDetails { + /** + * Address to where metrics will be published. + * @return the address to where metrics will be published + */ String getEndpoint(); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfigurationTests.java index 9a7648387fc..f303e4a2cfd 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfigurationTests.java @@ -21,6 +21,7 @@ import io.micrometer.registry.otlp.OtlpConfig; import io.micrometer.registry.otlp.OtlpMeterRegistry; import org.junit.jupiter.api.Test; +import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; @@ -86,16 +87,15 @@ class OtlpMetricsExportAutoConfigurationTests { @Test void definesPropertiesBasedConnectionDetailsByDefault() { this.contextRunner.withUserConfiguration(BaseConfiguration.class) - .run((context) -> assertThat(context) - .hasSingleBean(OtlpMetricsExportAutoConfiguration.PropertiesOtlpConnectionDetails.class)); + .run((context) -> assertThat(context).hasSingleBean(PropertiesOtlpMetricsConnectionDetails.class)); } @Test void testConnectionFactoryWithOverridesWhenUsingCustomConnectionDetails() { this.contextRunner.withUserConfiguration(BaseConfiguration.class, ConnectionDetailsConfiguration.class) .run((context) -> { - assertThat(context).hasSingleBean(OtlpConnectionDetails.class) - .doesNotHaveBean(OtlpMetricsExportAutoConfiguration.PropertiesOtlpConnectionDetails.class); + assertThat(context).hasSingleBean(OtlpMetricsConnectionDetails.class) + .doesNotHaveBean(PropertiesOtlpMetricsConnectionDetails.class); OtlpConfig config = context.getBean(OtlpConfig.class); assertThat(config.url()).isEqualTo("http://localhost:12345/v1/metrics"); }); @@ -137,7 +137,7 @@ class OtlpMetricsExportAutoConfigurationTests { static class ConnectionDetailsConfiguration { @Bean - OtlpConnectionDetails otlpConnectionDetails() { + OtlpMetricsConnectionDetails otlpConnectionDetails() { return () -> "http://localhost:12345/v1/metrics"; } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapterTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapterTests.java index 0fd2e2e7cb2..25151b63a64 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapterTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapterTests.java @@ -24,7 +24,7 @@ import io.micrometer.registry.otlp.AggregationTemporality; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpConnectionDetails; +import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails; import org.springframework.boot.actuate.autoconfigure.opentelemetry.OpenTelemetryProperties; import org.springframework.mock.env.MockEnvironment; @@ -45,14 +45,14 @@ class OtlpPropertiesConfigAdapterTests { private MockEnvironment environment; - private OtlpConnectionDetails connectionDetails; + private OtlpMetricsConnectionDetails connectionDetails; @BeforeEach void setUp() { this.properties = new OtlpProperties(); this.openTelemetryProperties = new OpenTelemetryProperties(); this.environment = new MockEnvironment(); - this.connectionDetails = new PropertiesOtlpConnectionDetails(this.properties); + this.connectionDetails = new PropertiesOtlpMetricsConnectionDetails(this.properties); } @Test diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpAutoConfigurationTests.java index 301410b7631..9ca5956e225 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpAutoConfigurationTests.java @@ -22,6 +22,7 @@ import io.opentelemetry.sdk.trace.export.SpanExporter; import okhttp3.HttpUrl; import org.junit.jupiter.api.Test; +import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConfigurations.ConnectionDetails.PropertiesOtlpTracingConnectionDetails; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -111,15 +112,14 @@ class OtlpAutoConfigurationTests { @Test void definesPropertiesBasedConnectionDetailsByDefault() { this.contextRunner.withPropertyValues("management.otlp.tracing.endpoint=http://localhost:4318/v1/traces") - .run((context) -> assertThat(context) - .hasSingleBean(OtlpAutoConfiguration.PropertiesOtlpTracingConnectionDetails.class)); + .run((context) -> assertThat(context).hasSingleBean(PropertiesOtlpTracingConnectionDetails.class)); } @Test void testConnectionFactoryWithOverridesWhenUsingCustomConnectionDetails() { this.contextRunner.withUserConfiguration(ConnectionDetailsConfiguration.class).run((context) -> { assertThat(context).hasSingleBean(OtlpTracingConnectionDetails.class) - .doesNotHaveBean(OtlpAutoConfiguration.PropertiesOtlpTracingConnectionDetails.class); + .doesNotHaveBean(PropertiesOtlpTracingConnectionDetails.class); OtlpHttpSpanExporter otlpHttpSpanExporter = context.getBean(OtlpHttpSpanExporter.class); assertThat(otlpHttpSpanExporter).extracting("delegate.httpSender.url") .isEqualTo(HttpUrl.get("http://localhost:12345/v1/traces")); diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryMetricsDockerComposeConnectionDetailsFactory.java similarity index 62% rename from spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryDockerComposeConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryMetricsDockerComposeConnectionDetailsFactory.java index e8a1aae3eba..2df408c968d 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryMetricsDockerComposeConnectionDetailsFactory.java @@ -16,40 +16,40 @@ package org.springframework.boot.docker.compose.service.connection.otlp; -import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpConnectionDetails; +import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsConnectionDetails; import org.springframework.boot.docker.compose.core.RunningService; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; /** - * {@link DockerComposeConnectionDetailsFactory} to create {@link OtlpConnectionDetails} - * for a {@code otlp} service. + * {@link DockerComposeConnectionDetailsFactory} to create + * {@link OtlpMetricsConnectionDetails} for a {@code OTLP} service. * * @author Eddú Meléndez */ -class OpenTelemetryDockerComposeConnectionDetailsFactory - extends DockerComposeConnectionDetailsFactory { +class OpenTelemetryMetricsDockerComposeConnectionDetailsFactory + extends DockerComposeConnectionDetailsFactory { private static final int OTLP_PORT = 4318; - OpenTelemetryDockerComposeConnectionDetailsFactory() { + OpenTelemetryMetricsDockerComposeConnectionDetailsFactory() { super("otel/opentelemetry-collector-contrib", "org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration"); } @Override - protected OtlpConnectionDetails getDockerComposeConnectionDetails(DockerComposeConnectionSource source) { - return new OpenTelemetryContainerConnectionDetails(source.getRunningService()); + protected OtlpMetricsConnectionDetails getDockerComposeConnectionDetails(DockerComposeConnectionSource source) { + return new OpenTelemetryContainerMetricsConnectionDetails(source.getRunningService()); } - private static final class OpenTelemetryContainerConnectionDetails extends DockerComposeConnectionDetails - implements OtlpConnectionDetails { + private static final class OpenTelemetryContainerMetricsConnectionDetails extends DockerComposeConnectionDetails + implements OtlpMetricsConnectionDetails { private final String host; private final int port; - private OpenTelemetryContainerConnectionDetails(RunningService source) { + private OpenTelemetryContainerMetricsConnectionDetails(RunningService source) { super(source); this.host = source.host(); this.port = source.ports().get(OTLP_PORT); @@ -57,7 +57,7 @@ class OpenTelemetryDockerComposeConnectionDetailsFactory @Override public String getUrl() { - return "http://" + this.host + ":" + this.port + "/v1/metrics"; + return "http://%s:%d/v1/metrics".formatted(this.host, this.port); } } diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactory.java index e137a17b0f1..2a1254017fa 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactory.java @@ -23,7 +23,7 @@ import org.springframework.boot.docker.compose.service.connection.DockerComposeC /** * {@link DockerComposeConnectionDetailsFactory} to create - * {@link OtlpTracingConnectionDetails} for a {@code otlp} service. + * {@link OtlpTracingConnectionDetails} for a {@code OTLP} service. * * @author Eddú Meléndez */ @@ -57,7 +57,7 @@ class OpenTelemetryTracingDockerComposeConnectionDetailsFactory @Override public String getEndpoint() { - return "http://" + this.host + ":" + this.port + "/v1/traces"; + return "http://%s:%d/v1/traces".formatted(this.host, this.port); } } diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-docker-compose/src/main/resources/META-INF/spring.factories index fad3f7bb068..80fe3d28309 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot-docker-compose/src/main/resources/META-INF/spring.factories @@ -17,7 +17,7 @@ org.springframework.boot.docker.compose.service.connection.mysql.MySqlJdbcDocker org.springframework.boot.docker.compose.service.connection.mysql.MySqlR2dbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.oracle.OracleJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.oracle.OracleR2dbcDockerComposeConnectionDetailsFactory,\ -org.springframework.boot.docker.compose.service.connection.otlp.OpenTelemetryDockerComposeConnectionDetailsFactory,\ +org.springframework.boot.docker.compose.service.connection.otlp.OpenTelemetryMetricsDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.otlp.OpenTelemetryTracingDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.postgres.PostgresJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.postgres.PostgresR2dbcDockerComposeConnectionDetailsFactory,\ diff --git a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryMetricsDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryMetricsDockerComposeConnectionDetailsFactoryIntegrationTests.java new file mode 100644 index 00000000000..b2fa3e93e78 --- /dev/null +++ b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryMetricsDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.docker.compose.service.connection.otlp; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsConnectionDetails; +import org.springframework.boot.docker.compose.service.connection.test.AbstractDockerComposeIntegrationTests; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for + * {@link OpenTelemetryMetricsDockerComposeConnectionDetailsFactory}. + * + * @author Eddú Meléndez + */ +public class OpenTelemetryMetricsDockerComposeConnectionDetailsFactoryIntegrationTests + extends AbstractDockerComposeIntegrationTests { + + OpenTelemetryMetricsDockerComposeConnectionDetailsFactoryIntegrationTests() { + super("otlp-compose.yaml", DockerImageNames.opentelemetry()); + } + + @Test + void runCreatesConnectionDetails() { + OtlpMetricsConnectionDetails connectionDetails = run(OtlpMetricsConnectionDetails.class); + assertThat(connectionDetails.getUrl()).startsWith("http://").endsWith("/v1/metrics"); + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java similarity index 72% rename from spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryDockerComposeConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java index 4997b96248b..5eee38a1e49 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -18,7 +18,6 @@ package org.springframework.boot.docker.compose.service.connection.otlp; import org.junit.jupiter.api.Test; -import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpConnectionDetails; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails; import org.springframework.boot.docker.compose.service.connection.test.AbstractDockerComposeIntegrationTests; import org.springframework.boot.testsupport.testcontainers.DockerImageNames; @@ -26,25 +25,20 @@ import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import static org.assertj.core.api.Assertions.assertThat; /** - * Integration tests for {@link OpenTelemetryDockerComposeConnectionDetailsFactory}. + * Integration tests for + * {@link OpenTelemetryTracingDockerComposeConnectionDetailsFactory}. * * @author Eddú Meléndez */ -public class OpenTelemetryDockerComposeConnectionDetailsFactoryIntegrationTests +public class OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests extends AbstractDockerComposeIntegrationTests { - OpenTelemetryDockerComposeConnectionDetailsFactoryIntegrationTests() { + OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests() { super("otlp-compose.yaml", DockerImageNames.opentelemetry()); } @Test void runCreatesConnectionDetails() { - OtlpConnectionDetails connectionDetails = run(OtlpConnectionDetails.class); - assertThat(connectionDetails.getUrl()).startsWith("http://").endsWith("/v1/metrics"); - } - - @Test - void runCreatesTracingConnectionDetails() { OtlpTracingConnectionDetails connectionDetails = run(OtlpTracingConnectionDetails.class); assertThat(connectionDetails.getEndpoint()).startsWith("http://").endsWith("/v1/traces"); } diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/docker-compose.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/docker-compose.adoc index 4caedf39606..bebc060fa19 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/docker-compose.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/docker-compose.adoc @@ -76,6 +76,12 @@ The following service connections are currently supported: | `MongoConnectionDetails` | Containers named "mongo" +| `OtlpMetricsConnectionDetails` +| Containers named "otel/opentelemetry-collector-contrib" + +| `OtlpTracingConnectionDetails` +| Containers named "otel/opentelemetry-collector-contrib" + | `PulsarConnectionDetails` | Containers named "apachepulsar/pulsar" diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/testing.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/testing.adoc index dadaf2d19e0..71e79813b88 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/testing.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/testing.adoc @@ -992,7 +992,10 @@ The following service connection factories are provided in the `spring-boot-test | `Neo4jConnectionDetails` | Containers of type `Neo4jContainer` -| `OtlpConnectionDetails` +| `OtlpMetricsConnectionDetails` +| Containers named "otel/opentelemetry-collector-contrib" + +| `OtlpTracingConnectionDetails` | Containers named "otel/opentelemetry-collector-contrib" | `PulsarConnectionDetails` diff --git a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryConnectionDetailsFactory.java b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryMetricsConnectionDetailsFactory.java similarity index 59% rename from spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryMetricsConnectionDetailsFactory.java index f9708636bd5..a200750e1b1 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryMetricsConnectionDetailsFactory.java @@ -19,41 +19,43 @@ package org.springframework.boot.testcontainers.service.connection.otlp; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; -import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpConnectionDetails; +import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsConnectionDetails; import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory; import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; /** - * {@link ContainerConnectionDetailsFactory} to create {@link OtlpConnectionDetails} from - * a {@link ServiceConnection @ServiceConnection}-annotated {@link GenericContainer} using + * {@link ContainerConnectionDetailsFactory} to create + * {@link OtlpMetricsConnectionDetails} from a + * {@link ServiceConnection @ServiceConnection}-annotated {@link GenericContainer} using * the {@code "otel/opentelemetry-collector-contrib"} image. * * @author Eddú Meléndez */ -class OpenTelemetryConnectionDetailsFactory - extends ContainerConnectionDetailsFactory, OtlpConnectionDetails> { +class OpenTelemetryMetricsConnectionDetailsFactory + extends ContainerConnectionDetailsFactory, OtlpMetricsConnectionDetails> { - OpenTelemetryConnectionDetailsFactory() { + OpenTelemetryMetricsConnectionDetailsFactory() { super("otel/opentelemetry-collector-contrib", "org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration"); } @Override - protected OtlpConnectionDetails getContainerConnectionDetails(ContainerConnectionSource> source) { - return new OpenTelemetryContainerConnectionDetails(source); + protected OtlpMetricsConnectionDetails getContainerConnectionDetails( + ContainerConnectionSource> source) { + return new OpenTelemetryContainerMetricsConnectionDetails(source); } - private static final class OpenTelemetryContainerConnectionDetails extends ContainerConnectionDetails> - implements OtlpConnectionDetails { + private static final class OpenTelemetryContainerMetricsConnectionDetails + extends ContainerConnectionDetails> implements OtlpMetricsConnectionDetails { - private OpenTelemetryContainerConnectionDetails(ContainerConnectionSource> source) { + private OpenTelemetryContainerMetricsConnectionDetails(ContainerConnectionSource> source) { super(source); } @Override public String getUrl() { - return "http://" + getContainer().getHost() + ":" + getContainer().getMappedPort(4318) + "/v1/metrics"; + return "http://%s:%d/v1/metrics".formatted(getContainer().getHost(), getContainer().getMappedPort(4318)); } } diff --git a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingConnectionDetailsFactory.java b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingConnectionDetailsFactory.java index cc82b3c9320..0a6d9f63698 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingConnectionDetailsFactory.java @@ -55,7 +55,7 @@ class OpenTelemetryTracingConnectionDetailsFactory @Override public String getEndpoint() { - return "http://" + getContainer().getHost() + ":" + getContainer().getMappedPort(4318) + "/v1/traces"; + return "http://%s:%d/v1/traces".formatted(getContainer().getHost(), getContainer().getMappedPort(4318)); } } diff --git a/spring-boot-project/spring-boot-testcontainers/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-testcontainers/src/main/resources/META-INF/spring.factories index 2ee8ddf68f9..ae8435cb3f7 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot-testcontainers/src/main/resources/META-INF/spring.factories @@ -19,7 +19,7 @@ org.springframework.boot.testcontainers.service.connection.kafka.KafkaContainerC org.springframework.boot.testcontainers.service.connection.liquibase.LiquibaseContainerConnectionDetailsFactory,\ org.springframework.boot.testcontainers.service.connection.mongo.MongoContainerConnectionDetailsFactory,\ org.springframework.boot.testcontainers.service.connection.neo4j.Neo4jContainerConnectionDetailsFactory,\ -org.springframework.boot.testcontainers.service.connection.otlp.OpenTelemetryConnectionDetailsFactory,\ +org.springframework.boot.testcontainers.service.connection.otlp.OpenTelemetryMetricsConnectionDetailsFactory,\ org.springframework.boot.testcontainers.service.connection.otlp.OpenTelemetryTracingConnectionDetailsFactory,\ org.springframework.boot.testcontainers.service.connection.pulsar.PulsarContainerConnectionDetailsFactory,\ org.springframework.boot.testcontainers.service.connection.r2dbc.MariaDbR2dbcContainerConnectionDetailsFactory,\ diff --git a/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OtlpContainerConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryMetricsConnectionDetailsFactoryIntegrationTests.java similarity index 97% rename from spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OtlpContainerConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryMetricsConnectionDetailsFactoryIntegrationTests.java index d7947dac68d..d2c85b30147 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OtlpContainerConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryMetricsConnectionDetailsFactoryIntegrationTests.java @@ -48,7 +48,7 @@ import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.matchesPattern; /** - * Tests for {@link OpenTelemetryConnectionDetailsFactory}. + * Tests for {@link OpenTelemetryMetricsConnectionDetailsFactory}. * * @author Eddú Meléndez * @author Jonatan Ivanov @@ -57,7 +57,7 @@ import static org.hamcrest.Matchers.matchesPattern; @TestPropertySource(properties = { "management.otlp.metrics.export.resource-attributes.service.name=test", "management.otlp.metrics.export.step=1s" }) @Testcontainers(disabledWithoutDocker = true) -class OtlpContainerConnectionDetailsFactoryIntegrationTests { +class OpenTelemetryMetricsConnectionDetailsFactoryIntegrationTests { private static final String OPENMETRICS_001 = "application/openmetrics-text; version=0.0.1; charset=utf-8"; diff --git a/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OtlpTracingContainerConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingConnectionDetailsFactoryIntegrationTests.java similarity index 97% rename from spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OtlpTracingContainerConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingConnectionDetailsFactoryIntegrationTests.java index 86900abb77e..f752c3b18ec 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OtlpTracingContainerConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingConnectionDetailsFactoryIntegrationTests.java @@ -39,7 +39,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ @SpringJUnitConfig @Testcontainers(disabledWithoutDocker = true) -class OtlpTracingContainerConnectionDetailsFactoryIntegrationTests { +class OpenTelemetryTracingConnectionDetailsFactoryIntegrationTests { @Container @ServiceConnection