Migrate Zipkin integration test from junit4 to junit5 + testcontainers (#3639)

This commit is contained in:
Anuraag Agrawal 2021-09-22 08:31:24 +09:00 committed by GitHub
parent 226eeef708
commit 47d359475a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 59 additions and 43 deletions

View File

@ -85,7 +85,6 @@ val DEPENDENCIES = listOf(
"io.github.netmikey.logunit:logunit-jul:1.1.0",
"io.jaegertracing:jaeger-client:1.6.0",
"io.opentracing:opentracing-api:0.33.0",
"io.zipkin.zipkin2:zipkin-junit:2.23.4",
"junit:junit:4.13.2",
"nl.jqno.equalsverifier:equalsverifier:3.7.1",
"org.assertj:assertj-core:3.20.2",

View File

@ -9,19 +9,16 @@ description = "OpenTelemetry - Zipkin Exporter"
otelJava.moduleName.set("io.opentelemetry.exporter.zipkin")
dependencies {
compileOnly("com.google.auto.value:auto-value")
api(project(":sdk:all"))
api("io.zipkin.reporter2:zipkin-reporter")
annotationProcessor("com.google.auto.value:auto-value")
implementation(project(":semconv"))
implementation("io.zipkin.reporter2:zipkin-sender-okhttp3")
testImplementation(project(":sdk:testing"))
testImplementation("io.zipkin.zipkin2:zipkin-junit")
testImplementation("com.linecorp.armeria:armeria")
testImplementation("org.testcontainers:junit-jupiter")
}

View File

@ -7,6 +7,9 @@ package io.opentelemetry.exporter.zipkin;
import static org.assertj.core.api.Assertions.assertThat;
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.SpanKind;
@ -15,6 +18,7 @@ import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.trace.TestSpanData;
import io.opentelemetry.sdk.trace.IdGenerator;
import io.opentelemetry.sdk.trace.data.EventData;
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.sdk.trace.data.StatusData;
@ -24,22 +28,24 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.Rule;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import zipkin2.Endpoint;
import zipkin2.Span;
import zipkin2.codec.Encoding;
import zipkin2.codec.SpanBytesDecoder;
import zipkin2.codec.SpanBytesEncoder;
import zipkin2.junit.ZipkinRule;
import zipkin2.reporter.okhttp3.OkHttpSender;
/**
* Tests which use Zipkin's {@link ZipkinRule} to verify that the {@link ZipkinSpanExporter} can
* send spans via HTTP to Zipkin's API using supported encodings.
*/
public class ZipkinSpanExporterEndToEndHttpTest {
@Testcontainers(disabledWithoutDocker = true)
class ZipkinSpanExporterEndToEndHttpTest {
private static final WebClient client = WebClient.of();
private static final int ZIPKIN_API_PORT = 9411;
private static final String TRACE_ID = "d239036e7d5cec116b562147388b35bf";
private static final String SPAN_ID = "9cc1e3049173be09";
private static final String PARENT_SPAN_ID = "8b03ab423da481c5";
private static final String SPAN_NAME = "Recv.helloworld.Greeter.SayHello";
@ -58,53 +64,54 @@ public class ZipkinSpanExporterEndToEndHttpTest {
private static final String ENDPOINT_V2_SPANS = "/api/v2/spans";
private static final String SERVICE_NAME = "myService";
@Rule public ZipkinRule zipkin = new ZipkinRule();
@Container
public static GenericContainer<?> zipkinContainer =
new GenericContainer<>("ghcr.io/openzipkin/zipkin:2.23")
.withExposedPorts(ZIPKIN_API_PORT)
.waitingFor(Wait.forHttp("/health").forPort(ZIPKIN_API_PORT));
@Test
public void testExportWithDefaultEncoding() {
void testExportWithDefaultEncoding() {
ZipkinSpanExporter exporter =
ZipkinSpanExporter.builder().setEndpoint(zipkin.httpUrl() + ENDPOINT_V2_SPANS).build();
ZipkinSpanExporter.builder().setEndpoint(zipkinUrl(ENDPOINT_V2_SPANS)).build();
exportAndVerify(exporter);
}
@Test
public void testExportAsProtobuf() {
void testExportAsProtobuf() {
ZipkinSpanExporter exporter =
buildZipkinExporter(
zipkin.httpUrl() + ENDPOINT_V2_SPANS, Encoding.PROTO3, SpanBytesEncoder.PROTO3);
buildZipkinExporter(zipkinUrl(ENDPOINT_V2_SPANS), Encoding.PROTO3, SpanBytesEncoder.PROTO3);
exportAndVerify(exporter);
}
@Test
public void testExportAsThrift() {
void testExportAsThrift() {
@SuppressWarnings("deprecation") // we have to use the deprecated thrift encoding to test it
ZipkinSpanExporter exporter =
buildZipkinExporter(
zipkin.httpUrl() + ENDPOINT_V1_SPANS, Encoding.THRIFT, SpanBytesEncoder.THRIFT);
buildZipkinExporter(zipkinUrl(ENDPOINT_V1_SPANS), Encoding.THRIFT, SpanBytesEncoder.THRIFT);
exportAndVerify(exporter);
}
@Test
public void testExportAsJsonV1() {
void testExportAsJsonV1() {
ZipkinSpanExporter exporter =
buildZipkinExporter(
zipkin.httpUrl() + ENDPOINT_V1_SPANS, Encoding.JSON, SpanBytesEncoder.JSON_V1);
buildZipkinExporter(zipkinUrl(ENDPOINT_V1_SPANS), Encoding.JSON, SpanBytesEncoder.JSON_V1);
exportAndVerify(exporter);
}
@Test
public void testExportFailedAsWrongEncoderUsed() {
void testExportFailedAsWrongEncoderUsed() {
ZipkinSpanExporter zipkinSpanExporter =
buildZipkinExporter(
zipkin.httpUrl() + ENDPOINT_V2_SPANS, Encoding.JSON, SpanBytesEncoder.PROTO3);
buildZipkinExporter(zipkinUrl(ENDPOINT_V2_SPANS), Encoding.JSON, SpanBytesEncoder.PROTO3);
SpanData spanData = buildStandardSpan().build();
String traceId = IdGenerator.random().generateTraceId();
SpanData spanData = buildStandardSpan(traceId).build();
CompletableResultCode resultCode = zipkinSpanExporter.export(Collections.singleton(spanData));
assertThat(resultCode.isSuccess()).isFalse();
List<Span> zipkinSpans = zipkin.getTrace(TRACE_ID);
assertThat(zipkinSpans).isNull();
List<Span> zipkinSpans = getTrace(traceId);
assertThat(zipkinSpans).isEmpty();
}
private static ZipkinSpanExporter buildZipkinExporter(
@ -119,28 +126,28 @@ public class ZipkinSpanExporterEndToEndHttpTest {
* Exports a span, verify that it was received by Zipkin, and check that the span stored by Zipkin
* matches what was sent.
*/
private void exportAndVerify(ZipkinSpanExporter zipkinSpanExporter) {
SpanData spanData = buildStandardSpan().build();
private static void exportAndVerify(ZipkinSpanExporter zipkinSpanExporter) {
String traceId = IdGenerator.random().generateTraceId();
SpanData spanData = buildStandardSpan(traceId).build();
CompletableResultCode resultCode = zipkinSpanExporter.export(Collections.singleton(spanData));
resultCode.join(10, TimeUnit.SECONDS);
assertThat(resultCode.isSuccess()).isTrue();
List<Span> zipkinSpans = zipkin.getTrace(TRACE_ID);
List<Span> zipkinSpans = getTrace(traceId);
assertThat(zipkinSpans).isNotNull();
assertThat(zipkinSpans.size()).isEqualTo(1);
assertThat(zipkinSpans.get(0))
.isEqualTo(buildZipkinSpan(zipkinSpanExporter.getLocalAddressForTest()));
.isEqualTo(buildZipkinSpan(zipkinSpanExporter.getLocalAddressForTest(), traceId));
}
private static TestSpanData.Builder buildStandardSpan() {
private static TestSpanData.Builder buildStandardSpan(String traceId) {
return TestSpanData.builder()
.setSpanContext(
SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault()))
SpanContext.create(traceId, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault()))
.setParentSpanContext(
SpanContext.create(
TRACE_ID, PARENT_SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()))
traceId, PARENT_SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()))
.setStatus(StatusData.ok())
.setKind(SpanKind.SERVER)
.setName(SPAN_NAME)
@ -155,9 +162,9 @@ public class ZipkinSpanExporterEndToEndHttpTest {
.setResource(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, SERVICE_NAME)));
}
private static Span buildZipkinSpan(InetAddress localAddress) {
private static Span buildZipkinSpan(InetAddress localAddress, String traceId) {
return Span.newBuilder()
.traceId(TRACE_ID)
.traceId(traceId)
.parentId(PARENT_SPAN_ID)
.id(SPAN_ID)
.kind(Span.Kind.SERVER)
@ -170,4 +177,17 @@ public class ZipkinSpanExporterEndToEndHttpTest {
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build();
}
private static List<Span> getTrace(String traceId) {
AggregatedHttpResponse response =
client.get(zipkinUrl("/api/v2/trace/" + traceId)).aggregate().join();
if (response.status().equals(HttpStatus.NOT_FOUND)) {
return Collections.emptyList();
}
return SpanBytesDecoder.JSON_V2.decodeList(response.content().array());
}
private static String zipkinUrl(String endpoint) {
return "http://localhost:" + zipkinContainer.getMappedPort(ZIPKIN_API_PORT) + endpoint;
}
}