Skip to content

Commit 29354a7

Browse files
authored
add SystemOutLogRecordExporter for spring starter (#10420)
1 parent acb078b commit 29354a7

File tree

8 files changed

+155
-18
lines changed

8 files changed

+155
-18
lines changed

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/logging/LoggingMetricExporterAutoConfiguration.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1414
import org.springframework.context.annotation.Bean;
1515
import org.springframework.context.annotation.Condition;
16+
import org.springframework.context.annotation.ConditionContext;
1617
import org.springframework.context.annotation.Conditional;
1718
import org.springframework.context.annotation.Configuration;
19+
import org.springframework.core.type.AnnotatedTypeMetadata;
1820

1921
/** Configures {@link LoggingMetricExporter} bean for tracing. */
2022
@Configuration
@@ -31,9 +33,7 @@ public LoggingMetricExporter otelLoggingMetricExporter() {
3133

3234
static final class CustomCondition implements Condition {
3335
@Override
34-
public boolean matches(
35-
org.springframework.context.annotation.ConditionContext context,
36-
org.springframework.core.type.AnnotatedTypeMetadata metadata) {
36+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
3737
return ExporterConfigEvaluator.isExporterEnabled(
3838
context.getEnvironment(),
3939
"otel.exporter.logging.enabled",

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/logging/LoggingSpanExporterAutoConfiguration.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1414
import org.springframework.context.annotation.Bean;
1515
import org.springframework.context.annotation.Condition;
16+
import org.springframework.context.annotation.ConditionContext;
1617
import org.springframework.context.annotation.Conditional;
1718
import org.springframework.context.annotation.Configuration;
19+
import org.springframework.core.type.AnnotatedTypeMetadata;
1820

1921
/** Configures {@link LoggingSpanExporter} bean for tracing. */
2022
@Configuration
@@ -31,9 +33,7 @@ public LoggingSpanExporter otelLoggingSpanExporter() {
3133

3234
static final class CustomCondition implements Condition {
3335
@Override
34-
public boolean matches(
35-
org.springframework.context.annotation.ConditionContext context,
36-
org.springframework.core.type.AnnotatedTypeMetadata metadata) {
36+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
3737
return ExporterConfigEvaluator.isExporterEnabled(
3838
context.getEnvironment(),
3939
"otel.exporter.logging.enabled",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.spring.autoconfigure.exporters.logging;
7+
8+
import io.opentelemetry.exporter.logging.SystemOutLogRecordExporter;
9+
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
10+
import io.opentelemetry.instrumentation.spring.autoconfigure.exporters.internal.ExporterConfigEvaluator;
11+
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
12+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
14+
import org.springframework.context.annotation.Bean;
15+
import org.springframework.context.annotation.Condition;
16+
import org.springframework.context.annotation.ConditionContext;
17+
import org.springframework.context.annotation.Conditional;
18+
import org.springframework.context.annotation.Configuration;
19+
import org.springframework.core.type.AnnotatedTypeMetadata;
20+
21+
/** Configures {@link SystemOutLogRecordExporter} bean for tracing. */
22+
@Configuration
23+
@AutoConfigureBefore(OpenTelemetryAutoConfiguration.class)
24+
@Conditional(SystemOutLogRecordExporterAutoConfiguration.CustomCondition.class)
25+
@ConditionalOnClass(SystemOutLogRecordExporter.class)
26+
public class SystemOutLogRecordExporterAutoConfiguration {
27+
28+
@Bean(destroyMethod = "") // SDK components are shutdown from the OpenTelemetry instance
29+
@ConditionalOnMissingBean
30+
public SystemOutLogRecordExporter otelSystemOutLogRecordExporter() {
31+
return SystemOutLogRecordExporter.create();
32+
}
33+
34+
static final class CustomCondition implements Condition {
35+
@Override
36+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
37+
return ExporterConfigEvaluator.isExporterEnabled(
38+
context.getEnvironment(),
39+
"otel.exporter.logging.enabled",
40+
"otel.exporter.logging.logs.enabled",
41+
"otel.logs.exporter",
42+
"logging",
43+
false);
44+
}
45+
}
46+
}

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/otlp/OtlpLogRecordExporterAutoConfiguration.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1818
import org.springframework.context.annotation.Bean;
1919
import org.springframework.context.annotation.Condition;
20+
import org.springframework.context.annotation.ConditionContext;
2021
import org.springframework.context.annotation.Conditional;
22+
import org.springframework.core.type.AnnotatedTypeMetadata;
2123

2224
@AutoConfigureBefore(OpenTelemetryAutoConfiguration.class)
2325
@Conditional(OtlpLogRecordExporterAutoConfiguration.CustomCondition.class)
@@ -32,9 +34,7 @@ public LogRecordExporter otelOtlpLogRecordExporter(ConfigProperties configProper
3234

3335
static final class CustomCondition implements Condition {
3436
@Override
35-
public boolean matches(
36-
org.springframework.context.annotation.ConditionContext context,
37-
org.springframework.core.type.AnnotatedTypeMetadata metadata) {
37+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
3838
return ExporterConfigEvaluator.isExporterEnabled(
3939
context.getEnvironment(),
4040
"otel.exporter.otlp.enabled",

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/otlp/OtlpMetricExporterAutoConfiguration.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1818
import org.springframework.context.annotation.Bean;
1919
import org.springframework.context.annotation.Condition;
20+
import org.springframework.context.annotation.ConditionContext;
2021
import org.springframework.context.annotation.Conditional;
2122
import org.springframework.context.annotation.Configuration;
23+
import org.springframework.core.type.AnnotatedTypeMetadata;
2224

2325
@Configuration
2426
@AutoConfigureBefore(OpenTelemetryAutoConfiguration.class)
@@ -34,9 +36,7 @@ public MetricExporter otelOtlpMetricExporter(ConfigProperties configProperties)
3436

3537
static final class CustomCondition implements Condition {
3638
@Override
37-
public boolean matches(
38-
org.springframework.context.annotation.ConditionContext context,
39-
org.springframework.core.type.AnnotatedTypeMetadata metadata) {
39+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
4040
return ExporterConfigEvaluator.isExporterEnabled(
4141
context.getEnvironment(),
4242
"otel.exporter.otlp.enabled",

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/otlp/OtlpSpanExporterAutoConfiguration.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1818
import org.springframework.context.annotation.Bean;
1919
import org.springframework.context.annotation.Condition;
20+
import org.springframework.context.annotation.ConditionContext;
2021
import org.springframework.context.annotation.Conditional;
2122
import org.springframework.context.annotation.Configuration;
23+
import org.springframework.core.type.AnnotatedTypeMetadata;
2224

2325
/**
2426
* Configures {@link OtlpGrpcSpanExporter} for tracing.
@@ -39,9 +41,7 @@ public SpanExporter otelOtlpSpanExporter(ConfigProperties configProperties) {
3941

4042
static final class CustomCondition implements Condition {
4143
@Override
42-
public boolean matches(
43-
org.springframework.context.annotation.ConditionContext context,
44-
org.springframework.core.type.AnnotatedTypeMetadata metadata) {
44+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
4545
return ExporterConfigEvaluator.isExporterEnabled(
4646
context.getEnvironment(),
4747
"otel.exporter.otlp.enabled",

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/zipkin/ZipkinSpanExporterAutoConfiguration.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1616
import org.springframework.context.annotation.Bean;
1717
import org.springframework.context.annotation.Condition;
18+
import org.springframework.context.annotation.ConditionContext;
1819
import org.springframework.context.annotation.Conditional;
1920
import org.springframework.context.annotation.Configuration;
21+
import org.springframework.core.type.AnnotatedTypeMetadata;
2022

2123
/**
2224
* Configures {@link ZipkinSpanExporter} for tracing.
@@ -43,9 +45,7 @@ public ZipkinSpanExporter otelZipkinSpanExporter(ZipkinSpanExporterProperties pr
4345

4446
static final class CustomCondition implements Condition {
4547
@Override
46-
public boolean matches(
47-
org.springframework.context.annotation.ConditionContext context,
48-
org.springframework.core.type.AnnotatedTypeMetadata metadata) {
48+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
4949
return ExporterConfigEvaluator.isExporterEnabled(
5050
context.getEnvironment(),
5151
null,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.spring.autoconfigure.exporters.logging;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.opentelemetry.exporter.logging.SystemOutLogRecordExporter;
11+
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
12+
import org.junit.jupiter.api.DisplayName;
13+
import org.junit.jupiter.api.Test;
14+
import org.springframework.boot.autoconfigure.AutoConfigurations;
15+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
16+
17+
/** Spring Boot auto configuration test for {@link SystemOutLogRecordExporter}. */
18+
class SystemOutLogRecordExporterAutoConfigurationTest {
19+
20+
private final ApplicationContextRunner contextRunner =
21+
new ApplicationContextRunner()
22+
.withConfiguration(
23+
AutoConfigurations.of(
24+
OpenTelemetryAutoConfiguration.class,
25+
SystemOutLogRecordExporterAutoConfiguration.class));
26+
27+
@Test
28+
void loggingEnabledNew() {
29+
contextRunner
30+
.withPropertyValues("otel.logs.exporter=logging")
31+
.run(
32+
context ->
33+
assertThat(
34+
context.getBean(
35+
"otelSystemOutLogRecordExporter", SystemOutLogRecordExporter.class))
36+
.isNotNull());
37+
}
38+
39+
@Test
40+
@DisplayName("when exporters are ENABLED should initialize SystemOutLogRecordExporter bean")
41+
void loggingEnabled() {
42+
contextRunner
43+
.withPropertyValues("otel.exporter.logging.enabled=true")
44+
.run(
45+
context ->
46+
assertThat(
47+
context.getBean(
48+
"otelSystemOutLogRecordExporter", SystemOutLogRecordExporter.class))
49+
.isNotNull());
50+
}
51+
52+
@Test
53+
void loggingLogsEnabled() {
54+
contextRunner
55+
.withPropertyValues("otel.exporter.logging.logs.enabled=true")
56+
.run(
57+
context ->
58+
assertThat(
59+
context.getBean(
60+
"otelSystemOutLogRecordExporter", SystemOutLogRecordExporter.class))
61+
.isNotNull());
62+
}
63+
64+
@Test
65+
@DisplayName("when exporters are DISABLED should NOT initialize SystemOutLogRecordExporter bean")
66+
void loggingDisabled() {
67+
contextRunner
68+
.withPropertyValues("otel.exporter.logging.enabled=false")
69+
.run(
70+
context ->
71+
assertThat(context.containsBean("otelSystemOutLogRecordExporter")).isFalse());
72+
}
73+
74+
@Test
75+
@DisplayName("when exporters are DISABLED should NOT initialize SystemOutLogRecordExporter bean")
76+
void loggingLogsDisabled() {
77+
contextRunner
78+
.withPropertyValues("otel.exporter.logging.logs.enabled=false")
79+
.run(
80+
context ->
81+
assertThat(context.containsBean("otelSystemOutLogRecordExporter")).isFalse());
82+
}
83+
84+
@Test
85+
@DisplayName(
86+
"when exporter enabled property is MISSING should initialize SystemOutLogRecordExporter bean")
87+
void exporterPresentByDefault() {
88+
contextRunner.run(
89+
context -> assertThat(context.containsBean("otelSystemOutLogRecordExporter")).isFalse());
90+
}
91+
}

0 commit comments

Comments
 (0)