mirror of
https://github.com/spring-projects/spring-boot.git
synced 2026-09-17 20:19:06 +00:00
Extract OpenTelemetryLoggingAutoConfiguration
This auto-configuration configures OpenTelemetry logging. The existing OpenTelemetrySdkAutoConfiguration now only configures the OpenTelemetry SDK, but no individual subsystems (logging, metrics, tracing). Closes gh-47963
This commit is contained in:
+2
-2
@@ -17,8 +17,8 @@
|
||||
package org.springframework.boot.opentelemetry.docker.compose;
|
||||
|
||||
import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.Transport;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.Transport;
|
||||
import org.springframework.boot.testsupport.container.TestImage;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
+2
-2
@@ -17,8 +17,8 @@
|
||||
package org.springframework.boot.opentelemetry.docker.compose;
|
||||
|
||||
import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.Transport;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.Transport;
|
||||
import org.springframework.boot.testsupport.container.TestImage;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
+3
-3
@@ -23,9 +23,9 @@ import org.testcontainers.junit.jupiter.Testcontainers;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingAutoConfiguration;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.Transport;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingAutoConfiguration;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.Transport;
|
||||
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
|
||||
import org.springframework.boot.testsupport.container.TestImage;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
+3
-3
@@ -23,9 +23,9 @@ import org.testcontainers.junit.jupiter.Testcontainers;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingAutoConfiguration;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.Transport;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingAutoConfiguration;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.Transport;
|
||||
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
|
||||
import org.springframework.boot.testsupport.container.TestImage;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
-31
@@ -20,11 +20,7 @@ import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdkBuilder;
|
||||
import io.opentelemetry.sdk.logs.LogRecordProcessor;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
|
||||
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor;
|
||||
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
|
||||
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
|
||||
import io.opentelemetry.sdk.resources.Resource;
|
||||
import io.opentelemetry.sdk.resources.ResourceBuilder;
|
||||
@@ -37,7 +33,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.env.Environment;
|
||||
|
||||
/**
|
||||
@@ -80,30 +75,4 @@ public final class OpenTelemetrySdkAutoConfiguration {
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(SdkLoggerProvider.class)
|
||||
static class LoggerConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
BatchLogRecordProcessor openTelemetryBatchLogRecordProcessor(
|
||||
ObjectProvider<LogRecordExporter> logRecordExporters) {
|
||||
LogRecordExporter exporter = LogRecordExporter.composite(logRecordExporters.orderedStream().toList());
|
||||
return BatchLogRecordProcessor.builder(exporter).build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
SdkLoggerProvider openTelemetrySdkLoggerProvider(Resource openTelemetryResource,
|
||||
ObjectProvider<LogRecordProcessor> logRecordProcessors,
|
||||
ObjectProvider<SdkLoggerProviderBuilderCustomizer> customizers) {
|
||||
SdkLoggerProviderBuilder builder = SdkLoggerProvider.builder();
|
||||
builder.setResource(openTelemetryResource);
|
||||
logRecordProcessors.orderedStream().forEach(builder::addLogRecordProcessor);
|
||||
customizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright 2012-present the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
|
||||
import io.opentelemetry.sdk.logs.LogRecordProcessor;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
|
||||
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor;
|
||||
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
|
||||
import io.opentelemetry.sdk.resources.Resource;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetrySdkAutoConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
|
||||
/**
|
||||
* {@link EnableAutoConfiguration Auto-configuration} for OpenTelemetry logging.
|
||||
*
|
||||
* @author Moritz Halbritter
|
||||
* @since 4.0.0
|
||||
*/
|
||||
@AutoConfiguration(after = OpenTelemetrySdkAutoConfiguration.class)
|
||||
@ConditionalOnClass(SdkLoggerProvider.class)
|
||||
public final class OpenTelemetryLoggingAutoConfiguration {
|
||||
|
||||
OpenTelemetryLoggingAutoConfiguration() {
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
BatchLogRecordProcessor openTelemetryBatchLogRecordProcessor(ObjectProvider<LogRecordExporter> logRecordExporters) {
|
||||
LogRecordExporter exporter = LogRecordExporter.composite(logRecordExporters.orderedStream().toList());
|
||||
return BatchLogRecordProcessor.builder(exporter).build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnBean(Resource.class)
|
||||
SdkLoggerProvider openTelemetrySdkLoggerProvider(Resource openTelemetryResource,
|
||||
ObjectProvider<LogRecordProcessor> logRecordProcessors,
|
||||
ObjectProvider<SdkLoggerProviderBuilderCustomizer> customizers) {
|
||||
SdkLoggerProviderBuilder builder = SdkLoggerProvider.builder();
|
||||
builder.setResource(openTelemetryResource);
|
||||
logRecordProcessors.orderedStream().forEach(builder::addLogRecordProcessor);
|
||||
customizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure;
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
|
||||
+3
-3
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging.otlp;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
||||
@@ -24,8 +24,8 @@ import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||
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.logging.OtlpLoggingConfigurations.ConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingConfigurations.Exporters;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConfigurations.ConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConfigurations.Exporters;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
/**
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging.otlp;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging.otlp;
|
||||
|
||||
import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails;
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging.otlp;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.HashMap;
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging.otlp;
|
||||
|
||||
/**
|
||||
* Transport used to send OTLP log data.
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright 2012-present the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Auto-configuration for exporting logs with OpenTelemetry via OTLP.
|
||||
*/
|
||||
@NullMarked
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging.otlp;
|
||||
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Auto-configuration for exporting logs with OpenTelemetry.
|
||||
* Auto-configuration for OpenTelemetry logging.
|
||||
*/
|
||||
@NullMarked
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
|
||||
+3
-3
@@ -19,8 +19,8 @@ package org.springframework.boot.opentelemetry.docker.compose;
|
||||
import org.springframework.boot.docker.compose.core.RunningService;
|
||||
import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory;
|
||||
import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.Transport;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.Transport;
|
||||
|
||||
/**
|
||||
* {@link DockerComposeConnectionDetailsFactory} to create
|
||||
@@ -40,7 +40,7 @@ class OtlpLoggingDockerComposeConnectionDetailsFactory
|
||||
|
||||
OtlpLoggingDockerComposeConnectionDetailsFactory() {
|
||||
super(OPENTELEMETRY_IMAGE_NAMES,
|
||||
"org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingAutoConfiguration");
|
||||
"org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingAutoConfiguration");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-2
@@ -18,8 +18,8 @@ package org.springframework.boot.opentelemetry.testcontainers;
|
||||
|
||||
import org.testcontainers.grafana.LgtmStackContainer;
|
||||
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.Transport;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.Transport;
|
||||
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory;
|
||||
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource;
|
||||
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
|
||||
|
||||
+2
-2
@@ -19,8 +19,8 @@ package org.springframework.boot.opentelemetry.testcontainers;
|
||||
import org.testcontainers.containers.Container;
|
||||
import org.testcontainers.containers.GenericContainer;
|
||||
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.Transport;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.Transport;
|
||||
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory;
|
||||
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource;
|
||||
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
|
||||
|
||||
+3
-12
@@ -1,18 +1,11 @@
|
||||
{
|
||||
"groups": [],
|
||||
"properties": [
|
||||
{
|
||||
"name": "management.otlp.logging.export.enabled",
|
||||
"deprecation": {
|
||||
"replacement": "management.logging.export.otlp.enabled",
|
||||
"level": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "management.logging.export.otlp.enabled",
|
||||
"type": "java.lang.Boolean",
|
||||
"description": "Whether auto-configuration of logging is enabled to export logs over OTLP."
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "management.otlp.logging",
|
||||
"type": "org.springframework.boot.opentelemetry.actuate.autoconfigure.logging.OpenTelemetryLoggingExportProperties",
|
||||
@@ -22,7 +15,7 @@
|
||||
"level": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
{
|
||||
"name": "management.otlp.logging.compression",
|
||||
"type": "org.springframework.boot.opentelemetry.actuate.autoconfigure.logging.OpenTelemetryLoggingExportProperties$Compression",
|
||||
"description": "Method used to compress the payload.",
|
||||
@@ -54,10 +47,8 @@
|
||||
"level": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
{
|
||||
"name": "management.otlp.logging.export.enabled",
|
||||
"type": "java.lang.Boolean",
|
||||
"description": "Whether auto-configuration of logging is enabled to export OTLP logs.",
|
||||
"deprecation": {
|
||||
"replacement": "management.logging.export.otlp.enabled",
|
||||
"level": "error"
|
||||
|
||||
+2
-1
@@ -1,2 +1,3 @@
|
||||
org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetrySdkAutoConfiguration
|
||||
org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingAutoConfiguration
|
||||
org.springframework.boot.opentelemetry.autoconfigure.logging.OpenTelemetryLoggingAutoConfiguration
|
||||
org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingAutoConfiguration
|
||||
|
||||
-157
@@ -16,22 +16,11 @@
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.common.AttributeKey;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||
import io.opentelemetry.sdk.common.CompletableResultCode;
|
||||
import io.opentelemetry.sdk.logs.LogRecordProcessor;
|
||||
import io.opentelemetry.sdk.logs.ReadWriteLogRecord;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
|
||||
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor;
|
||||
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
|
||||
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
|
||||
import io.opentelemetry.sdk.resources.Resource;
|
||||
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
||||
@@ -74,8 +63,6 @@ class OpenTelemetrySdkAutoConfigurationTests {
|
||||
this.contextRunner.run((context) -> {
|
||||
assertThat(context).hasSingleBean(OpenTelemetrySdk.class);
|
||||
assertThat(context).hasSingleBean(Resource.class);
|
||||
assertThat(context).hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).hasSingleBean(SdkLoggerProvider.class);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -85,8 +72,6 @@ class OpenTelemetrySdkAutoConfigurationTests {
|
||||
this.contextRunner.withClassLoader(new FilteredClassLoader(packageName)).run((context) -> {
|
||||
assertThat(context).doesNotHaveBean(OpenTelemetrySdk.class);
|
||||
assertThat(context).doesNotHaveBean(Resource.class);
|
||||
assertThat(context).doesNotHaveBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).doesNotHaveBean(SdkLoggerProvider.class);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -95,8 +80,6 @@ class OpenTelemetrySdkAutoConfigurationTests {
|
||||
this.contextRunner.withClassLoader(new FilteredClassLoader("io.opentelemetry.sdk.logs")).run((context) -> {
|
||||
assertThat(context).hasSingleBean(OpenTelemetrySdk.class);
|
||||
assertThat(context).hasSingleBean(Resource.class);
|
||||
assertThat(context).doesNotHaveBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).doesNotHaveBean(SdkLoggerProvider.class);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -107,10 +90,6 @@ class OpenTelemetrySdkAutoConfigurationTests {
|
||||
assertThat(context).hasBean("customOpenTelemetry");
|
||||
assertThat(context).hasSingleBean(Resource.class);
|
||||
assertThat(context).hasBean("customResource");
|
||||
assertThat(context).hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).hasBean("customBatchLogRecordProcessor").hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).hasSingleBean(LogRecordProcessor.class);
|
||||
assertThat(context).hasBean("customSdkLoggerProvider").hasSingleBean(SdkLoggerProvider.class);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -201,45 +180,6 @@ class OpenTelemetrySdkAutoConfigurationTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenHasMultipleLogRecordExportersProvidesBatchLogRecordProcessor() {
|
||||
this.contextRunner.withUserConfiguration(MultipleLogRecordExportersConfiguration.class).run((context) -> {
|
||||
assertThat(context).hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context.getBeansOfType(LogRecordExporter.class)).hasSize(2);
|
||||
assertThat(context).hasBean("customLogRecordExporter1");
|
||||
assertThat(context).hasBean("customLogRecordExporter2");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenHasMultipleLogRecordProcessorsStillProvidesBatchLogRecordProcessor() {
|
||||
this.contextRunner.withUserConfiguration(MultipleLogRecordProcessorsConfiguration.class).run((context) -> {
|
||||
assertThat(context).hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).hasSingleBean(SdkLoggerProvider.class);
|
||||
assertThat(context.getBeansOfType(LogRecordProcessor.class)).hasSize(3);
|
||||
assertThat(context).hasBean("openTelemetryBatchLogRecordProcessor");
|
||||
assertThat(context).hasBean("customLogRecordProcessor1");
|
||||
assertThat(context).hasBean("customLogRecordProcessor2");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenHasMultipleSdkLoggerProviderBuilderCustomizersCallsCustomizeMethod() {
|
||||
this.contextRunner.withUserConfiguration(MultipleSdkLoggerProviderBuilderCustomizersConfiguration.class)
|
||||
.run((context) -> {
|
||||
assertThat(context).hasSingleBean(SdkLoggerProvider.class);
|
||||
assertThat(context.getBeansOfType(SdkLoggerProviderBuilderCustomizer.class)).hasSize(2);
|
||||
assertThat(context).hasBean("customSdkLoggerProviderBuilderCustomizer1");
|
||||
assertThat(context).hasBean("customSdkLoggerProviderBuilderCustomizer2");
|
||||
assertThat(context
|
||||
.getBean("customSdkLoggerProviderBuilderCustomizer1", NoopSdkLoggerProviderBuilderCustomizer.class)
|
||||
.called()).isEqualTo(1);
|
||||
assertThat(context
|
||||
.getBean("customSdkLoggerProviderBuilderCustomizer2", NoopSdkLoggerProviderBuilderCustomizer.class)
|
||||
.called()).isEqualTo(1);
|
||||
});
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class UserConfiguration {
|
||||
|
||||
@@ -253,103 +193,6 @@ class OpenTelemetrySdkAutoConfigurationTests {
|
||||
return Resource.getDefault();
|
||||
}
|
||||
|
||||
@Bean
|
||||
BatchLogRecordProcessor customBatchLogRecordProcessor() {
|
||||
return BatchLogRecordProcessor.builder(new NoopLogRecordExporter()).build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
SdkLoggerProvider customSdkLoggerProvider() {
|
||||
return SdkLoggerProvider.builder().build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class MultipleLogRecordExportersConfiguration {
|
||||
|
||||
@Bean
|
||||
LogRecordExporter customLogRecordExporter1() {
|
||||
return new NoopLogRecordExporter();
|
||||
}
|
||||
|
||||
@Bean
|
||||
LogRecordExporter customLogRecordExporter2() {
|
||||
return new NoopLogRecordExporter();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class MultipleLogRecordProcessorsConfiguration {
|
||||
|
||||
@Bean
|
||||
LogRecordProcessor customLogRecordProcessor1() {
|
||||
return new NoopLogRecordProcessor();
|
||||
}
|
||||
|
||||
@Bean
|
||||
LogRecordProcessor customLogRecordProcessor2() {
|
||||
return new NoopLogRecordProcessor();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class MultipleSdkLoggerProviderBuilderCustomizersConfiguration {
|
||||
|
||||
@Bean
|
||||
SdkLoggerProviderBuilderCustomizer customSdkLoggerProviderBuilderCustomizer1() {
|
||||
return new NoopSdkLoggerProviderBuilderCustomizer();
|
||||
}
|
||||
|
||||
@Bean
|
||||
SdkLoggerProviderBuilderCustomizer customSdkLoggerProviderBuilderCustomizer2() {
|
||||
return new NoopSdkLoggerProviderBuilderCustomizer();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class NoopLogRecordExporter implements LogRecordExporter {
|
||||
|
||||
@Override
|
||||
public CompletableResultCode export(Collection<LogRecordData> logs) {
|
||||
return CompletableResultCode.ofSuccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableResultCode flush() {
|
||||
return CompletableResultCode.ofSuccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableResultCode shutdown() {
|
||||
return CompletableResultCode.ofSuccess();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class NoopLogRecordProcessor implements LogRecordProcessor {
|
||||
|
||||
@Override
|
||||
public void onEmit(Context context, ReadWriteLogRecord logRecord) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class NoopSdkLoggerProviderBuilderCustomizer implements SdkLoggerProviderBuilderCustomizer {
|
||||
|
||||
final AtomicInteger called = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public void customize(SdkLoggerProviderBuilder builder) {
|
||||
this.called.incrementAndGet();
|
||||
}
|
||||
|
||||
int called() {
|
||||
return this.called.get();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+228
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
* Copyright 2012-present the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.sdk.common.CompletableResultCode;
|
||||
import io.opentelemetry.sdk.logs.LogRecordProcessor;
|
||||
import io.opentelemetry.sdk.logs.ReadWriteLogRecord;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
||||
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
|
||||
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor;
|
||||
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.context.annotation.ImportCandidates;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetrySdkAutoConfiguration;
|
||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link OpenTelemetryLoggingAutoConfiguration}.
|
||||
*
|
||||
* @author Moritz Halbritter
|
||||
*/
|
||||
class OpenTelemetryLoggingAutoConfigurationTests {
|
||||
|
||||
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(OpenTelemetrySdkAutoConfiguration.class,
|
||||
OpenTelemetryLoggingAutoConfiguration.class));
|
||||
|
||||
@Test
|
||||
void registeredInAutoConfigurationImports() {
|
||||
assertThat(ImportCandidates.load(AutoConfiguration.class, null).getCandidates())
|
||||
.contains(OpenTelemetryLoggingAutoConfiguration.class.getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
void providesBeans() {
|
||||
this.contextRunner.run((context) -> {
|
||||
assertThat(context).hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).hasSingleBean(SdkLoggerProvider.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenOpenTelemetryLogsIsNotOnClasspathDoesNotProvideBeans() {
|
||||
this.contextRunner.withClassLoader(new FilteredClassLoader("io.opentelemetry.sdk.logs")).run((context) -> {
|
||||
assertThat(context).doesNotHaveBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).doesNotHaveBean(SdkLoggerProvider.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenHasUserSuppliedBeansDoesNotProvideBeans() {
|
||||
this.contextRunner.withUserConfiguration(UserConfiguration.class).run((context) -> {
|
||||
assertThat(context).hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).hasBean("customBatchLogRecordProcessor").hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).hasSingleBean(LogRecordProcessor.class);
|
||||
assertThat(context).hasBean("customSdkLoggerProvider").hasSingleBean(SdkLoggerProvider.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenHasMultipleLogRecordExportersProvidesBatchLogRecordProcessor() {
|
||||
this.contextRunner.withUserConfiguration(MultipleLogRecordExportersConfiguration.class).run((context) -> {
|
||||
assertThat(context).hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context.getBeansOfType(LogRecordExporter.class)).hasSize(2);
|
||||
assertThat(context).hasBean("customLogRecordExporter1");
|
||||
assertThat(context).hasBean("customLogRecordExporter2");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenHasMultipleLogRecordProcessorsStillProvidesBatchLogRecordProcessor() {
|
||||
this.contextRunner.withUserConfiguration(MultipleLogRecordProcessorsConfiguration.class).run((context) -> {
|
||||
assertThat(context).hasSingleBean(BatchLogRecordProcessor.class);
|
||||
assertThat(context).hasSingleBean(SdkLoggerProvider.class);
|
||||
assertThat(context.getBeansOfType(LogRecordProcessor.class)).hasSize(3);
|
||||
assertThat(context).hasBean("openTelemetryBatchLogRecordProcessor");
|
||||
assertThat(context).hasBean("customLogRecordProcessor1");
|
||||
assertThat(context).hasBean("customLogRecordProcessor2");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenHasMultipleSdkLoggerProviderBuilderCustomizersCallsCustomizeMethod() {
|
||||
this.contextRunner.withUserConfiguration(MultipleSdkLoggerProviderBuilderCustomizersConfiguration.class)
|
||||
.run((context) -> {
|
||||
assertThat(context).hasSingleBean(SdkLoggerProvider.class);
|
||||
assertThat(context.getBeansOfType(SdkLoggerProviderBuilderCustomizer.class)).hasSize(2);
|
||||
assertThat(context).hasBean("customSdkLoggerProviderBuilderCustomizer1");
|
||||
assertThat(context).hasBean("customSdkLoggerProviderBuilderCustomizer2");
|
||||
assertThat(context
|
||||
.getBean("customSdkLoggerProviderBuilderCustomizer1", NoopSdkLoggerProviderBuilderCustomizer.class)
|
||||
.called()).isEqualTo(1);
|
||||
assertThat(context
|
||||
.getBean("customSdkLoggerProviderBuilderCustomizer2", NoopSdkLoggerProviderBuilderCustomizer.class)
|
||||
.called()).isEqualTo(1);
|
||||
});
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class UserConfiguration {
|
||||
|
||||
@Bean
|
||||
BatchLogRecordProcessor customBatchLogRecordProcessor() {
|
||||
return BatchLogRecordProcessor.builder(new NoopLogRecordExporter()).build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
SdkLoggerProvider customSdkLoggerProvider() {
|
||||
return SdkLoggerProvider.builder().build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class MultipleLogRecordExportersConfiguration {
|
||||
|
||||
@Bean
|
||||
LogRecordExporter customLogRecordExporter1() {
|
||||
return new NoopLogRecordExporter();
|
||||
}
|
||||
|
||||
@Bean
|
||||
LogRecordExporter customLogRecordExporter2() {
|
||||
return new NoopLogRecordExporter();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class MultipleLogRecordProcessorsConfiguration {
|
||||
|
||||
@Bean
|
||||
LogRecordProcessor customLogRecordProcessor1() {
|
||||
return new NoopLogRecordProcessor();
|
||||
}
|
||||
|
||||
@Bean
|
||||
LogRecordProcessor customLogRecordProcessor2() {
|
||||
return new NoopLogRecordProcessor();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class MultipleSdkLoggerProviderBuilderCustomizersConfiguration {
|
||||
|
||||
@Bean
|
||||
SdkLoggerProviderBuilderCustomizer customSdkLoggerProviderBuilderCustomizer1() {
|
||||
return new NoopSdkLoggerProviderBuilderCustomizer();
|
||||
}
|
||||
|
||||
@Bean
|
||||
SdkLoggerProviderBuilderCustomizer customSdkLoggerProviderBuilderCustomizer2() {
|
||||
return new NoopSdkLoggerProviderBuilderCustomizer();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class NoopLogRecordExporter implements LogRecordExporter {
|
||||
|
||||
@Override
|
||||
public CompletableResultCode export(Collection<LogRecordData> logs) {
|
||||
return CompletableResultCode.ofSuccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableResultCode flush() {
|
||||
return CompletableResultCode.ofSuccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableResultCode shutdown() {
|
||||
return CompletableResultCode.ofSuccess();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class NoopLogRecordProcessor implements LogRecordProcessor {
|
||||
|
||||
@Override
|
||||
public void onEmit(Context context, ReadWriteLogRecord logRecord) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class NoopSdkLoggerProviderBuilderCustomizer implements SdkLoggerProviderBuilderCustomizer {
|
||||
|
||||
final AtomicInteger called = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public void customize(SdkLoggerProviderBuilder builder) {
|
||||
this.called.incrementAndGet();
|
||||
}
|
||||
|
||||
int called() {
|
||||
return this.called.get();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+4
-3
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging.otlp;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
@@ -34,6 +34,7 @@ import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetrySdkAutoConfiguration;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OpenTelemetryLoggingAutoConfiguration;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
|
||||
@@ -49,8 +50,8 @@ class OtlpLoggingAutoConfigurationIntegrationTests {
|
||||
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withPropertyValues("spring.application.name=otlp-logs-test",
|
||||
"management.opentelemetry.logging.export.otlp.headers.Authorization=Bearer my-token")
|
||||
.withConfiguration(
|
||||
AutoConfigurations.of(OpenTelemetrySdkAutoConfiguration.class, OtlpLoggingAutoConfiguration.class));
|
||||
.withConfiguration(AutoConfigurations.of(OpenTelemetrySdkAutoConfiguration.class,
|
||||
OpenTelemetryLoggingAutoConfiguration.class, OtlpLoggingAutoConfiguration.class));
|
||||
|
||||
private final MockWebServer mockWebServer = new MockWebServer();
|
||||
|
||||
+7
-5
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging;
|
||||
package org.springframework.boot.opentelemetry.autoconfigure.logging.otlp;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.Supplier;
|
||||
@@ -34,8 +34,9 @@ import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.context.annotation.ImportCandidates;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetrySdkAutoConfiguration;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.SdkLoggerProviderBuilderCustomizer;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OtlpLoggingConfigurations.ConnectionDetails.PropertiesOtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.OpenTelemetryLoggingAutoConfiguration;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.SdkLoggerProviderBuilderCustomizer;
|
||||
import org.springframework.boot.opentelemetry.autoconfigure.logging.otlp.OtlpLoggingConfigurations.ConnectionDetails.PropertiesOtlpLoggingConnectionDetails;
|
||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
@@ -54,8 +55,9 @@ class OtlpLoggingAutoConfigurationTests {
|
||||
private final ApplicationContextRunner contextRunner;
|
||||
|
||||
OtlpLoggingAutoConfigurationTests() {
|
||||
this.contextRunner = new ApplicationContextRunner().withConfiguration(
|
||||
AutoConfigurations.of(OpenTelemetrySdkAutoConfiguration.class, OtlpLoggingAutoConfiguration.class));
|
||||
this.contextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(OpenTelemetrySdkAutoConfiguration.class,
|
||||
OpenTelemetryLoggingAutoConfiguration.class, OtlpLoggingAutoConfiguration.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
Reference in New Issue
Block a user