Skip to content

Commit b03ec3a

Browse files
authored
Add log support to junit extensions (#5966)
1 parent efcce14 commit b03ec3a

File tree

5 files changed

+149
-5
lines changed

5 files changed

+149
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
Comparing source compatibility of against
2-
No changes.
2+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule (not serializable)
3+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
4+
+++ NEW METHOD: PUBLIC(+) void clearLogRecords()
5+
+++ NEW METHOD: PUBLIC(+) java.util.List<io.opentelemetry.sdk.logs.data.LogRecordData> getLogRecords()
6+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension (not serializable)
7+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
8+
+++ NEW METHOD: PUBLIC(+) void clearLogRecords()
9+
+++ NEW METHOD: PUBLIC(+) java.util.List<io.opentelemetry.sdk.logs.data.LogRecordData> getLogRecords()

sdk/testing/src/main/java/io/opentelemetry/sdk/testing/junit4/OpenTelemetryRule.java

+37-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@
1010
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
1111
import io.opentelemetry.context.propagation.ContextPropagators;
1212
import io.opentelemetry.sdk.OpenTelemetrySdk;
13+
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
14+
import io.opentelemetry.sdk.logs.data.LogRecordData;
15+
import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor;
1316
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
1417
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
1518
import io.opentelemetry.sdk.metrics.data.MetricData;
1619
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
20+
import io.opentelemetry.sdk.testing.exporter.InMemoryLogRecordExporter;
1721
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
1822
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
1923
import io.opentelemetry.sdk.trace.SdkTracerProvider;
@@ -71,27 +75,38 @@ public static OpenTelemetryRule create() {
7175
SdkMeterProvider meterProvider =
7276
SdkMeterProvider.builder().registerMetricReader(metricReader).build();
7377

78+
InMemoryLogRecordExporter logRecordExporter = InMemoryLogRecordExporter.create();
79+
80+
SdkLoggerProvider loggerProvider =
81+
SdkLoggerProvider.builder()
82+
.addLogRecordProcessor(SimpleLogRecordProcessor.create(logRecordExporter))
83+
.build();
84+
7485
OpenTelemetrySdk openTelemetry =
7586
OpenTelemetrySdk.builder()
7687
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
7788
.setTracerProvider(tracerProvider)
7889
.setMeterProvider(meterProvider)
90+
.setLoggerProvider(loggerProvider)
7991
.build();
8092

81-
return new OpenTelemetryRule(openTelemetry, spanExporter, metricReader);
93+
return new OpenTelemetryRule(openTelemetry, spanExporter, metricReader, logRecordExporter);
8294
}
8395

8496
private final OpenTelemetrySdk openTelemetry;
8597
private final InMemorySpanExporter spanExporter;
8698
private final InMemoryMetricReader metricReader;
99+
private final InMemoryLogRecordExporter logRecordExporter;
87100

88101
private OpenTelemetryRule(
89102
OpenTelemetrySdk openTelemetry,
90103
InMemorySpanExporter spanExporter,
91-
InMemoryMetricReader metricReader) {
104+
InMemoryMetricReader metricReader,
105+
InMemoryLogRecordExporter logRecordExporter) {
92106
this.openTelemetry = openTelemetry;
93107
this.spanExporter = spanExporter;
94108
this.metricReader = metricReader;
109+
this.logRecordExporter = logRecordExporter;
95110
}
96111

97112
/** Returns the {@link OpenTelemetrySdk} created by this extension. */
@@ -113,6 +128,15 @@ public List<MetricData> getMetrics() {
113128
return new ArrayList<>(metricReader.collectAllMetrics());
114129
}
115130

131+
/**
132+
* Returns all the exported {@link LogRecordData} so far.
133+
*
134+
* @since 1.32.0
135+
*/
136+
public List<LogRecordData> getLogRecords() {
137+
return new ArrayList<>(logRecordExporter.getFinishedLogRecordItems());
138+
}
139+
116140
/**
117141
* Clears the collected exported {@link SpanData}. Consider making your test smaller instead of
118142
* manually clearing state using this method.
@@ -130,12 +154,23 @@ public void clearMetrics() {
130154
SdkMeterProviderUtil.resetForTest(openTelemetry.getSdkMeterProvider());
131155
}
132156

157+
/**
158+
* Clears the collected exported {@link LogRecordData}. Consider making your test smaller instead
159+
* of manually clearing state using this method.
160+
*
161+
* @since 1.32.0
162+
*/
163+
public void clearLogRecords() {
164+
logRecordExporter.reset();
165+
}
166+
133167
@Override
134168
protected void before() {
135169
GlobalOpenTelemetry.resetForTest();
136170
GlobalOpenTelemetry.set(openTelemetry);
137171
clearSpans();
138172
clearMetrics();
173+
clearLogRecords();
139174
}
140175

141176
@Override

sdk/testing/src/main/java/io/opentelemetry/sdk/testing/junit5/OpenTelemetryExtension.java

+37-2
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@
1212
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
1313
import io.opentelemetry.context.propagation.ContextPropagators;
1414
import io.opentelemetry.sdk.OpenTelemetrySdk;
15+
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
16+
import io.opentelemetry.sdk.logs.data.LogRecordData;
17+
import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor;
1518
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
1619
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
1720
import io.opentelemetry.sdk.metrics.data.MetricData;
1821
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
1922
import io.opentelemetry.sdk.testing.assertj.TracesAssert;
23+
import io.opentelemetry.sdk.testing.exporter.InMemoryLogRecordExporter;
2024
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
2125
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
2226
import io.opentelemetry.sdk.trace.SdkTracerProvider;
@@ -73,27 +77,38 @@ public static OpenTelemetryExtension create() {
7377
SdkMeterProvider meterProvider =
7478
SdkMeterProvider.builder().registerMetricReader(metricReader).build();
7579

80+
InMemoryLogRecordExporter logRecordExporter = InMemoryLogRecordExporter.create();
81+
82+
SdkLoggerProvider loggerProvider =
83+
SdkLoggerProvider.builder()
84+
.addLogRecordProcessor(SimpleLogRecordProcessor.create(logRecordExporter))
85+
.build();
86+
7687
OpenTelemetrySdk openTelemetry =
7788
OpenTelemetrySdk.builder()
7889
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
7990
.setTracerProvider(tracerProvider)
8091
.setMeterProvider(meterProvider)
92+
.setLoggerProvider(loggerProvider)
8193
.build();
8294

83-
return new OpenTelemetryExtension(openTelemetry, spanExporter, metricReader);
95+
return new OpenTelemetryExtension(openTelemetry, spanExporter, metricReader, logRecordExporter);
8496
}
8597

8698
private final OpenTelemetrySdk openTelemetry;
8799
private final InMemorySpanExporter spanExporter;
88100
private final InMemoryMetricReader metricReader;
101+
private final InMemoryLogRecordExporter logRecordExporter;
89102

90103
private OpenTelemetryExtension(
91104
OpenTelemetrySdk openTelemetry,
92105
InMemorySpanExporter spanExporter,
93-
InMemoryMetricReader metricReader) {
106+
InMemoryMetricReader metricReader,
107+
InMemoryLogRecordExporter logRecordExporter) {
94108
this.openTelemetry = openTelemetry;
95109
this.spanExporter = spanExporter;
96110
this.metricReader = metricReader;
111+
this.logRecordExporter = logRecordExporter;
97112
}
98113

99114
/** Returns the {@link OpenTelemetrySdk} created by this extension. */
@@ -115,6 +130,15 @@ public List<MetricData> getMetrics() {
115130
return new ArrayList<>(metricReader.collectAllMetrics());
116131
}
117132

133+
/**
134+
* Returns all the exported {@link LogRecordData} so far.
135+
*
136+
* @since 1.32.0
137+
*/
138+
public List<LogRecordData> getLogRecords() {
139+
return new ArrayList<>(logRecordExporter.getFinishedLogRecordItems());
140+
}
141+
118142
/**
119143
* Returns a {@link TracesAssert} for asserting on the currently exported traces. This method
120144
* requires AssertJ to be on the classpath.
@@ -140,10 +164,21 @@ public void clearMetrics() {
140164
SdkMeterProviderUtil.resetForTest(openTelemetry.getSdkMeterProvider());
141165
}
142166

167+
/**
168+
* Clears the collected exported {@link LogRecordData}. Consider making your test smaller instead
169+
* of manually clearing state using this method.
170+
*
171+
* @since 1.32.0
172+
*/
173+
public void clearLogRecords() {
174+
logRecordExporter.reset();
175+
}
176+
143177
@Override
144178
public void beforeEach(ExtensionContext context) {
145179
clearSpans();
146180
clearMetrics();
181+
clearLogRecords();
147182
}
148183

149184
@Override

sdk/testing/src/test/java/io/opentelemetry/sdk/testing/junit4/OpenTelemetryRuleTest.java

+34
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static org.assertj.core.api.Assertions.assertThat;
99

10+
import io.opentelemetry.api.logs.Logger;
1011
import io.opentelemetry.api.metrics.LongCounter;
1112
import io.opentelemetry.api.metrics.Meter;
1213
import io.opentelemetry.api.trace.Tracer;
@@ -21,11 +22,13 @@ public class OpenTelemetryRuleTest {
2122

2223
private Tracer tracer;
2324
private Meter meter;
25+
private Logger logger;
2426

2527
@Before
2628
public void setup() {
2729
tracer = otelTesting.getOpenTelemetry().getTracer("test");
2830
meter = otelTesting.getOpenTelemetry().getMeter("test");
31+
logger = otelTesting.getOpenTelemetry().getLogsBridge().get("test");
2932
}
3033

3134
@Test
@@ -83,4 +86,35 @@ public void getMetricsAgain() {
8386
.hasLongSumSatisfying(
8487
sum -> sum.hasPointsSatisfying(point -> point.hasValue(1))));
8588
}
89+
90+
@Test
91+
public void getLogRecords() {
92+
logger.logRecordBuilder().setBody("body").emit();
93+
94+
assertThat(otelTesting.getLogRecords())
95+
.singleElement()
96+
.satisfies(
97+
logRecordData -> assertThat(logRecordData.getBody().asString()).isEqualTo("body"));
98+
// Logs cleared between tests, not when retrieving
99+
assertThat(otelTesting.getLogRecords())
100+
.singleElement()
101+
.satisfies(
102+
logRecordData -> assertThat(logRecordData.getBody().asString()).isEqualTo("body"));
103+
}
104+
105+
// We have two tests to verify logs get cleared up between tests.
106+
@Test
107+
public void getLogRecordsAgain() {
108+
logger.logRecordBuilder().setBody("body").emit();
109+
110+
assertThat(otelTesting.getLogRecords())
111+
.singleElement()
112+
.satisfies(
113+
logRecordData -> assertThat(logRecordData.getBody().asString()).isEqualTo("body"));
114+
// Logs cleared between tests, not when retrieving
115+
assertThat(otelTesting.getLogRecords())
116+
.singleElement()
117+
.satisfies(
118+
logRecordData -> assertThat(logRecordData.getBody().asString()).isEqualTo("body"));
119+
}
86120
}

