Skip to content

Commit 3131a8b

Browse files
committed
Simplify thread safe logic by moving to memoized Supplier
1 parent 2cedb34 commit 3131a8b

File tree

2 files changed

+23
-31
lines changed

2 files changed

+23
-31
lines changed

exporters/trace/src/main/java/com/google/cloud/opentelemetry/trace/NoopTraceExporter.java renamed to exporters/trace/src/main/java/com/google/cloud/opentelemetry/trace/NoopSpanExporter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@
2525
* A noop implementation of a {@link SpanExporter}. This class is implemented as a singleton and
2626
* return a successful result on all public methods without performing any action.
2727
*/
28-
class NoopTraceExporter implements SpanExporter {
28+
class NoopSpanExporter implements SpanExporter {
2929

30-
NoopTraceExporter() {
30+
NoopSpanExporter() {
3131
// prevent explicit public call to default constructor
3232
}
3333

3434
@Override
3535
public CompletableResultCode export(@Nonnull Collection<SpanData> spans) {
36-
return CompletableResultCode.ofSuccess();
36+
return CompletableResultCode.ofFailure();
3737
}
3838

3939
@Override

exporters/trace/src/main/java/com/google/cloud/opentelemetry/trace/TraceExporter.java

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,35 @@
1616
package com.google.cloud.opentelemetry.trace;
1717

1818
import com.google.cloud.ServiceOptions;
19+
import com.google.common.base.Suppliers;
1920
import io.opentelemetry.sdk.common.CompletableResultCode;
2021
import io.opentelemetry.sdk.trace.data.SpanData;
2122
import io.opentelemetry.sdk.trace.export.SpanExporter;
22-
import java.io.IOException;
23-
import java.util.Collection;
24-
import java.util.concurrent.atomic.AtomicReference;
25-
import javax.annotation.Nonnull;
2623
import org.slf4j.Logger;
2724
import org.slf4j.LoggerFactory;
2825

26+
import javax.annotation.Nonnull;
27+
import java.io.IOException;
28+
import java.util.Collection;
29+
import java.util.function.Supplier;
30+
2931
public class TraceExporter implements SpanExporter {
3032

3133
private static final Logger logger = LoggerFactory.getLogger(TraceExporter.class);
3234

33-
private final TraceConfiguration customTraceConfiguration;
34-
private final AtomicReference<SpanExporter> internalTraceExporter;
35+
private final Supplier<SpanExporter> internalTraceExporterSupplier;
3536

3637
private TraceExporter(TraceConfiguration configuration) {
37-
this.customTraceConfiguration = configuration;
38-
this.internalTraceExporter = new AtomicReference<>(null);
38+
this.internalTraceExporterSupplier =
39+
Suppliers.memoize(
40+
() -> {
41+
try {
42+
return InternalTraceExporter.createWithConfiguration(configuration);
43+
} catch (IOException e) {
44+
logger.warn("Unable to initialize TraceExporter. Export operation failed.", e);
45+
return new NoopSpanExporter();
46+
}
47+
});
3948
}
4049

4150
/**
@@ -75,33 +84,16 @@ public static SpanExporter createWithConfiguration(TraceConfiguration configurat
7584

7685
@Override
7786
public CompletableResultCode flush() {
78-
// We do no exporter buffering of spans, so we're always flushed.
79-
return CompletableResultCode.ofSuccess();
87+
return internalTraceExporterSupplier.get().flush();
8088
}
8189

8290
@Override
8391
public CompletableResultCode export(@Nonnull Collection<SpanData> spanDataList) {
84-
SpanExporter currentExporter = internalTraceExporter.get();
85-
if (currentExporter == null) {
86-
try {
87-
internalTraceExporter.compareAndSet(
88-
null, InternalTraceExporter.createWithConfiguration(this.customTraceConfiguration));
89-
currentExporter = internalTraceExporter.get();
90-
} catch (IOException e) {
91-
logger.warn("Unable to initialize TraceExporter. Export operation failed.", e);
92-
return CompletableResultCode.ofFailure();
93-
}
94-
}
95-
return currentExporter.export(spanDataList);
92+
return internalTraceExporterSupplier.get().export(spanDataList);
9693
}
9794

9895
@Override
9996
public CompletableResultCode shutdown() {
100-
SpanExporter currentExporter = internalTraceExporter.get();
101-
if (currentExporter != null) {
102-
return currentExporter.shutdown();
103-
} else {
104-
return CompletableResultCode.ofFailure();
105-
}
97+
return internalTraceExporterSupplier.get().shutdown();
10698
}
10799
}

0 commit comments

Comments
 (0)