Skip to content

Commit 7baa553

Browse files
eddumelendezmhalbritter
authored andcommitted
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
1 parent f6505f7 commit 7baa553

File tree

7 files changed

+51
-10
lines changed

7 files changed

+51
-10
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
2424
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
2525

26+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2627
import org.springframework.boot.actuate.autoconfigure.tracing.ConditionalOnEnabledTracing;
2728
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2829
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -34,6 +35,7 @@
3435
* Configurations imported by {@link OtlpAutoConfiguration}.
3536
*
3637
* @author Moritz Halbritter
38+
* @author Eddú Meléndez
3739
*/
3840
class OtlpTracingConfigurations {
3941

@@ -63,6 +65,11 @@ public String getUrl() {
6365
return this.properties.getEndpoint();
6466
}
6567

68+
@Override
69+
public String getGrpcEndpoint() {
70+
return this.properties.getEndpoint();
71+
}
72+
6673
}
6774

6875
}
@@ -79,7 +86,7 @@ static class Exporters {
7986
OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties,
8087
OtlpTracingConnectionDetails connectionDetails) {
8188
OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder()
82-
.setEndpoint(connectionDetails.getUrl())
89+
.setEndpoint(resolveEndpoint(properties.getTransport(), connectionDetails))
8390
.setTimeout(properties.getTimeout())
8491
.setCompression(properties.getCompression().name().toLowerCase());
8592
for (Entry<String, String> header : properties.getHeaders().entrySet()) {
@@ -93,7 +100,7 @@ OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties,
93100
OtlpGrpcSpanExporter otlpGrpcSpanExporter(OtlpProperties properties,
94101
OtlpTracingConnectionDetails connectionDetails) {
95102
OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder()
96-
.setEndpoint(connectionDetails.getUrl())
103+
.setEndpoint(resolveEndpoint(properties.getTransport(), connectionDetails))
97104
.setTimeout(properties.getTimeout())
98105
.setCompression(properties.getCompression().name().toLowerCase());
99106
for (Entry<String, String> header : properties.getHeaders().entrySet()) {
@@ -102,6 +109,10 @@ OtlpGrpcSpanExporter otlpGrpcSpanExporter(OtlpProperties properties,
102109
return builder.build();
103110
}
104111

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

107118
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -32,4 +32,8 @@ public interface OtlpTracingConnectionDetails extends ConnectionDetails {
3232
*/
3333
String getUrl();
3434

35+
default String getGrpcEndpoint() {
36+
return "http://localhost:4317/v1/traces";
37+
}
38+
3539
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class OpenTelemetryTracingDockerComposeConnectionDetailsFactoryIntegrationTests
3232

3333
@DockerComposeTest(composeFile = "otlp-compose.yaml", image = TestImage.OPENTELEMETRY)
3434
void runCreatesConnectionDetails(OtlpTracingConnectionDetails connectionDetails) {
35+
assertThat(connectionDetails.getGrpcEndpoint()).startsWith("http://").endsWith("/v1/traces");
3536
assertThat(connectionDetails.getUrl()).startsWith("http://").endsWith("/v1/traces");
3637
}
3738

spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/otlp/otlp-compose.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ services:
22
otlp:
33
image: '{imageName}'
44
ports:
5+
- '4317'
56
- '4318'

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ class OpenTelemetryTracingDockerComposeConnectionDetailsFactory
3333
private static final String[] OPENTELEMETRY_IMAGE_NAMES = { "otel/opentelemetry-collector-contrib",
3434
"grafana/otel-lgtm" };
3535

36-
private static final int OTLP_PORT = 4318;
36+
private static final int OTLP_GRPC_PORT = 4317;
37+
38+
private static final int OTLP_HTTP_PORT = 4318;
3739

3840
OpenTelemetryTracingDockerComposeConnectionDetailsFactory() {
3941
super(OPENTELEMETRY_IMAGE_NAMES,
@@ -50,17 +52,25 @@ private static final class OpenTelemetryTracingDockerComposeConnectionDetails ex
5052

5153
private final String host;
5254

53-
private final int port;
55+
private final int grpcPort;
56+
57+
private final int httPort;
5458

5559
private OpenTelemetryTracingDockerComposeConnectionDetails(RunningService source) {
5660
super(source);
5761
this.host = source.host();
58-
this.port = source.ports().get(OTLP_PORT);
62+
this.grpcPort = source.ports().get(OTLP_GRPC_PORT);
63+
this.httPort = source.ports().get(OTLP_HTTP_PORT);
5964
}
6065

6166
@Override
6267
public String getUrl() {
63-
return "http://%s:%d/v1/traces".formatted(this.host, this.port);
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);
6474
}
6575

6676
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,16 @@ class OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests {
4343

4444
@Container
4545
@ServiceConnection
46-
static final GenericContainer<?> container = TestImage.OPENTELEMETRY.genericContainer().withExposedPorts(4318);
46+
static final GenericContainer<?> container = TestImage.OPENTELEMETRY.genericContainer()
47+
.withExposedPorts(4317, 4318);
4748

4849
@Autowired
4950
private OtlpTracingConnectionDetails connectionDetails;
5051

5152
@Test
5253
void connectionCanBeMadeToOpenTelemetryContainer() {
54+
assertThat(this.connectionDetails.getGrpcEndpoint())
55+
.isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4317) + "/v1/traces");
5356
assertThat(this.connectionDetails.getUrl())
5457
.isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4318) + "/v1/traces");
5558
}

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -35,6 +35,10 @@
3535
class OpenTelemetryTracingContainerConnectionDetailsFactory
3636
extends ContainerConnectionDetailsFactory<Container<?>, OtlpTracingConnectionDetails> {
3737

38+
private static final int OTLP_GRPC_PORT = 4317;
39+
40+
private static final int OTLP_HTTP_PORT = 4318;
41+
3842
OpenTelemetryTracingContainerConnectionDetailsFactory() {
3943
super("otel/opentelemetry-collector-contrib",
4044
"org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpAutoConfiguration");
@@ -55,7 +59,14 @@ private OpenTelemetryTracingContainerConnectionDetails(ContainerConnectionSource
5559

5660
@Override
5761
public String getUrl() {
58-
return "http://%s:%d/v1/traces".formatted(getContainer().getHost(), getContainer().getMappedPort(4318));
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));
5970
}
6071

6172
}

0 commit comments

Comments
 (0)