aboutsummaryrefslogtreecommitdiffstats
path: root/exporters
diff options
context:
space:
mode:
authorsebright <sebright@google.com>2018-03-26 11:28:06 -0700
committerGitHub <noreply@github.com>2018-03-26 11:28:06 -0700
commit7d84c67f9eed7367fc9a1eb58b42bd9f0d1707e2 (patch)
treeb7438f0784dacdab86033c25accf498b8ce95b89 /exporters
parent93c9c5bd716c155ed98eddc1af6489e2e2c9e641 (diff)
parent6c9f7563e89631ecfae796ab4bdf2ee9c6085a26 (diff)
downloadplatform_external_opencensus-java-7d84c67f9eed7367fc9a1eb58b42bd9f0d1707e2.tar.gz
platform_external_opencensus-java-7d84c67f9eed7367fc9a1eb58b42bd9f0d1707e2.tar.bz2
platform_external_opencensus-java-7d84c67f9eed7367fc9a1eb58b42bd9f0d1707e2.zip
Merge pull request #1085 from marccarre/issues/1066-more-robust-jaeger-integration-test
More robust integration test for Jaeger exporter.
Diffstat (limited to 'exporters')
-rw-r--r--exporters/trace/jaeger/src/test/java/io/opencensus/exporter/trace/jaeger/JaegerExporterHandlerIntegrationTest.java89
1 files changed, 66 insertions, 23 deletions
diff --git a/exporters/trace/jaeger/src/test/java/io/opencensus/exporter/trace/jaeger/JaegerExporterHandlerIntegrationTest.java b/exporters/trace/jaeger/src/test/java/io/opencensus/exporter/trace/jaeger/JaegerExporterHandlerIntegrationTest.java
index 9fc0b8c1..1ebf9327 100644
--- a/exporters/trace/jaeger/src/test/java/io/opencensus/exporter/trace/jaeger/JaegerExporterHandlerIntegrationTest.java
+++ b/exporters/trace/jaeger/src/test/java/io/opencensus/exporter/trace/jaeger/JaegerExporterHandlerIntegrationTest.java
@@ -30,6 +30,7 @@ import static org.junit.Assume.assumeThat;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
+import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.gson.GsonBuilder;
@@ -45,6 +46,8 @@ import io.opencensus.trace.Tracer;
import io.opencensus.trace.Tracing;
import io.opencensus.trace.samplers.Samplers;
import java.io.IOException;
+import java.net.ConnectException;
+import java.net.SocketException;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -52,6 +55,7 @@ import org.junit.Test;
public class JaegerExporterHandlerIntegrationTest {
private static final String JAEGER_HOST = "127.0.0.1";
+ private static final int OK = 200;
private static final String SERVICE_NAME = "test";
private static final String SPAN_NAME = "my.org/ProcessVideo";
private static final String START_PROCESSING_VIDEO = "Start processing video.";
@@ -61,6 +65,8 @@ public class JaegerExporterHandlerIntegrationTest {
Logger.getLogger(JaegerExporterHandlerIntegrationTest.class.getName());
private static final Tracer tracer = Tracing.getTracer();
+ private HttpRequestFactory httpRequestFactory = new NetHttpTransport().createRequestFactory();
+
@Test(timeout = 30000)
public void exportToJaeger() throws InterruptedException, IOException {
assumeThat("docker is installed and running", isDockerInstalledAndRunning(), is(true));
@@ -72,9 +78,8 @@ public class JaegerExporterHandlerIntegrationTest {
+ "-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp "
+ "-p6832:6832/udp -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 "
+ "jaegertracing/all-in-one:1.2.0");
- long timeWaitingForJaegerToStart = 1000L;
- Thread.sleep(timeWaitingForJaegerToStart);
- final long startTime = currentTimeMillis();
+ waitForJaegerToStart(format("http://%s:16686", JAEGER_HOST));
+ final long startTimeInMillis = currentTimeMillis();
try {
SpanBuilder spanBuilder =
@@ -82,11 +87,12 @@ public class JaegerExporterHandlerIntegrationTest {
JaegerTraceExporter.createAndRegister(
format("http://%s:14268/api/traces", JAEGER_HOST), SERVICE_NAME);
+ final int spanDurationInMillis = new Random().nextInt(10) + 1;
+
final Scope scopedSpan = spanBuilder.startScopedSpan();
try {
tracer.getCurrentSpan().addAnnotation(START_PROCESSING_VIDEO);
- // Sleep for [0,10] milliseconds to fake work.
- Thread.sleep(new Random().nextInt(10) + 1);
+ Thread.sleep(spanDurationInMillis); // Fake work.
tracer.getCurrentSpan().putAttribute("foo", AttributeValue.stringAttributeValue("bar"));
tracer.getCurrentSpan().addAnnotation(FINISHED_PROCESSING_VIDEO);
} catch (Exception e) {
@@ -99,23 +105,21 @@ public class JaegerExporterHandlerIntegrationTest {
logger.info("Wait longer than the reporting duration...");
// Wait for a duration longer than reporting duration (5s) to ensure spans are exported.
- long timeWaitingForSpansToBeExported = 5100L;
- Thread.sleep(timeWaitingForSpansToBeExported);
+ long timeWaitingForSpansToBeExportedInMillis = 5100L;
+ Thread.sleep(timeWaitingForSpansToBeExportedInMillis);
JaegerTraceExporter.unregister();
- final long endTime = currentTimeMillis();
+ final long endTimeInMillis = currentTimeMillis();
// Get traces recorded by Jaeger:
final HttpRequest request =
- new NetHttpTransport()
- .createRequestFactory()
- .buildGetRequest(
- new GenericUrl(
- format(
- "http://%s:16686/api/traces?end=%d&limit=20&lookback=1m&maxDuration&minDuration&service=%s",
- JAEGER_HOST, MILLISECONDS.toMicros(currentTimeMillis()), SERVICE_NAME)));
+ httpRequestFactory.buildGetRequest(
+ new GenericUrl(
+ format(
+ "http://%s:16686/api/traces?end=%d&limit=20&lookback=1m&maxDuration&minDuration&service=%s",
+ JAEGER_HOST, MILLISECONDS.toMicros(currentTimeMillis()), SERVICE_NAME)));
final HttpResponse response = request.execute();
final String body = response.parseAsString();
- assertThat("Response was: " + body, response.getStatusCode(), is(200));
+ assertThat("Response was: " + body, response.getStatusCode(), is(OK));
final JsonObject result = new JsonParser().parse(body).getAsJsonObject();
// Pretty-print for debugging purposes:
@@ -146,12 +150,19 @@ public class JaegerExporterHandlerIntegrationTest {
assertThat(span.get("references").getAsJsonArray().size(), is(0));
assertThat(
span.get("startTime").getAsLong(),
- is(greaterThanOrEqualTo(MILLISECONDS.toMicros(startTime))));
+ is(greaterThanOrEqualTo(MILLISECONDS.toMicros(startTimeInMillis))));
+ assertThat(
+ span.get("startTime").getAsLong(),
+ is(lessThanOrEqualTo(MILLISECONDS.toMicros(endTimeInMillis))));
assertThat(
- span.get("startTime").getAsLong(), is(lessThanOrEqualTo(MILLISECONDS.toMicros(endTime))));
+ span.get("duration").getAsLong(),
+ is(greaterThanOrEqualTo(MILLISECONDS.toMicros(spanDurationInMillis))));
assertThat(
span.get("duration").getAsLong(),
- is(greaterThanOrEqualTo(timeWaitingForJaegerToStart + timeWaitingForSpansToBeExported)));
+ is(
+ lessThanOrEqualTo(
+ MILLISECONDS.toMicros(
+ spanDurationInMillis + timeWaitingForSpansToBeExportedInMillis))));
final JsonArray tags = span.get("tags").getAsJsonArray();
assertThat(tags.size(), is(1));
@@ -165,8 +176,8 @@ public class JaegerExporterHandlerIntegrationTest {
final JsonObject log1 = logs.get(0).getAsJsonObject();
final long ts1 = log1.get("timestamp").getAsLong();
- assertThat(ts1, is(greaterThanOrEqualTo(MILLISECONDS.toMicros(startTime))));
- assertThat(ts1, is(lessThanOrEqualTo(MILLISECONDS.toMicros(endTime))));
+ assertThat(ts1, is(greaterThanOrEqualTo(MILLISECONDS.toMicros(startTimeInMillis))));
+ assertThat(ts1, is(lessThanOrEqualTo(MILLISECONDS.toMicros(endTimeInMillis))));
final JsonArray fields1 = log1.get("fields").getAsJsonArray();
assertThat(fields1.size(), is(1));
final JsonObject field1 = fields1.get(0).getAsJsonObject();
@@ -176,8 +187,8 @@ public class JaegerExporterHandlerIntegrationTest {
final JsonObject log2 = logs.get(1).getAsJsonObject();
final long ts2 = log2.get("timestamp").getAsLong();
- assertThat(ts2, is(greaterThanOrEqualTo(MILLISECONDS.toMicros(startTime))));
- assertThat(ts2, is(lessThanOrEqualTo(MILLISECONDS.toMicros(endTime))));
+ assertThat(ts2, is(greaterThanOrEqualTo(MILLISECONDS.toMicros(startTimeInMillis))));
+ assertThat(ts2, is(lessThanOrEqualTo(MILLISECONDS.toMicros(endTimeInMillis))));
assertThat(ts2, is(greaterThanOrEqualTo(ts1)));
final JsonArray fields2 = log2.get("fields").getAsJsonArray();
assertThat(fields2.size(), is(1));
@@ -218,4 +229,36 @@ public class JaegerExporterHandlerIntegrationTest {
}
return false;
}
+
+ private void waitForJaegerToStart(final String url) throws IOException, InterruptedException {
+ logger.log(Level.INFO, "Waiting for Jaeger to be ready...");
+ while (true) { // We rely on the test's timeout to avoid looping forever.
+ try {
+ final HttpRequest request = httpRequestFactory.buildGetRequest(new GenericUrl(url));
+ final HttpResponse response = request.execute();
+ if (response.getStatusCode() == OK) {
+ logger.log(Level.INFO, "Jaeger is now ready.");
+ return;
+ }
+ } catch (ConnectException e) {
+ logger.log(Level.INFO, "Jaeger is not yet ready, waiting a bit...");
+ Thread.sleep(10L);
+ } catch (SocketException e) {
+ if (isRetryableError(e)) {
+ // Jaeger seems to accept connections even though it is not yet ready to handle HTTP
+ // requests.
+ logger.log(Level.INFO, "Jaeger is still not yet ready, waiting a bit more...", e);
+ Thread.sleep(10L);
+ } else {
+ throw e;
+ }
+ }
+ }
+ }
+
+ private static boolean isRetryableError(final SocketException e) {
+ final String message = e.getMessage();
+ return message.contains("Unexpected end of file from server")
+ || message.contains("Connection reset");
+ }
}