From 7baa5537601ff5ae02b078c39fde704ca8bbe8da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 5 Jul 2024 09:43:41 -0600 Subject: [PATCH 1/2] Support Otlp Tracing's GRPC port from service connections Otlp Tracing's exporter is configured using Transport. Current support for service connections read the mapped port for HTTP transport 4318. This commits adds support to read port for GRPC transport 4317. See gh-41333 --- .../otlp/OtlpTracingConfigurations.java | 15 +++++++++++++-- .../otlp/OtlpTracingConnectionDetails.java | 6 +++++- ...nnectionDetailsFactoryIntegrationTests.java | 1 + .../service/connection/otlp/otlp-compose.yaml | 1 + ...gDockerComposeConnectionDetailsFactory.java | 18 ++++++++++++++---- ...nnectionDetailsFactoryIntegrationTests.java | 5 ++++- ...acingContainerConnectionDetailsFactory.java | 15 +++++++++++++-- 7 files changed, 51 insertions(+), 10 deletions(-) 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 index f222fb249d5..597206f4906 100644 --- 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 @@ -23,6 +23,7 @@ import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder; +import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport; import org.springframework.boot.actuate.autoconfigure.tracing.ConditionalOnEnabledTracing; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -34,6 +35,7 @@ import org.springframework.context.annotation.Configuration; * Configurations imported by {@link OtlpAutoConfiguration}. * * @author Moritz Halbritter + * @author Eddú Meléndez */ class OtlpTracingConfigurations { @@ -63,6 +65,11 @@ class OtlpTracingConfigurations { return this.properties.getEndpoint(); } + @Override + public String getGrpcEndpoint() { + return this.properties.getEndpoint(); + } + } } @@ -79,7 +86,7 @@ class OtlpTracingConfigurations { OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties, OtlpTracingConnectionDetails connectionDetails) { OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder() - .setEndpoint(connectionDetails.getUrl()) + .setEndpoint(resolveEndpoint(properties.getTransport(), connectionDetails)) .setTimeout(properties.getTimeout()) .setCompression(properties.getCompression().name().toLowerCase()); for (Entry header : properties.getHeaders().entrySet()) { @@ -93,7 +100,7 @@ class OtlpTracingConfigurations { OtlpGrpcSpanExporter otlpGrpcSpanExporter(OtlpProperties properties, OtlpTracingConnectionDetails connectionDetails) { OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder() - .setEndpoint(connectionDetails.getUrl()) + .setEndpoint(resolveEndpoint(properties.getTransport(), connectionDetails)) .setTimeout(properties.getTimeout()) .setCompression(properties.getCompression().name().toLowerCase()); for (Entry header : properties.getHeaders().entrySet()) { @@ -102,6 +109,10 @@ class OtlpTracingConfigurations { return builder.build(); } + private static String resolveEndpoint(Transport transport, OtlpTracingConnectionDetails connectionDetails) { + return (transport == Transport.HTTP) ? connectionDetails.getUrl() : connectionDetails.getGrpcEndpoint(); + } + } } 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 a84b11d64da..b1eeb28b196 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 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. @@ -32,4 +32,8 @@ public interface OtlpTracingConnectionDetails extends ConnectionDetails { */ String getUrl(); + default String getGrpcEndpoint() { + return "http://localhost:4317/v1/traces"; + } + } diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java index 50a713e7fdb..6b9304a37d5 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -32,6 +32,7 @@ class OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests @DockerComposeTest(composeFile = "otlp-compose.yaml", image = TestImage.OPENTELEMETRY) void runCreatesConnectionDetails(OtlpTracingConnectionDetails connectionDetails) { + assertThat(connectionDetails.getGrpcEndpoint()).startsWith("http://").endsWith("/v1/traces"); assertThat(connectionDetails.getUrl()).startsWith("http://").endsWith("/v1/traces"); } diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/otlp/otlp-compose.yaml b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/otlp/otlp-compose.yaml index 258e73e333e..86e05475417 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/otlp/otlp-compose.yaml +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/otlp/otlp-compose.yaml @@ -2,4 +2,5 @@ services: otlp: image: '{imageName}' ports: + - '4317' - '4318' 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 d2be0b11eec..3c0ad3a32b5 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 @@ -33,7 +33,9 @@ class OpenTelemetryTracingDockerComposeConnectionDetailsFactory private static final String[] OPENTELEMETRY_IMAGE_NAMES = { "otel/opentelemetry-collector-contrib", "grafana/otel-lgtm" }; - private static final int OTLP_PORT = 4318; + private static final int OTLP_GRPC_PORT = 4317; + + private static final int OTLP_HTTP_PORT = 4318; OpenTelemetryTracingDockerComposeConnectionDetailsFactory() { super(OPENTELEMETRY_IMAGE_NAMES, @@ -50,17 +52,25 @@ class OpenTelemetryTracingDockerComposeConnectionDetailsFactory private final String host; - private final int port; + private final int grpcPort; + + private final int httPort; private OpenTelemetryTracingDockerComposeConnectionDetails(RunningService source) { super(source); this.host = source.host(); - this.port = source.ports().get(OTLP_PORT); + this.grpcPort = source.ports().get(OTLP_GRPC_PORT); + this.httPort = source.ports().get(OTLP_HTTP_PORT); } @Override public String getUrl() { - return "http://%s:%d/v1/traces".formatted(this.host, this.port); + return "http://%s:%d/v1/traces".formatted(this.host, this.httPort); + } + + @Override + public String getGrpcEndpoint() { + return "http://%s:%d/v1/traces".formatted(this.host, this.grpcPort); } } diff --git a/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java index 6d8760f1faa..e4c6b4ec115 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java @@ -43,13 +43,16 @@ class OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests { @Container @ServiceConnection - static final GenericContainer container = TestImage.OPENTELEMETRY.genericContainer().withExposedPorts(4318); + static final GenericContainer container = TestImage.OPENTELEMETRY.genericContainer() + .withExposedPorts(4317, 4318); @Autowired private OtlpTracingConnectionDetails connectionDetails; @Test void connectionCanBeMadeToOpenTelemetryContainer() { + assertThat(this.connectionDetails.getGrpcEndpoint()) + .isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4317) + "/v1/traces"); assertThat(this.connectionDetails.getUrl()) .isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4318) + "/v1/traces"); } diff --git a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactory.java b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactory.java index 6c3e72ac797..61cf174fcb3 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 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. @@ -35,6 +35,10 @@ import org.springframework.boot.testcontainers.service.connection.ServiceConnect class OpenTelemetryTracingContainerConnectionDetailsFactory extends ContainerConnectionDetailsFactory, OtlpTracingConnectionDetails> { + private static final int OTLP_GRPC_PORT = 4317; + + private static final int OTLP_HTTP_PORT = 4318; + OpenTelemetryTracingContainerConnectionDetailsFactory() { super("otel/opentelemetry-collector-contrib", "org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpAutoConfiguration"); @@ -55,7 +59,14 @@ class OpenTelemetryTracingContainerConnectionDetailsFactory @Override public String getUrl() { - return "http://%s:%d/v1/traces".formatted(getContainer().getHost(), getContainer().getMappedPort(4318)); + return "http://%s:%d/v1/traces".formatted(getContainer().getHost(), + getContainer().getMappedPort(OTLP_HTTP_PORT)); + } + + @Override + public String getGrpcEndpoint() { + return "http://%s:%d/v1/traces".formatted(getContainer().getHost(), + getContainer().getMappedPort(OTLP_GRPC_PORT)); } } From bac330354bc7b0d5c2bfd1941884806e44eeb207 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 6 Sep 2024 11:59:05 +0200 Subject: [PATCH 2/2] Polish "Support Otlp Tracing's GRPC port from service connections" See gh-41333 --- .../otlp/OtlpTracingConfigurations.java | 19 +++++++------------ .../otlp/OtlpTracingConnectionDetails.java | 18 ++++++++++++++---- .../otlp/OtlpAutoConfigurationTests.java | 2 +- ...nectionDetailsFactoryIntegrationTests.java | 4 +++- ...nectionDetailsFactoryIntegrationTests.java | 5 +++-- ...DockerComposeConnectionDetailsFactory.java | 15 ++++++++------- ...nectionDetailsFactoryIntegrationTests.java | 6 +++++- ...nectionDetailsFactoryIntegrationTests.java | 7 ++++--- ...cingContainerConnectionDetailsFactory.java | 9 +++++++-- ...cingContainerConnectionDetailsFactory.java | 16 +++++++--------- 10 files changed, 59 insertions(+), 42 deletions(-) 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 index 597206f4906..38d4befd5b4 100644 --- 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 @@ -30,6 +30,7 @@ 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; +import org.springframework.util.Assert; /** * Configurations imported by {@link OtlpAutoConfiguration}. @@ -61,12 +62,10 @@ class OtlpTracingConfigurations { } @Override - public String getUrl() { - return this.properties.getEndpoint(); - } - - @Override - public String getGrpcEndpoint() { + public String getUrl(Transport transport) { + Assert.state(transport == this.properties.getTransport(), + "Requested transport %s doesn't match configured transport %s".formatted(transport, + this.properties.getTransport())); return this.properties.getEndpoint(); } @@ -86,7 +85,7 @@ class OtlpTracingConfigurations { OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties, OtlpTracingConnectionDetails connectionDetails) { OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder() - .setEndpoint(resolveEndpoint(properties.getTransport(), connectionDetails)) + .setEndpoint(connectionDetails.getUrl(Transport.HTTP)) .setTimeout(properties.getTimeout()) .setCompression(properties.getCompression().name().toLowerCase()); for (Entry header : properties.getHeaders().entrySet()) { @@ -100,7 +99,7 @@ class OtlpTracingConfigurations { OtlpGrpcSpanExporter otlpGrpcSpanExporter(OtlpProperties properties, OtlpTracingConnectionDetails connectionDetails) { OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder() - .setEndpoint(resolveEndpoint(properties.getTransport(), connectionDetails)) + .setEndpoint(connectionDetails.getUrl(Transport.GRPC)) .setTimeout(properties.getTimeout()) .setCompression(properties.getCompression().name().toLowerCase()); for (Entry header : properties.getHeaders().entrySet()) { @@ -109,10 +108,6 @@ class OtlpTracingConfigurations { return builder.build(); } - private static String resolveEndpoint(Transport transport, OtlpTracingConnectionDetails connectionDetails) { - return (transport == Transport.HTTP) ? connectionDetails.getUrl() : connectionDetails.getGrpcEndpoint(); - } - } } 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 b1eeb28b196..2b556c60d70 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 @@ -16,12 +16,14 @@ package org.springframework.boot.actuate.autoconfigure.tracing.otlp; +import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport; import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails; /** * Details required to establish a connection to an OpenTelemetry service. * * @author Eddú Meléndez + * @author Moritz Halbritter * @since 3.2.0 */ public interface OtlpTracingConnectionDetails extends ConnectionDetails { @@ -29,11 +31,19 @@ public interface OtlpTracingConnectionDetails extends ConnectionDetails { /** * Address to where tracing will be published. * @return the address to where tracing will be published + * @deprecated since 3.4.0 for removal in 3.6.0 in favor of {@link #getUrl(Transport)} */ - String getUrl(); - - default String getGrpcEndpoint() { - return "http://localhost:4317/v1/traces"; + @Deprecated(since = "3.4.0", forRemoval = true) + default String getUrl() { + return getUrl(Transport.HTTP); } + /** + * Address to where tracing will be published. + * @param transport the transport to use + * @return the address to where tracing will be published + * @since 3.4.0 + */ + String getUrl(Transport transport); + } 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 2f9259c6db7..921c20aa3f7 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 @@ -172,7 +172,7 @@ class OtlpAutoConfigurationTests { @Bean OtlpTracingConnectionDetails otlpTracingConnectionDetails() { - return () -> "http://localhost:12345/v1/traces"; + return (transport) -> "http://localhost:12345/v1/traces"; } } diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/GrafanaOpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/GrafanaOpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java index f5158cef6d6..6852fc717eb 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/GrafanaOpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/GrafanaOpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.docker.compose.service.connection.otlp; +import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails; import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest; import org.springframework.boot.testsupport.container.TestImage; @@ -32,7 +33,8 @@ class GrafanaOpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegratio @DockerComposeTest(composeFile = "otlp-compose.yaml", image = TestImage.GRAFANA_OTEL_LGTM) void runCreatesConnectionDetails(OtlpTracingConnectionDetails connectionDetails) { - assertThat(connectionDetails.getUrl()).startsWith("http://").endsWith("/v1/traces"); + assertThat(connectionDetails.getUrl(Transport.HTTP)).startsWith("http://").endsWith("/v1/traces"); + assertThat(connectionDetails.getUrl(Transport.GRPC)).startsWith("http://").endsWith("/v1/traces"); } } diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java index 6b9304a37d5..9b7f7932533 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.docker.compose.service.connection.otlp; +import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails; import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest; import org.springframework.boot.testsupport.container.TestImage; @@ -32,8 +33,8 @@ class OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests @DockerComposeTest(composeFile = "otlp-compose.yaml", image = TestImage.OPENTELEMETRY) void runCreatesConnectionDetails(OtlpTracingConnectionDetails connectionDetails) { - assertThat(connectionDetails.getGrpcEndpoint()).startsWith("http://").endsWith("/v1/traces"); - assertThat(connectionDetails.getUrl()).startsWith("http://").endsWith("/v1/traces"); + assertThat(connectionDetails.getUrl(Transport.HTTP)).startsWith("http://").endsWith("/v1/traces"); + assertThat(connectionDetails.getUrl(Transport.GRPC)).startsWith("http://").endsWith("/v1/traces"); } } 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 3c0ad3a32b5..7608ebb284c 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 @@ -16,6 +16,7 @@ package org.springframework.boot.docker.compose.service.connection.otlp; +import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails; import org.springframework.boot.docker.compose.core.RunningService; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; @@ -26,6 +27,7 @@ import org.springframework.boot.docker.compose.service.connection.DockerComposeC * {@link OtlpTracingConnectionDetails} for an OTLP service. * * @author Eddú Meléndez + * @author Moritz Halbritter */ class OpenTelemetryTracingDockerComposeConnectionDetailsFactory extends DockerComposeConnectionDetailsFactory { @@ -64,13 +66,12 @@ class OpenTelemetryTracingDockerComposeConnectionDetailsFactory } @Override - public String getUrl() { - return "http://%s:%d/v1/traces".formatted(this.host, this.httPort); - } - - @Override - public String getGrpcEndpoint() { - return "http://%s:%d/v1/traces".formatted(this.host, this.grpcPort); + public String getUrl(Transport transport) { + int port = switch (transport) { + case HTTP -> this.httPort; + case GRPC -> this.grpcPort; + }; + return "http://%s:%d/v1/traces".formatted(this.host, port); } } diff --git a/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java index c5139145665..a68d72ddf4d 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java @@ -22,6 +22,7 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -50,7 +51,10 @@ class GrafanaOpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTes @Test void connectionCanBeMadeToOpenTelemetryContainer() { - assertThat(this.connectionDetails.getUrl()).isEqualTo("%s/v1/traces".formatted(container.getOtlpHttpUrl())); + assertThat(this.connectionDetails.getUrl(Transport.HTTP)) + .isEqualTo("%s/v1/traces".formatted(container.getOtlpHttpUrl())); + assertThat(this.connectionDetails.getUrl(Transport.GRPC)) + .isEqualTo("%s/v1/traces".formatted(container.getOtlpGrpcUrl())); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java index e4c6b4ec115..d2ef73fd20f 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java @@ -22,6 +22,7 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -51,10 +52,10 @@ class OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests { @Test void connectionCanBeMadeToOpenTelemetryContainer() { - assertThat(this.connectionDetails.getGrpcEndpoint()) - .isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4317) + "/v1/traces"); - assertThat(this.connectionDetails.getUrl()) + assertThat(this.connectionDetails.getUrl(Transport.HTTP)) .isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4318) + "/v1/traces"); + assertThat(this.connectionDetails.getUrl(Transport.GRPC)) + .isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4317) + "/v1/traces"); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactory.java b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactory.java index eb03927598a..1a45c35e356 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactory.java @@ -18,6 +18,7 @@ package org.springframework.boot.testcontainers.service.connection.otlp; import org.testcontainers.grafana.LgtmStackContainer; +import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails; import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory; import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource; @@ -52,8 +53,12 @@ class GrafanaOpenTelemetryTracingContainerConnectionDetailsFactory } @Override - public String getUrl() { - return "%s/v1/traces".formatted(getContainer().getOtlpHttpUrl()); + public String getUrl(Transport transport) { + String url = switch (transport) { + case HTTP -> getContainer().getOtlpHttpUrl(); + case GRPC -> getContainer().getOtlpGrpcUrl(); + }; + return "%s/v1/traces".formatted(url); } } diff --git a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactory.java b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactory.java index 61cf174fcb3..c76f577a0db 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactory.java @@ -19,6 +19,7 @@ package org.springframework.boot.testcontainers.service.connection.otlp; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; +import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport; import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails; import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory; import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource; @@ -58,15 +59,12 @@ class OpenTelemetryTracingContainerConnectionDetailsFactory } @Override - public String getUrl() { - return "http://%s:%d/v1/traces".formatted(getContainer().getHost(), - getContainer().getMappedPort(OTLP_HTTP_PORT)); - } - - @Override - public String getGrpcEndpoint() { - return "http://%s:%d/v1/traces".formatted(getContainer().getHost(), - getContainer().getMappedPort(OTLP_GRPC_PORT)); + public String getUrl(Transport transport) { + int port = switch (transport) { + case HTTP -> OTLP_HTTP_PORT; + case GRPC -> OTLP_GRPC_PORT; + }; + return "http://%s:%d/v1/traces".formatted(getContainer().getHost(), getContainer().getMappedPort(port)); } }