Migrate Zipkin integration test from junit4 to junit5 + testcontainers (#3639)
This commit is contained in:
parent
226eeef708
commit
47d359475a
|
@ -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",
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue