Skip to content

Commit c387c87

Browse files
committed
Polish "Add service connection from OpenTelemetry Collector"
See gh-35082
1 parent 6997277 commit c387c87

File tree

21 files changed

+229
-118
lines changed

21 files changed

+229
-118
lines changed
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,14 @@
2222
* Details required to establish a connection to a OpenTelemetry Collector service.
2323
*
2424
* @author Eddú Meléndez
25-
* @since 3.1.0
25+
* @since 3.2.0
2626
*/
27-
public interface OtlpConnectionDetails extends ConnectionDetails {
27+
public interface OtlpMetricsConnectionDetails extends ConnectionDetails {
2828

29+
/**
30+
* Address to where metrics will be published.
31+
* @return the address to where metrics will be published
32+
*/
2933
String getUrl();
3034

3135
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfiguration.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,17 +50,24 @@
5050
@EnableConfigurationProperties({ OtlpProperties.class, OpenTelemetryProperties.class })
5151
public class OtlpMetricsExportAutoConfiguration {
5252

53+
private final OtlpProperties properties;
54+
55+
OtlpMetricsExportAutoConfiguration(OtlpProperties properties) {
56+
this.properties = properties;
57+
}
58+
5359
@Bean
54-
@ConditionalOnMissingBean(OtlpConnectionDetails.class)
55-
public OtlpConnectionDetails otlpConnectionDetails(OtlpProperties properties) {
56-
return new PropertiesOtlpConnectionDetails(properties);
60+
@ConditionalOnMissingBean(OtlpMetricsConnectionDetails.class)
61+
OtlpMetricsConnectionDetails otlpMetricsConnectionDetails() {
62+
return new PropertiesOtlpMetricsConnectionDetails(this.properties);
5763
}
5864

5965
@Bean
6066
@ConditionalOnMissingBean
61-
OtlpConfig otlpConfig(OtlpProperties properties, OpenTelemetryProperties openTelemetryProperties,
62-
OtlpConnectionDetails connectionDetails, Environment environment) {
63-
return new OtlpPropertiesConfigAdapter(properties, openTelemetryProperties, connectionDetails, environment);
67+
OtlpConfig otlpConfig(OpenTelemetryProperties openTelemetryProperties,
68+
OtlpMetricsConnectionDetails connectionDetails, Environment environment) {
69+
return new OtlpPropertiesConfigAdapter(this.properties, openTelemetryProperties, connectionDetails,
70+
environment);
6471
}
6572

6673
@Bean
@@ -70,13 +77,13 @@ public OtlpMeterRegistry otlpMeterRegistry(OtlpConfig otlpConfig, Clock clock) {
7077
}
7178

7279
/**
73-
* Adapts {@link OtlpProperties} to {@link OtlpConnectionDetails}.
80+
* Adapts {@link OtlpProperties} to {@link OtlpMetricsConnectionDetails}.
7481
*/
75-
static class PropertiesOtlpConnectionDetails implements OtlpConnectionDetails {
82+
static class PropertiesOtlpMetricsConnectionDetails implements OtlpMetricsConnectionDetails {
7683

7784
private final OtlpProperties properties;
7885

79-
PropertiesOtlpConnectionDetails(OtlpProperties properties) {
86+
PropertiesOtlpMetricsConnectionDetails(OtlpProperties properties) {
8087
this.properties = properties;
8188
}
8289

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ class OtlpPropertiesConfigAdapter extends StepRegistryPropertiesConfigAdapter<Ot
4545

4646
private final OpenTelemetryProperties openTelemetryProperties;
4747

48-
private final OtlpConnectionDetails connectionDetails;
48+
private final OtlpMetricsConnectionDetails connectionDetails;
4949

5050
private final Environment environment;
5151

5252
OtlpPropertiesConfigAdapter(OtlpProperties properties, OpenTelemetryProperties openTelemetryProperties,
53-
OtlpConnectionDetails connectionDetails, Environment environment) {
53+
OtlpMetricsConnectionDetails connectionDetails, Environment environment) {
5454
super(properties);
5555
this.connectionDetails = connectionDetails;
5656
this.openTelemetryProperties = openTelemetryProperties;

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

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,17 @@
1616

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

19-
import java.util.Map.Entry;
20-
2119
import io.micrometer.tracing.otel.bridge.OtelTracer;
2220
import io.opentelemetry.api.OpenTelemetry;
2321
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
24-
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder;
2522
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
2623
import io.opentelemetry.sdk.trace.SdkTracerProvider;
2724

28-
import org.springframework.boot.actuate.autoconfigure.tracing.ConditionalOnEnabledTracing;
2925
import org.springframework.boot.autoconfigure.AutoConfiguration;
3026
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
31-
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3227
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
33-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
34-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3528
import org.springframework.boot.context.properties.EnableConfigurationProperties;
36-
import org.springframework.context.annotation.Bean;
29+
import org.springframework.context.annotation.Import;
3730

3831
/**
3932
* {@link EnableAutoConfiguration Auto-configuration} for OTLP. Brave does not support
@@ -54,48 +47,7 @@
5447
@AutoConfiguration
5548
@ConditionalOnClass({ OtelTracer.class, SdkTracerProvider.class, OpenTelemetry.class, OtlpHttpSpanExporter.class })
5649
@EnableConfigurationProperties(OtlpProperties.class)
50+
@Import({ OtlpTracingConfigurations.ConnectionDetails.class, OtlpTracingConfigurations.Exporters.class })
5751
public class OtlpAutoConfiguration {
5852

59-
@Bean
60-
@ConditionalOnMissingBean(OtlpTracingConnectionDetails.class)
61-
@ConditionalOnProperty(prefix = "management.otlp.tracing", name = "endpoint")
62-
OtlpTracingConnectionDetails otlpTracingConnectionDetails(OtlpProperties properties) {
63-
return new PropertiesOtlpTracingConnectionDetails(properties);
64-
}
65-
66-
@Bean
67-
@ConditionalOnMissingBean(value = OtlpHttpSpanExporter.class,
68-
type = "io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter")
69-
@ConditionalOnBean(OtlpTracingConnectionDetails.class)
70-
@ConditionalOnEnabledTracing
71-
OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties,
72-
OtlpTracingConnectionDetails connectionDetails) {
73-
OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder()
74-
.setEndpoint(connectionDetails.getEndpoint())
75-
.setTimeout(properties.getTimeout())
76-
.setCompression(properties.getCompression().name().toLowerCase());
77-
for (Entry<String, String> header : properties.getHeaders().entrySet()) {
78-
builder.addHeader(header.getKey(), header.getValue());
79-
}
80-
return builder.build();
81-
}
82-
83-
/**
84-
* Adapts {@link OtlpProperties} to {@link OtlpTracingConnectionDetails}.
85-
*/
86-
static class PropertiesOtlpTracingConnectionDetails implements OtlpTracingConnectionDetails {
87-
88-
private final OtlpProperties properties;
89-
90-
PropertiesOtlpTracingConnectionDetails(OtlpProperties properties) {
91-
this.properties = properties;
92-
}
93-
94-
@Override
95-
public String getEndpoint() {
96-
return this.properties.getEndpoint();
97-
}
98-
99-
}
100-
10153
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*
2+
* Copyright 2012-2023 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.actuate.autoconfigure.tracing.otlp;
18+
19+
import java.util.Map.Entry;
20+
21+
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
22+
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder;
23+
24+
import org.springframework.boot.actuate.autoconfigure.tracing.ConditionalOnEnabledTracing;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
26+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
27+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
28+
import org.springframework.context.annotation.Bean;
29+
import org.springframework.context.annotation.Configuration;
30+
31+
/**
32+
* Configurations imported by {@link OtlpAutoConfiguration}.
33+
*
34+
* @author Moritz Halbritter
35+
*/
36+
final class OtlpTracingConfigurations {
37+
38+
private OtlpTracingConfigurations() {
39+
}
40+
41+
@Configuration(proxyBeanMethods = false)
42+
static class ConnectionDetails {
43+
44+
@Bean
45+
@ConditionalOnMissingBean(OtlpTracingConnectionDetails.class)
46+
@ConditionalOnProperty(prefix = "management.otlp.tracing", name = "endpoint")
47+
OtlpTracingConnectionDetails otlpTracingConnectionDetails(OtlpProperties properties) {
48+
return new PropertiesOtlpTracingConnectionDetails(properties);
49+
}
50+
51+
/**
52+
* Adapts {@link OtlpProperties} to {@link OtlpTracingConnectionDetails}.
53+
*/
54+
static class PropertiesOtlpTracingConnectionDetails implements OtlpTracingConnectionDetails {
55+
56+
private final OtlpProperties properties;
57+
58+
PropertiesOtlpTracingConnectionDetails(OtlpProperties properties) {
59+
this.properties = properties;
60+
}
61+
62+
@Override
63+
public String getEndpoint() {
64+
return this.properties.getEndpoint();
65+
}
66+
67+
}
68+
69+
}
70+
71+
@Configuration(proxyBeanMethods = false)
72+
static class Exporters {
73+
74+
@Bean
75+
@ConditionalOnMissingBean(value = OtlpHttpSpanExporter.class,
76+
type = "io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter")
77+
@ConditionalOnBean(OtlpTracingConnectionDetails.class)
78+
@ConditionalOnEnabledTracing
79+
OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties,
80+
OtlpTracingConnectionDetails connectionDetails) {
81+
OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder()
82+
.setEndpoint(connectionDetails.getEndpoint())
83+
.setTimeout(properties.getTimeout())
84+
.setCompression(properties.getCompression().name().toLowerCase());
85+
for (Entry<String, String> header : properties.getHeaders().entrySet()) {
86+
builder.addHeader(header.getKey(), header.getValue());
87+
}
88+
return builder.build();
89+
}
90+
91+
}
92+
93+
}

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
@@ -22,10 +22,14 @@
2222
* Details required to establish a connection to a OpenTelemetry service.
2323
*
2424
* @author Eddú Meléndez
25-
* @since 3.1.0
25+
* @since 3.2.0
2626
*/
2727
public interface OtlpTracingConnectionDetails extends ConnectionDetails {
2828

29+
/**
30+
* Address to where metrics will be published.
31+
* @return the address to where metrics will be published
32+
*/
2933
String getEndpoint();
3034

3135
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfigurationTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.micrometer.registry.otlp.OtlpMeterRegistry;
2222
import org.junit.jupiter.api.Test;
2323

24+
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails;
2425
import org.springframework.boot.autoconfigure.AutoConfigurations;
2526
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2627
import org.springframework.context.annotation.Bean;
@@ -86,16 +87,15 @@ void allowsRegistryToBeCustomized() {
8687
@Test
8788
void definesPropertiesBasedConnectionDetailsByDefault() {
8889
this.contextRunner.withUserConfiguration(BaseConfiguration.class)
89-
.run((context) -> assertThat(context)
90-
.hasSingleBean(OtlpMetricsExportAutoConfiguration.PropertiesOtlpConnectionDetails.class));
90+
.run((context) -> assertThat(context).hasSingleBean(PropertiesOtlpMetricsConnectionDetails.class));
9191
}
9292

9393
@Test
9494
void testConnectionFactoryWithOverridesWhenUsingCustomConnectionDetails() {
9595
this.contextRunner.withUserConfiguration(BaseConfiguration.class, ConnectionDetailsConfiguration.class)
9696
.run((context) -> {
97-
assertThat(context).hasSingleBean(OtlpConnectionDetails.class)
98-
.doesNotHaveBean(OtlpMetricsExportAutoConfiguration.PropertiesOtlpConnectionDetails.class);
97+
assertThat(context).hasSingleBean(OtlpMetricsConnectionDetails.class)
98+
.doesNotHaveBean(PropertiesOtlpMetricsConnectionDetails.class);
9999
OtlpConfig config = context.getBean(OtlpConfig.class);
100100
assertThat(config.url()).isEqualTo("http://localhost:12345/v1/metrics");
101101
});
@@ -137,7 +137,7 @@ OtlpMeterRegistry customRegistry(OtlpConfig config, Clock clock) {
137137
static class ConnectionDetailsConfiguration {
138138

139139
@Bean
140-
OtlpConnectionDetails otlpConnectionDetails() {
140+
OtlpMetricsConnectionDetails otlpConnectionDetails() {
141141
return () -> "http://localhost:12345/v1/metrics";
142142
}
143143

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesConfigAdapterTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import org.junit.jupiter.api.BeforeEach;
2525
import org.junit.jupiter.api.Test;
2626

27-
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpConnectionDetails;
27+
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails;
2828
import org.springframework.boot.actuate.autoconfigure.opentelemetry.OpenTelemetryProperties;
2929
import org.springframework.mock.env.MockEnvironment;
3030

@@ -45,14 +45,14 @@ class OtlpPropertiesConfigAdapterTests {
4545

4646
private MockEnvironment environment;
4747

48-
private OtlpConnectionDetails connectionDetails;
48+
private OtlpMetricsConnectionDetails connectionDetails;
4949

5050
@BeforeEach
5151
void setUp() {
5252
this.properties = new OtlpProperties();
5353
this.openTelemetryProperties = new OpenTelemetryProperties();
5454
this.environment = new MockEnvironment();
55-
this.connectionDetails = new PropertiesOtlpConnectionDetails(this.properties);
55+
this.connectionDetails = new PropertiesOtlpMetricsConnectionDetails(this.properties);
5656
}
5757

5858
@Test

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import okhttp3.HttpUrl;
2323
import org.junit.jupiter.api.Test;
2424

25+
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConfigurations.ConnectionDetails.PropertiesOtlpTracingConnectionDetails;
2526
import org.springframework.boot.autoconfigure.AutoConfigurations;
2627
import org.springframework.boot.test.context.FilteredClassLoader;
2728
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -111,15 +112,14 @@ void shouldNotSupplyOtlpHttpSpanExporterIfTracingIsDisabled() {
111112
@Test
112113
void definesPropertiesBasedConnectionDetailsByDefault() {
113114
this.contextRunner.withPropertyValues("management.otlp.tracing.endpoint=http://localhost:4318/v1/traces")
114-
.run((context) -> assertThat(context)
115-
.hasSingleBean(OtlpAutoConfiguration.PropertiesOtlpTracingConnectionDetails.class));
115+
.run((context) -> assertThat(context).hasSingleBean(PropertiesOtlpTracingConnectionDetails.class));
116116
}
117117

118118
@Test
119119
void testConnectionFactoryWithOverridesWhenUsingCustomConnectionDetails() {
120120
this.contextRunner.withUserConfiguration(ConnectionDetailsConfiguration.class).run((context) -> {
121121
assertThat(context).hasSingleBean(OtlpTracingConnectionDetails.class)
122-
.doesNotHaveBean(OtlpAutoConfiguration.PropertiesOtlpTracingConnectionDetails.class);
122+
.doesNotHaveBean(PropertiesOtlpTracingConnectionDetails.class);
123123
OtlpHttpSpanExporter otlpHttpSpanExporter = context.getBean(OtlpHttpSpanExporter.class);
124124
assertThat(otlpHttpSpanExporter).extracting("delegate.httpSender.url")
125125
.isEqualTo(HttpUrl.get("http://localhost:12345/v1/traces"));

0 commit comments

Comments
 (0)