sdk/testing/src/test/java/io/opentelemetry/sdk/testing/junit5/OpenTelemetryExtensionTest.java

+33
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import io.opentelemetry.api.GlobalOpenTelemetry;
1212
import io.opentelemetry.api.OpenTelemetry;
13+
import io.opentelemetry.api.logs.Logger;
1314
import io.opentelemetry.api.metrics.LongCounter;
1415
import io.opentelemetry.api.metrics.Meter;
1516
import io.opentelemetry.api.trace.Span;
@@ -30,6 +31,7 @@ class OpenTelemetryExtensionTest {
3031

3132
private final Tracer tracer = otelTesting.getOpenTelemetry().getTracer("test");
3233
private final Meter meter = otelTesting.getOpenTelemetry().getMeter("test");
34+
private final Logger logger = otelTesting.getOpenTelemetry().getLogsBridge().get("test");
3335

3436
@Test
3537
public void getSpans() {
@@ -175,6 +177,37 @@ void getMetricsAgain() {
175177
sum -> sum.hasPointsSatisfying(point -> point.hasValue(1))));
176178
}
177179

180+
@Test
181+
public void getLogRecords() {
182+
logger.logRecordBuilder().setBody("body").emit();
183+
184+
assertThat(otelTesting.getLogRecords())
185+
.singleElement()
186+
.satisfies(
187+
logRecordData -> assertThat(logRecordData.getBody().asString()).isEqualTo("body"));
188+
// Logs cleared between tests, not when retrieving
189+
assertThat(otelTesting.getLogRecords())
190+
.singleElement()
191+
.satisfies(
192+
logRecordData -> assertThat(logRecordData.getBody().asString()).isEqualTo("body"));
193+
}
194+
195+
// We have two tests to verify spans get cleared up between tests.
196+
@Test
197+
public void getLogRecordsAgain() {
198+
logger.logRecordBuilder().setBody("body").emit();
199+
200+
assertThat(otelTesting.getLogRecords())
201+
.singleElement()
202+
.satisfies(
203+
logRecordData -> assertThat(logRecordData.getBody().asString()).isEqualTo("body"));
204+
// Logs cleared between tests, not when retrieving
205+
assertThat(otelTesting.getLogRecords())
206+
.singleElement()
207+
.satisfies(
208+
logRecordData -> assertThat(logRecordData.getBody().asString()).isEqualTo("body"));
209+
}
210+
178211
@Test
179212
void afterAll() {
180213
// Use a different instance of OpenTelemetryExtension to avoid interfering with other tests

0 commit comments

Comments
 (0)