Skip to content

Commit 861e520

Browse files
committed
Add transport selection to OtlpLoggingConnectionDetails
Closes gh-42171
1 parent 8835593 commit 861e520

File tree

7 files changed

+45
-15
lines changed

7 files changed

+45
-15
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/logging/opentelemetry/otlp/OtlpLoggingConfigurations.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter;
2222
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder;
2323

24+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2425
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2526
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2627
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -59,7 +60,7 @@ static class PropertiesOtlpLoggingConnectionDetails implements OtlpLoggingConnec
5960
}
6061

6162
@Override
62-
public String getUrl() {
63+
public String getUrl(Transport transport) {
6364
return this.properties.getEndpoint();
6465
}
6566

@@ -77,7 +78,7 @@ static class Exporters {
7778
OtlpHttpLogRecordExporter otlpHttpLogRecordExporter(OtlpLoggingProperties properties,
7879
OtlpLoggingConnectionDetails connectionDetails) {
7980
OtlpHttpLogRecordExporterBuilder builder = OtlpHttpLogRecordExporter.builder()
80-
.setEndpoint(connectionDetails.getUrl())
81+
.setEndpoint(connectionDetails.getUrl(Transport.HTTP))
8182
.setCompression(properties.getCompression().name().toLowerCase(Locale.US))
8283
.setTimeout(properties.getTimeout());
8384
properties.getHeaders().forEach(builder::addHeader);

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/logging/opentelemetry/otlp/OtlpLoggingConnectionDetails.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.actuate.autoconfigure.logging.opentelemetry.otlp;
1818

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

2122
/**
@@ -28,8 +29,9 @@ public interface OtlpLoggingConnectionDetails extends ConnectionDetails {
2829

2930
/**
3031
* Address to where logs will be published.
32+
* @param transport the transport to use
3133
* @return the address to where logs will be published
3234
*/
33-
String getUrl();
35+
String getUrl(Transport transport);
3436

3537
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/logging/opentelemetry/otlp/OtlpLoggingAutoConfigurationTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.junit.jupiter.params.provider.ValueSource;
2626

2727
import org.springframework.boot.actuate.autoconfigure.logging.opentelemetry.otlp.OtlpLoggingConfigurations.ConnectionDetails.PropertiesOtlpLoggingConnectionDetails;
28+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2829
import org.springframework.boot.autoconfigure.AutoConfigurations;
2930
import org.springframework.boot.test.context.FilteredClassLoader;
3031
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -57,7 +58,7 @@ void shouldSupplyBeans() {
5758
.run((context) -> {
5859
assertThat(context).hasSingleBean(OtlpLoggingConnectionDetails.class);
5960
OtlpLoggingConnectionDetails connectionDetails = context.getBean(OtlpLoggingConnectionDetails.class);
60-
assertThat(connectionDetails.getUrl()).isEqualTo("http://localhost:4318/v1/logs");
61+
assertThat(connectionDetails.getUrl(Transport.HTTP)).isEqualTo("http://localhost:4318/v1/logs");
6162
assertThat(context).hasSingleBean(OtlpHttpLogRecordExporter.class)
6263
.hasSingleBean(LogRecordExporter.class);
6364
});
@@ -124,7 +125,7 @@ public static class CustomOtlpLogsConnectionDetails {
124125

125126
@Bean
126127
public OtlpLoggingConnectionDetails customOtlpLogsConnectionDetails() {
127-
return () -> "https://otel.example.com/v1/logs";
128+
return (transport) -> "https://otel.example.com/v1/logs";
128129
}
129130

130131
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.docker.compose.service.connection.otlp;
1818

1919
import org.springframework.boot.actuate.autoconfigure.logging.opentelemetry.otlp.OtlpLoggingConnectionDetails;
20+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2021
import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest;
2122
import org.springframework.boot.testsupport.container.TestImage;
2223

@@ -32,7 +33,8 @@ class OpenTelemetryLoggingDockerComposeConnectionDetailsFactoryIntegrationTests
3233

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

3840
}

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.docker.compose.service.connection.otlp;
1818

1919
import org.springframework.boot.actuate.autoconfigure.logging.opentelemetry.otlp.OtlpLoggingConnectionDetails;
20+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2021
import org.springframework.boot.docker.compose.core.RunningService;
2122
import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory;
2223
import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource;
@@ -30,7 +31,9 @@
3031
class OpenTelemetryLoggingDockerComposeConnectionDetailsFactory
3132
extends DockerComposeConnectionDetailsFactory<OtlpLoggingConnectionDetails> {
3233

33-
private static final int OTLP_PORT = 4318;
34+
private static final int OTLP_GRPC_PORT = 4317;
35+
36+
private static final int OTLP_HTTP_PORT = 4318;
3437

3538
OpenTelemetryLoggingDockerComposeConnectionDetailsFactory() {
3639
super("otel/opentelemetry-collector-contrib",
@@ -47,17 +50,24 @@ private static final class OpenTelemetryLoggingDockerComposeConnectionDetails ex
4750

4851
private final String host;
4952

50-
private final int port;
53+
private final int grpcPort;
54+
55+
private final int httPort;
5156

5257
private OpenTelemetryLoggingDockerComposeConnectionDetails(RunningService source) {
5358
super(source);
5459
this.host = source.host();
55-
this.port = source.ports().get(OTLP_PORT);
60+
this.grpcPort = source.ports().get(OTLP_GRPC_PORT);
61+
this.httPort = source.ports().get(OTLP_HTTP_PORT);
5662
}
5763

5864
@Override
59-
public String getUrl() {
60-
return "http://%s:%d/v1/logs".formatted(this.host, this.port);
65+
public String getUrl(Transport transport) {
66+
int port = switch (transport) {
67+
case HTTP -> this.httPort;
68+
case GRPC -> this.grpcPort;
69+
};
70+
return "http://%s:%d/v1/logs".formatted(this.host, port);
6171
}
6272

6373
}

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

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

2424
import org.springframework.beans.factory.annotation.Autowired;
2525
import org.springframework.boot.actuate.autoconfigure.logging.opentelemetry.otlp.OtlpLoggingConnectionDetails;
26+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2627
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpAutoConfiguration;
2728
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
2829
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
@@ -43,15 +44,18 @@ class OpenTelemetryLoggingContainerConnectionDetailsFactoryIntegrationTests {
4344

4445
@Container
4546
@ServiceConnection
46-
static final GenericContainer<?> container = TestImage.OPENTELEMETRY.genericContainer().withExposedPorts(4318);
47+
static final GenericContainer<?> container = TestImage.OPENTELEMETRY.genericContainer()
48+
.withExposedPorts(4317, 4318);
4749

4850
@Autowired
4951
private OtlpLoggingConnectionDetails connectionDetails;
5052

5153
@Test
5254
void connectionCanBeMadeToOpenTelemetryContainer() {
53-
assertThat(this.connectionDetails.getUrl())
55+
assertThat(this.connectionDetails.getUrl(Transport.HTTP))
5456
.isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4318) + "/v1/logs");
57+
assertThat(this.connectionDetails.getUrl(Transport.GRPC))
58+
.isEqualTo("http://" + container.getHost() + ":" + container.getMappedPort(4317) + "/v1/logs");
5559
}
5660

5761
@Configuration(proxyBeanMethods = false)

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.testcontainers.containers.GenericContainer;
2121

2222
import org.springframework.boot.actuate.autoconfigure.logging.opentelemetry.otlp.OtlpLoggingConnectionDetails;
23+
import org.springframework.boot.actuate.autoconfigure.opentelemetry.otlp.Transport;
2324
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory;
2425
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource;
2526
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
@@ -31,10 +32,15 @@
3132
* the {@code "otel/opentelemetry-collector-contrib"} image.
3233
*
3334
* @author Eddú Meléndez
35+
* @author Moritz Halbritter
3436
*/
3537
class OpenTelemetryLoggingContainerConnectionDetailsFactory
3638
extends ContainerConnectionDetailsFactory<Container<?>, OtlpLoggingConnectionDetails> {
3739

40+
private static final int OTLP_GRPC_PORT = 4317;
41+
42+
private static final int OTLP_HTTP_PORT = 4318;
43+
3844
OpenTelemetryLoggingContainerConnectionDetailsFactory() {
3945
super("otel/opentelemetry-collector-contrib",
4046
"org.springframework.boot.actuate.autoconfigure.logging.opentelemetry.otlp.OtlpLoggingAutoConfiguration");
@@ -54,8 +60,12 @@ private OpenTelemetryLoggingContainerConnectionDetails(ContainerConnectionSource
5460
}
5561

5662
@Override
57-
public String getUrl() {
58-
return "http://%s:%d/v1/logs".formatted(getContainer().getHost(), getContainer().getMappedPort(4318));
63+
public String getUrl(Transport transport) {
64+
int port = switch (transport) {
65+
case HTTP -> OTLP_HTTP_PORT;
66+
case GRPC -> OTLP_GRPC_PORT;
67+
};
68+
return "http://%s:%d/v1/logs".formatted(getContainer().getHost(), getContainer().getMappedPort(port));
5969
}
6070

6171
}

0 commit comments

Comments
 (0)