Class Sender

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable

    public abstract class Sender
    extends zipkin2.Component
    Sends a list of encoded spans to a transport such as http or Kafka. Usually, this involves encoding them into a message and enqueueing them for transport over http or Kafka. The typical end recipient is a zipkin collector.

    Unless mentioned otherwise, senders are not thread-safe. They were designed to be used by AsyncReporter, which has a single reporting thread.

    Those looking to initialize eagerly should call Component.check(). This can be used to reduce latency on the first send operation, or to fail fast.

    Implementation notes

    The parameter is a list of encoded spans as opposed to an encoded message. This allows implementations flexibility on how to encode spans into a message. For example, a large span might need to be sent as a separate message to avoid kafka limits. Also, logging transports like scribe will likely write each span as a separate log line.

    This accepts a list of encoded spans, as opposed a list of spans like Span. This allows senders to be re-usable as model shapes change. This also allows them to use their most natural message type. For example, kafka would more naturally send messages as byte arrays.

    • Constructor Summary

      Constructors 
      Constructor Description
      Sender()  
    • Method Summary

      All Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      abstract zipkin2.codec.Encoding encoding()
      Returns the encoding this sender requires spans to have.
      abstract int messageMaxBytes()
      Maximum bytes sendable per message including overhead.
      int messageSizeInBytes​(int encodedSizeInBytes)
      Like messageSizeInBytes(List), except for a single-span.
      abstract int messageSizeInBytes​(java.util.List<byte[]> encodedSpans)
      Before invoking sendSpans(List), callers must consider message overhead, which might be more than encoding overhead.
      abstract zipkin2.Call<java.lang.Void> sendSpans​(java.util.List<byte[]> encodedSpans)
      Sends a list of encoded spans to a transport such as http or Kafka.
      • Methods inherited from class zipkin2.Component

        check, close
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • Sender

        public Sender()
    • Method Detail

      • encoding

        public abstract zipkin2.codec.Encoding encoding()
        Returns the encoding this sender requires spans to have.
      • messageMaxBytes

        public abstract int messageMaxBytes()
        Maximum bytes sendable per message including overhead. This can be calculated using messageSizeInBytes(List)
      • messageSizeInBytes

        public abstract int messageSizeInBytes​(java.util.List<byte[]> encodedSpans)
        Before invoking sendSpans(List), callers must consider message overhead, which might be more than encoding overhead. This is used to not exceed messageMaxBytes().

        Note this is not always Encoding.listSizeInBytes(List), as some senders have inefficient list encoding. For example, Scribe base64's then tags each span with a category.

      • messageSizeInBytes

        public int messageSizeInBytes​(int encodedSizeInBytes)
        Like messageSizeInBytes(List), except for a single-span. This is used to ensure a span is never accepted that can never be sent.

        Always override this, which is only abstract as added after version 2.0

        Parameters:
        encodedSizeInBytes - the encoded size of a span
        Since:
        2.2
      • sendSpans

        public abstract zipkin2.Call<java.lang.Void> sendSpans​(java.util.List<byte[]> encodedSpans)
        Sends a list of encoded spans to a transport such as http or Kafka.
        Parameters:
        encodedSpans - list of encoded spans.
        Throws:
        java.lang.IllegalStateException - if close was called.