Skip to content

Commit 46e05d6

Browse files
committed
supress zipkin exporters instrumentations
1 parent ad120a5 commit 46e05d6

File tree

2 files changed

+73
-9
lines changed

2 files changed

+73
-9
lines changed

exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporter.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.exporter.zipkin;
77

8+
import io.opentelemetry.api.internal.InstrumentationUtil;
89
import io.opentelemetry.api.metrics.MeterProvider;
910
import io.opentelemetry.exporter.internal.ExporterMetrics;
1011
import io.opentelemetry.sdk.common.CompletableResultCode;
@@ -75,15 +76,20 @@ public CompletableResultCode export(Collection<SpanData> spanDataList) {
7576
encodedSpans.add(encoder.encode(zipkinSpan));
7677
}
7778

78-
try {
79-
sender.send(encodedSpans);
80-
exporterMetrics.addSuccess(numItems);
81-
return CompletableResultCode.ofSuccess();
82-
} catch (IOException | RuntimeException t) {
83-
exporterMetrics.addFailed(numItems);
84-
logger.log(Level.WARNING, "Failed to export spans", t);
85-
return CompletableResultCode.ofFailure();
86-
}
79+
CompletableResultCode resultCode = new CompletableResultCode();
80+
InstrumentationUtil.suppressInstrumentation(
81+
() -> {
82+
try {
83+
sender.send(encodedSpans);
84+
exporterMetrics.addSuccess(numItems);
85+
resultCode.succeed();
86+
} catch (IOException | RuntimeException e) {
87+
exporterMetrics.addFailed(numItems);
88+
logger.log(Level.WARNING, "Failed to export spans", e);
89+
resultCode.fail();
90+
}
91+
});
92+
return resultCode;
8793
}
8894

8995
@Override

exporters/zipkin/src/test/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporterTest.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,25 @@
99
import static io.opentelemetry.exporter.zipkin.ZipkinTestUtil.zipkinSpanBuilder;
1010
import static org.assertj.core.api.Assertions.assertThat;
1111
import static org.assertj.core.api.Assertions.assertThatThrownBy;
12+
import static org.junit.jupiter.api.Assertions.assertTrue;
1213
import static org.mockito.Mockito.doThrow;
1314
import static org.mockito.Mockito.verify;
1415
import static org.mockito.Mockito.when;
1516

1617
import io.github.netmikey.logunit.api.LogCapturer;
18+
import io.opentelemetry.api.internal.InstrumentationUtil;
1719
import io.opentelemetry.api.metrics.MeterProvider;
20+
import io.opentelemetry.context.Context;
1821
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
1922
import io.opentelemetry.sdk.common.CompletableResultCode;
2023
import io.opentelemetry.sdk.testing.trace.TestSpanData;
2124
import java.io.IOException;
2225
import java.net.InetAddress;
2326
import java.time.Duration;
2427
import java.util.Collections;
28+
import java.util.List;
2529
import java.util.concurrent.TimeUnit;
30+
import java.util.concurrent.atomic.AtomicBoolean;
2631
import org.junit.jupiter.api.Test;
2732
import org.junit.jupiter.api.extension.ExtendWith;
2833
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -244,4 +249,57 @@ void stringRepresentation() {
244249
"ZipkinSpanExporter{endpoint=http://zipkin:9411/api/v2/spans, compressionEnabled=false, readTimeoutMillis=15000}");
245250
}
246251
}
252+
253+
@Test
254+
void suppressInstrumentation() {
255+
TestSpanData testSpanData = spanBuilder().build();
256+
257+
SuppressCatchingSender suppressCatchingSender = new SuppressCatchingSender(Encoding.JSON);
258+
ZipkinSpanExporter zipkinSpanExporter =
259+
new ZipkinSpanExporter(
260+
new ZipkinSpanExporterBuilder(),
261+
mockEncoder,
262+
suppressCatchingSender,
263+
MeterProvider::noop,
264+
mockTransformer);
265+
266+
byte[] someBytes = new byte[0];
267+
Span zipkinSpan =
268+
zipkinSpanBuilder(Span.Kind.SERVER, localIp)
269+
.putTag(OtelToZipkinSpanTransformer.OTEL_STATUS_CODE, "OK")
270+
.build();
271+
when(mockTransformer.generateSpan(testSpanData)).thenReturn(zipkinSpan);
272+
when(mockEncoder.encode(zipkinSpan)).thenReturn(someBytes);
273+
274+
zipkinSpanExporter.export(Collections.singleton(testSpanData));
275+
276+
// Instrumentation should be suppressed on send, to avoid incidental spans related to span
277+
// export.
278+
assertTrue(suppressCatchingSender.sent.get());
279+
assertTrue(suppressCatchingSender.suppressed.get());
280+
}
281+
282+
static class SuppressCatchingSender extends BytesMessageSender.Base {
283+
284+
final AtomicBoolean sent = new AtomicBoolean();
285+
final AtomicBoolean suppressed = new AtomicBoolean();
286+
287+
protected SuppressCatchingSender(Encoding encoding) {
288+
super(encoding);
289+
}
290+
291+
@Override
292+
public int messageMaxBytes() {
293+
return 1024;
294+
}
295+
296+
@Override
297+
public void send(List<byte[]> list) throws IOException {
298+
sent.set(true);
299+
suppressed.set(InstrumentationUtil.shouldSuppressInstrumentation(Context.current()));
300+
}
301+
302+
@Override
303+
public void close() throws IOException {}
304+
}
247305
}

0 commit comments

Comments
 (0)