Skip to content

Commit bac3303

Browse files
committed
Polish "Support Otlp Tracing's GRPC port from service connections"
See gh-41333
1 parent 7baa553 commit bac3303

File tree

10 files changed

+59
-42
lines changed

10 files changed

+59
-42
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConfigurations.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3131
import org.springframework.context.annotation.Bean;
3232
import org.springframework.context.annotation.Configuration;
33+
import org.springframework.util.Assert;
3334

3435
/**
3536
* Configurations imported by {@link OtlpAutoConfiguration}.
@@ -61,12 +62,10 @@ static class PropertiesOtlpTracingConnectionDetails implements OtlpTracingConnec
6162
}
6263

6364
@Override
64-
public String getUrl() {
65-
return this.properties.getEndpoint();
66-
}
67-
68-
@Override
69-
public String getGrpcEndpoint() {
65+
public String getUrl(Transport transport) {
66+
Assert.state(transport == this.properties.getTransport(),
67+
"Requested transport %s doesn't match configured transport %s".formatted(transport,
68+
this.properties.getTransport()));
7069
return this.properties.getEndpoint();
7170
}
7271

@@ -86,7 +85,7 @@ static class Exporters {
8685
OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties,
8786
OtlpTracingConnectionDetails connectionDetails) {
8887
OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder()
89-
.setEndpoint(resolveEndpoint(properties.getTransport(), connectionDetails))
88+
.setEndpoint(connectionDetails.getUrl(Transport.HTTP))
9089
.setTimeout(properties.getTimeout())
9190
.setCompression(properties.getCompression().name().toLowerCase());
9291
for (Entry<String, String> header : properties.getHeaders().entrySet()) {
@@ -100,7 +99,7 @@ OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties,
10099
OtlpGrpcSpanExporter otlpGrpcSpanExporter(OtlpProperties properties,
101100
OtlpTracingConnectionDetails connectionDetails) {
102101
OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder()
103-
.setEndpoint(resolveEndpoint(properties.getTransport(), connectionDetails))
102+
.setEndpoint(connectionDetails.getUrl(Transport.GRPC))
104103
.setTimeout(properties.getTimeout())
105104
.setCompression(properties.getCompression().name().toLowerCase());
106105
for (Entry<String, String> header : properties.getHeaders().entrySet()) {
@@ -109,10 +108,6 @@ OtlpGrpcSpanExporter otlpGrpcSpanExporter(OtlpProperties properties,
109108
return builder.build();
110109
}
111110

112-
private static String resolveEndpoint(Transport transport, OtlpTracingConnectionDetails connectionDetails) {
113-
return (transport == Transport.HTTP) ? connectionDetails.getUrl() : connectionDetails.getGrpcEndpoint();
114-
}
115-
116111
}
117112

118113
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConnectionDetails.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,34 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.tracing.otlp;
1818

19+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
1920
import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails;
2021

2122
/**
2223
* Details required to establish a connection to an OpenTelemetry service.
2324
*
2425
* @author Eddú Meléndez
26+
* @author Moritz Halbritter
2527
* @since 3.2.0
2628
*/
2729
public interface OtlpTracingConnectionDetails extends ConnectionDetails {
2830

2931
/**
3032
* Address to where tracing will be published.
3133
* @return the address to where tracing will be published
34+
* @deprecated since 3.4.0 for removal in 3.6.0 in favor of {@link #getUrl(Transport)}
3235
*/
33-
String getUrl();
34-
35-
default String getGrpcEndpoint() {
36-
return "http://localhost:4317/v1/traces";
36+
@Deprecated(since = "3.4.0", forRemoval = true)
37+
default String getUrl() {
38+
return getUrl(Transport.HTTP);
3739
}
3840

41+
/**
42+
* Address to where tracing will be published.
43+
* @param transport the transport to use
44+
* @return the address to where tracing will be published
45+
* @since 3.4.0
46+
*/
47+
String getUrl(Transport transport);
48+
3949
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpAutoConfigurationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ static class ConnectionDetailsConfiguration {
172172

173173
@Bean
174174
OtlpTracingConnectionDetails otlpTracingConnectionDetails() {
175-
return () -> "http://localhost:12345/v1/traces";
175+
return (transport) -> "http://localhost:12345/v1/traces";
176176
}
177177

178178
}

spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/GrafanaOpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.docker.compose.service.connection.otlp;
1818

19+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
1920
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails;
2021
import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest;
2122
import org.springframework.boot.testsupport.container.TestImage;
@@ -32,7 +33,8 @@ class GrafanaOpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegratio
3233

3334
@DockerComposeTest(composeFile = "otlp-compose.yaml", image = TestImage.GRAFANA_OTEL_LGTM)
3435
void runCreatesConnectionDetails(OtlpTracingConnectionDetails connectionDetails) {
35-
assertThat(connectionDetails.getUrl()).startsWith("http://").endsWith("/v1/traces");
36+
assertThat(connectionDetails.getUrl(Transport.HTTP)).startsWith("http://").endsWith("/v1/traces");
37+
assertThat(connectionDetails.getUrl(Transport.GRPC)).startsWith("http://").endsWith("/v1/traces");
3638
}
3739

3840
}

spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.docker.compose.service.connection.otlp;
1818

19+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
1920
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails;
2021
import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest;
2122
import org.springframework.boot.testsupport.container.TestImage;
@@ -32,8 +33,8 @@ class OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests
3233

3334
@DockerComposeTest(composeFile = "otlp-compose.yaml", image = TestImage.OPENTELEMETRY)
3435
void runCreatesConnectionDetails(OtlpTracingConnectionDetails connectionDetails) {
35-
assertThat(connectionDetails.getGrpcEndpoint()).startsWith("http://").endsWith("/v1/traces");
36-
assertThat(connectionDetails.getUrl()).startsWith("http://").endsWith("/v1/traces");
36+
assertThat(connectionDetails.getUrl(Transport.HTTP)).startsWith("http://").endsWith("/v1/traces");
37+
assertThat(connectionDetails.getUrl(Transport.GRPC)).startsWith("http://").endsWith("/v1/traces");
3738
}
3839

3940
}

spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/otlp/OpenTelemetryTracingDockerComposeConnectionDetailsFactory.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.docker.compose.service.connection.otlp;
1818

19+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
1920
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails;
2021
import org.springframework.boot.docker.compose.core.RunningService;
2122
import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory;
@@ -26,6 +27,7 @@
2627
* {@link OtlpTracingConnectionDetails} for an OTLP service.
2728
*
2829
* @author Eddú Meléndez
30+
* @author Moritz Halbritter
2931
*/
3032
class OpenTelemetryTracingDockerComposeConnectionDetailsFactory
3133
extends DockerComposeConnectionDetailsFactory<OtlpTracingConnectionDetails> {
@@ -64,13 +66,12 @@ private OpenTelemetryTracingDockerComposeConnectionDetails(RunningService source
6466
}
6567

6668
@Override
67-
public String getUrl() {
68-
return "http://%s:%d/v1/traces".formatted(this.host, this.httPort);
69-
}
70-
71-
@Override
72-
public String getGrpcEndpoint() {
73-
return "http://%s:%d/v1/traces".formatted(this.host, this.grpcPort);
69+
public String getUrl(Transport transport) {
70+
int port = switch (transport) {
71+
case HTTP -> this.httPort;
72+
case GRPC -> this.grpcPort;
73+
};
74+
return "http://%s:%d/v1/traces".formatted(this.host, port);
7475
}
7576

7677
}

spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.testcontainers.junit.jupiter.Testcontainers;
2323

2424
import org.springframework.beans.factory.annotation.Autowired;
25+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2526
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpAutoConfiguration;
2627
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails;
2728
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
@@ -50,7 +51,10 @@ class GrafanaOpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTes
5051

5152
@Test
5253
void connectionCanBeMadeToOpenTelemetryContainer() {
53-
assertThat(this.connectionDetails.getUrl()).isEqualTo("%s/v1/traces".formatted(container.getOtlpHttpUrl()));
54+
assertThat(this.connectionDetails.getUrl(Transport.HTTP))
55+
.isEqualTo("%s/v1/traces".formatted(container.getOtlpHttpUrl()));
56+
assertThat(this.connectionDetails.getUrl(Transport.GRPC))
57+
.isEqualTo("%s/v1/traces".formatted(container.getOtlpGrpcUrl()));
5458
}
5559

5660
@Configuration(proxyBeanMethods = false)

spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.testcontainers.junit.jupiter.Testcontainers;
2323

2424
import org.springframework.beans.factory.annotation.Autowired;
25+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2526
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpAutoConfiguration;
2627
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails;
2728
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
@@ -51,10 +52,10 @@ class OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests {
5152

5253
@Test
5354
void connectionCanBeMadeToOpenTelemetryContainer() {
54-
assertThat(this.connectionDetails.getGrpcEndpoint())
55-
.isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4317) + "/v1/traces");
56-
assertThat(this.connectionDetails.getUrl())
55+
assertThat(this.connectionDetails.getUrl(Transport.HTTP))
5756
.isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4318) + "/v1/traces");
57+
assertThat(this.connectionDetails.getUrl(Transport.GRPC))
58+
.isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4317) + "/v1/traces");
5859
}
5960

6061
@Configuration(proxyBeanMethods = false)

spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/GrafanaOpenTelemetryTracingContainerConnectionDetailsFactory.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.testcontainers.grafana.LgtmStackContainer;
2020

21+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2122
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails;
2223
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory;
2324
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource;
@@ -52,8 +53,12 @@ private OpenTelemetryTracingContainerConnectionDetails(ContainerConnectionSource
5253
}
5354

5455
@Override
55-
public String getUrl() {
56-
return "%s/v1/traces".formatted(getContainer().getOtlpHttpUrl());
56+
public String getUrl(Transport transport) {
57+
String url = switch (transport) {
58+
case HTTP -> getContainer().getOtlpHttpUrl();
59+
case GRPC -> getContainer().getOtlpGrpcUrl();
60+
};
61+
return "%s/v1/traces".formatted(url);
5762
}
5863

5964
}

spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/otlp/OpenTelemetryTracingContainerConnectionDetailsFactory.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.testcontainers.containers.Container;
2020
import org.testcontainers.containers.GenericContainer;
2121

22+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2223
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails;
2324
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory;
2425
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource;
@@ -58,15 +59,12 @@ private OpenTelemetryTracingContainerConnectionDetails(ContainerConnectionSource
5859
}
5960

6061
@Override
61-
public String getUrl() {
62-
return "http://%s:%d/v1/traces".formatted(getContainer().getHost(),
63-
getContainer().getMappedPort(OTLP_HTTP_PORT));
64-
}
65-
66-
@Override
67-
public String getGrpcEndpoint() {
68-
return "http://%s:%d/v1/traces".formatted(getContainer().getHost(),
69-
getContainer().getMappedPort(OTLP_GRPC_PORT));
62+
public String getUrl(Transport transport) {
63+
int port = switch (transport) {
64+
case HTTP -> OTLP_HTTP_PORT;
65+
case GRPC -> OTLP_GRPC_PORT;
66+
};
67+
return "http://%s:%d/v1/traces".formatted(getContainer().getHost(), getContainer().getMappedPort(port));
7068
}
7169

7270
}

0 commit comments

Comments
 (0)