Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,26 @@
"description": "Whether auto-configuration of logging is enabled to export logs.",
"defaultValue": true
},
{
"name": "management.opentelemetry.otlp.connect-timeout",
"type": "java.time.Duration",
"description": "Connection timeout for the OTLP exporters."
},
{
"name": "management.opentelemetry.otlp.endpoint",
"type": "java.lang.String",
"description": "OTLP target endpoint URL."
},
{
"name": "management.opentelemetry.otlp.headers",
"type": "java.util.Map<java.lang.String,java.lang.String>",
"description": "Custom headers to be appended to OTLP requests."
},
{
"name": "management.opentelemetry.otlp.timeout",
"type": "java.time.Duration",
"description": "Read timeout for the OTLP exporters."
},
{
"name": "management.server.add-application-context-header",
"type": "java.lang.Boolean",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import org.springframework.boot.micrometer.metrics.autoconfigure.export.ConditionalOnEnabledMetricsExport;
import org.springframework.boot.micrometer.metrics.autoconfigure.export.simple.SimpleMetricsExportAutoConfiguration;
import org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetryProperties;
import org.springframework.boot.opentelemetry.autoconfigure.OtlpProperties;
import org.springframework.boot.ssl.SslBundle;
import org.springframework.boot.ssl.SslBundles;
import org.springframework.boot.thread.Threading;
Expand All @@ -61,7 +62,7 @@
@ConditionalOnBean(Clock.class)
@ConditionalOnClass({ OtlpMeterRegistry.class, OpenTelemetryProperties.class })
@ConditionalOnEnabledMetricsExport("otlp")
@EnableConfigurationProperties({ OtlpMetricsProperties.class, OpenTelemetryProperties.class })
@EnableConfigurationProperties({ OtlpMetricsProperties.class, OpenTelemetryProperties.class, OtlpProperties.class })
public final class OtlpMetricsExportAutoConfiguration {

private final OtlpMetricsProperties properties;
Expand All @@ -72,23 +73,26 @@ public final class OtlpMetricsExportAutoConfiguration {

@Bean
@ConditionalOnMissingBean
OtlpMetricsConnectionDetails otlpMetricsConnectionDetails(ObjectProvider<SslBundles> sslBundles) {
return new PropertiesOtlpMetricsConnectionDetails(this.properties, sslBundles.getIfAvailable());
OtlpMetricsConnectionDetails otlpMetricsConnectionDetails(OtlpProperties otlpProperties,
ObjectProvider<SslBundles> sslBundles) {
return new PropertiesOtlpMetricsConnectionDetails(this.properties, otlpProperties, sslBundles.getIfAvailable());
}

@Bean
@ConditionalOnMissingBean
OtlpConfig otlpConfig(OpenTelemetryProperties openTelemetryProperties,
OtlpConfig otlpConfig(OtlpProperties otlpProperties, OpenTelemetryProperties openTelemetryProperties,
OtlpMetricsConnectionDetails connectionDetails, Environment environment) {
return new OtlpMetricsPropertiesConfigAdapter(this.properties, openTelemetryProperties, connectionDetails,
environment);
return new OtlpMetricsPropertiesConfigAdapter(this.properties, otlpProperties, openTelemetryProperties,
connectionDetails, environment);
}

@Bean
@ConditionalOnMissingBean(OtlpMetricsSender.class)
OtlpHttpMetricsSender otlpMetricsSender(OtlpMetricsConnectionDetails connectionDetails) {
OtlpHttpMetricsSender otlpMetricsSender(OtlpMetricsConnectionDetails connectionDetails,
OtlpProperties otlpProperties) {
Duration connectTimeout = this.properties.getConnectTimeout();
Duration timeout = connectTimeout.plus(this.properties.getReadTimeout());
Duration readTimeout = this.properties.getReadTimeout();
Duration timeout = connectTimeout.plus(readTimeout);
JdkClientHttpSender httpSender = new JdkClientHttpSender(connectTimeout, timeout,
connectionDetails.getSslBundle());
return new OtlpHttpMetricsSender(httpSender);
Expand Down Expand Up @@ -129,16 +133,27 @@ static class PropertiesOtlpMetricsConnectionDetails implements OtlpMetricsConnec

private final OtlpMetricsProperties properties;

private final OtlpProperties otlpProperties;

private final @Nullable SslBundles sslBundles;

PropertiesOtlpMetricsConnectionDetails(OtlpMetricsProperties properties, @Nullable SslBundles sslBundles) {
PropertiesOtlpMetricsConnectionDetails(OtlpMetricsProperties properties, OtlpProperties otlpProperties,
@Nullable SslBundles sslBundles) {
this.properties = properties;
this.otlpProperties = otlpProperties;
this.sslBundles = sslBundles;
}

@Override
public @Nullable String getUrl() {
return this.properties.getUrl();
if (StringUtils.hasLength(this.properties.getUrl())) {
return this.properties.getUrl();
}
String endpoint = this.otlpProperties.getEndpoint();
if (StringUtils.hasLength(endpoint)) {
return endpoint.endsWith("/") ? endpoint + "v1/metrics" : endpoint + "/v1/metrics";
}
return null;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package org.springframework.boot.micrometer.metrics.autoconfigure.export.otlp;

import java.time.Duration;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
Expand All @@ -30,6 +31,7 @@
import org.springframework.boot.micrometer.metrics.autoconfigure.export.properties.StepRegistryPropertiesConfigAdapter;
import org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetryProperties;
import org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetryResourceAttributes;
import org.springframework.boot.opentelemetry.autoconfigure.OtlpProperties;
import org.springframework.core.env.Environment;
import org.springframework.util.CollectionUtils;

Expand All @@ -43,16 +45,19 @@
class OtlpMetricsPropertiesConfigAdapter extends StepRegistryPropertiesConfigAdapter<OtlpMetricsProperties>
implements OtlpConfig {

private final OtlpProperties otlpProperties;

private final OpenTelemetryProperties openTelemetryProperties;

private final OtlpMetricsConnectionDetails connectionDetails;

private final Environment environment;

OtlpMetricsPropertiesConfigAdapter(OtlpMetricsProperties properties,
OtlpMetricsPropertiesConfigAdapter(OtlpMetricsProperties properties, OtlpProperties otlpProperties,
OpenTelemetryProperties openTelemetryProperties, OtlpMetricsConnectionDetails connectionDetails,
Environment environment) {
super(properties);
this.otlpProperties = otlpProperties;
this.connectionDetails = connectionDetails;
this.openTelemetryProperties = openTelemetryProperties;
this.environment = environment;
Expand Down Expand Up @@ -88,7 +93,27 @@ public Map<String, String> resourceAttributes() {

@Override
public Map<String, String> headers() {
return obtain(OtlpMetricsProperties::getHeaders, OtlpConfig.super::headers);
Map<String, String> headers = new LinkedHashMap<>(this.otlpProperties.getHeaders());
headers.putAll(obtain(OtlpMetricsProperties::getHeaders, OtlpConfig.super::headers));
return Collections.unmodifiableMap(headers);
}

@Override
@SuppressWarnings("deprecation")
public Duration connectTimeout() {
return obtain(OtlpMetricsProperties::getConnectTimeout, () -> {
Duration commonConnectTimeout = this.otlpProperties.getConnectTimeout();
return (commonConnectTimeout != null) ? commonConnectTimeout : OtlpConfig.super.connectTimeout();
});
}

@Override
@SuppressWarnings("deprecation")
public Duration readTimeout() {
return obtain(OtlpMetricsProperties::getReadTimeout, () -> {
Duration commonTimeout = this.otlpProperties.getTimeout();
return (commonTimeout != null) ? commonTimeout : OtlpConfig.super.readTimeout();
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,17 @@ public SslBundle getSslBundle() {
});
}

@Test
void testUrlFallbackToCommonOtlpEndpoint() {
this.contextRunner.withUserConfiguration(BaseConfiguration.class)
.withPropertyValues("management.opentelemetry.otlp.endpoint=http://common-host:4318")
.run((context) -> {
assertThat(context).hasSingleBean(OtlpConfig.class);
OtlpConfig config = context.getBean(OtlpConfig.class);
assertThat(config.url()).isEqualTo("http://common-host:4318/v1/metrics");
});
}

private HttpClient extractHttpClient(OtlpHttpMetricsSender metricsSender) {
Object field = ReflectionTestUtils.getField(metricsSender, "httpSender");
assertThat(field).isNotNull();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package org.springframework.boot.micrometer.metrics.autoconfigure.export.otlp;

import java.time.Duration;
import java.util.Map;
import java.util.concurrent.TimeUnit;

Expand All @@ -28,6 +29,7 @@
import org.springframework.boot.micrometer.metrics.autoconfigure.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails;
import org.springframework.boot.micrometer.metrics.autoconfigure.export.otlp.OtlpMetricsProperties.Meter;
import org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetryProperties;
import org.springframework.boot.opentelemetry.autoconfigure.OtlpProperties;
import org.springframework.mock.env.MockEnvironment;

import static org.assertj.core.api.Assertions.assertThat;
Expand All @@ -44,6 +46,8 @@ class OtlpMetricsPropertiesConfigAdapterTests {

private OtlpMetricsProperties properties;

private OtlpProperties otlpProperties;

private OpenTelemetryProperties openTelemetryProperties;

private MockEnvironment environment;
Expand All @@ -53,9 +57,10 @@ class OtlpMetricsPropertiesConfigAdapterTests {
@BeforeEach
void setUp() {
this.properties = new OtlpMetricsProperties();
this.otlpProperties = new OtlpProperties();
this.openTelemetryProperties = new OpenTelemetryProperties();
this.environment = new MockEnvironment();
this.connectionDetails = new PropertiesOtlpMetricsConnectionDetails(this.properties, null);
this.connectionDetails = new PropertiesOtlpMetricsConnectionDetails(this.properties, this.otlpProperties, null);
}

@Test
Expand Down Expand Up @@ -238,8 +243,36 @@ void shouldUseDefaultApplicationGroupIfApplicationGroupIsNotSet() {
}

private OtlpMetricsPropertiesConfigAdapter createAdapter() {
return new OtlpMetricsPropertiesConfigAdapter(this.properties, this.openTelemetryProperties,
this.connectionDetails, this.environment);
return new OtlpMetricsPropertiesConfigAdapter(this.properties, this.otlpProperties,
this.openTelemetryProperties, this.connectionDetails, this.environment);
}

@Test
void whenPropertiesHeadersIsNotSetThenUseOtlpPropertiesHeadersAsFallback() {
this.otlpProperties.getHeaders().put("common-header", "common-value");
assertThat(createAdapter().headers()).containsEntry("common-header", "common-value");
}

@Test
void whenPropertiesHeadersIsSetThenMergeWithOtlpPropertiesHeaders() {
this.otlpProperties.getHeaders().put("common-header", "common-value");
this.properties.setHeaders(Map.of("signal-header", "signal-value"));
assertThat(createAdapter().headers()).containsEntry("common-header", "common-value")
.containsEntry("signal-header", "signal-value");
}

@Test
void whenPropertiesTimeoutIsSetItOverridesOtlpPropertiesTimeout() {
this.otlpProperties.setTimeout(Duration.ofSeconds(10));
this.properties.setReadTimeout(Duration.ofSeconds(3));
assertThat(createAdapter().readTimeout()).isEqualTo(Duration.ofSeconds(3));
}

@Test
void whenPropertiesConnectTimeoutIsSetItOverridesOtlpPropertiesConnectTimeout() {
this.otlpProperties.setConnectTimeout(Duration.ofSeconds(10));
this.properties.setConnectTimeout(Duration.ofSeconds(3));
assertThat(createAdapter().connectTimeout()).isEqualTo(Duration.ofSeconds(3));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.opentelemetry.autoconfigure.OtlpProperties;
import org.springframework.context.annotation.Import;

/**
Expand All @@ -48,7 +49,7 @@
*/
@AutoConfiguration
@ConditionalOnClass({ OtelTracer.class, SdkTracerProvider.class, OpenTelemetry.class, OtlpHttpSpanExporter.class })
@EnableConfigurationProperties(OtlpTracingProperties.class)
@EnableConfigurationProperties({ OtlpTracingProperties.class, OtlpProperties.class })
@Import({ OtlpTracingConfigurations.ConnectionDetails.class, OtlpTracingConfigurations.Exporters.class })
public final class OtlpTracingAutoConfiguration {

Expand Down
Loading