diff --git a/jaeger-core/src/main/java/io/jaegertracing/Configuration.java b/jaeger-core/src/main/java/io/jaegertracing/Configuration.java index b75bc77e4..21f98258c 100644 --- a/jaeger-core/src/main/java/io/jaegertracing/Configuration.java +++ b/jaeger-core/src/main/java/io/jaegertracing/Configuration.java @@ -653,7 +653,7 @@ public SenderConfiguration withAuthPassword(String password) { * @return the sender passed via the constructor or a properly configured sender */ public Sender getSender() { - if (sender == null) { + if (sender == null || sender.isClosed()) { sender = SenderResolver.resolve(this); } return sender; diff --git a/jaeger-core/src/main/java/io/jaegertracing/internal/senders/NoopSender.java b/jaeger-core/src/main/java/io/jaegertracing/internal/senders/NoopSender.java index 7b36f03aa..b8a944afc 100644 --- a/jaeger-core/src/main/java/io/jaegertracing/internal/senders/NoopSender.java +++ b/jaeger-core/src/main/java/io/jaegertracing/internal/senders/NoopSender.java @@ -24,6 +24,8 @@ */ @ToString public class NoopSender implements Sender { + private boolean closed = false; + @Override public int append(JaegerSpan span) { return 1; @@ -36,6 +38,13 @@ public int flush() { @Override public int close() { + this.closed = true; return 0; } + + @Override + public boolean isClosed() { + return closed; + } + } diff --git a/jaeger-core/src/main/java/io/jaegertracing/spi/Sender.java b/jaeger-core/src/main/java/io/jaegertracing/spi/Sender.java index b11df9032..1fa81dda8 100644 --- a/jaeger-core/src/main/java/io/jaegertracing/spi/Sender.java +++ b/jaeger-core/src/main/java/io/jaegertracing/spi/Sender.java @@ -23,4 +23,6 @@ public interface Sender { int flush() throws SenderException; int close() throws SenderException; + + boolean isClosed(); } diff --git a/jaeger-core/src/test/java/io/jaegertracing/internal/senders/InMemorySender.java b/jaeger-core/src/test/java/io/jaegertracing/internal/senders/InMemorySender.java index e5ca6012b..3d8e3e629 100644 --- a/jaeger-core/src/test/java/io/jaegertracing/internal/senders/InMemorySender.java +++ b/jaeger-core/src/test/java/io/jaegertracing/internal/senders/InMemorySender.java @@ -31,6 +31,7 @@ public class InMemorySender implements Sender { private List flushed; private List received; private Semaphore semaphore = new Semaphore(Integer.MAX_VALUE); + private boolean closed = false; public InMemorySender() { appended = new ArrayList<>(); @@ -75,9 +76,15 @@ public int flush() throws SenderException { @Override public int close() throws SenderException { + this.closed = true; return flush(); } + @Override + public boolean isClosed() { + return closed; + } + /** * Removes previously granted "append" permits and grants * a new number of permits diff --git a/jaeger-core/src/test/java/io/jaegertracing/internal/senders/SenderResolverTest.java b/jaeger-core/src/test/java/io/jaegertracing/internal/senders/SenderResolverTest.java index ff016eef8..9bfe6ba1c 100644 --- a/jaeger-core/src/test/java/io/jaegertracing/internal/senders/SenderResolverTest.java +++ b/jaeger-core/src/test/java/io/jaegertracing/internal/senders/SenderResolverTest.java @@ -124,6 +124,7 @@ private Sender getSenderForServiceFileContents(String contents, boolean append) } static class CustomSender implements Sender { + private boolean closed = false; @Override public int append(JaegerSpan span) { @@ -137,9 +138,15 @@ public int flush() { @Override public int close() { + this.closed = true; return 0; } + @Override + public boolean isClosed() { + return closed; + } + @Override public String toString() { return "CustomSender{}"; diff --git a/jaeger-thrift/src/main/java/io/jaegertracing/thrift/internal/senders/ThriftSender.java b/jaeger-thrift/src/main/java/io/jaegertracing/thrift/internal/senders/ThriftSender.java index 7811bd114..c8ff51180 100644 --- a/jaeger-thrift/src/main/java/io/jaegertracing/thrift/internal/senders/ThriftSender.java +++ b/jaeger-thrift/src/main/java/io/jaegertracing/thrift/internal/senders/ThriftSender.java @@ -30,6 +30,7 @@ public abstract class ThriftSender extends ThriftSenderBase implements Sender { private Process process; private int processBytesSize; private int byteBufferSize; + private boolean closed = false; @ToString.Exclude private List spanBuffer; @@ -119,7 +120,13 @@ public int flush() throws SenderException { @Override public int close() throws SenderException { + this.closed = true; return flush(); } + @Override + public boolean isClosed() { + return closed; + } + } diff --git a/jaeger-zipkin/src/main/java/io/jaegertracing/zipkin/ZipkinSender.java b/jaeger-zipkin/src/main/java/io/jaegertracing/zipkin/ZipkinSender.java index 8c3568e73..f682692c9 100644 --- a/jaeger-zipkin/src/main/java/io/jaegertracing/zipkin/ZipkinSender.java +++ b/jaeger-zipkin/src/main/java/io/jaegertracing/zipkin/ZipkinSender.java @@ -66,6 +66,7 @@ public final class ZipkinSender implements Sender { @ToString.Exclude final ThriftSpanEncoder encoder = new ThriftSpanEncoder(); @ToString.Exclude final List spanBuffer; + private boolean closed = false; /** * @param endpoint The POST URL for zipkin's v1 api, @@ -178,9 +179,15 @@ public int close() throws SenderException { } catch (IOException e) { throw new SenderException("Failed to close " + delegate, e, n); } + this.closed = true; return n; } + @Override + public boolean isClosed() { + return closed; + } + // serviceName/host is needed on annotations so zipkin can query // see https://github.com/jaegertracing/jaeger-client-java/pull/75 for more info static Span backFillHostOnAnnotations(Span span) {