|
9 | 9 | import static io.opentelemetry.exporter.zipkin.ZipkinTestUtil.zipkinSpanBuilder;
|
10 | 10 | import static org.assertj.core.api.Assertions.assertThat;
|
11 | 11 | import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
| 12 | +import static org.junit.jupiter.api.Assertions.assertTrue; |
12 | 13 | import static org.mockito.Mockito.doThrow;
|
13 | 14 | import static org.mockito.Mockito.verify;
|
14 | 15 | import static org.mockito.Mockito.when;
|
15 | 16 |
|
16 | 17 | import io.github.netmikey.logunit.api.LogCapturer;
|
| 18 | +import io.opentelemetry.api.internal.InstrumentationUtil; |
17 | 19 | import io.opentelemetry.api.metrics.MeterProvider;
|
| 20 | +import io.opentelemetry.context.Context; |
18 | 21 | import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
|
19 | 22 | import io.opentelemetry.sdk.common.CompletableResultCode;
|
20 | 23 | import io.opentelemetry.sdk.testing.trace.TestSpanData;
|
21 | 24 | import java.io.IOException;
|
22 | 25 | import java.net.InetAddress;
|
23 | 26 | import java.time.Duration;
|
24 | 27 | import java.util.Collections;
|
| 28 | +import java.util.List; |
25 | 29 | import java.util.concurrent.TimeUnit;
|
| 30 | +import java.util.concurrent.atomic.AtomicBoolean; |
26 | 31 | import org.junit.jupiter.api.Test;
|
27 | 32 | import org.junit.jupiter.api.extension.ExtendWith;
|
28 | 33 | import org.junit.jupiter.api.extension.RegisterExtension;
|
@@ -244,4 +249,57 @@ void stringRepresentation() {
|
244 | 249 | "ZipkinSpanExporter{endpoint=http://zipkin:9411/api/v2/spans, compressionEnabled=false, readTimeoutMillis=15000}");
|
245 | 250 | }
|
246 | 251 | }
|
| 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 | + } |
247 | 305 | }
|
0 commit comments