finagle-zipkin provides the instrumentation for Dapper-style distributed tracing in Finagle-based services. See Zipkin for the collection and query services.
- Annotation - includes a value, timestamp, and host
- Span - a set of annotations that correspond to a particular RPC
- Trace - a set of spans that share a single root span
We define four Core Annotations that fully describe an RPC (client send, server receive, server send, client receive)
ZipkinTracer is a Finagle
Tracer that collects trace data.
The default configuration samples 1/1000 traces, computed as a hash of the trace id.
In memory structures
ZipkinTracer keeps some in memory data structures that buffer Spans
as they are mutated to prevent making too many I/O calls.
ZipkinTracer sends data to a local Scribe daemon. This allows tracing
to be as low overhead as possible since Scribe can choose to drop data
when under heavy load.
To add tracing to your Finagle service, just add one line to the
ServerBuilder() .codec(ThriftServerFramedCodec()) .bindTo(serverAddr) .name("servicename") .tracerFactory(ZipkinTracer()) .build()
ZipkinTracer sends trace data to a local Scribe daemon.
This can be configured to send the data either directly to a Zipkin
Collector or some other service. In addition, the sample rate can also
be configured to a floating point value between 0.0 and 1.0.
ZipkinTracer(scribeHost = "10.0.0.1", scribePort = 1234, sampleRate = 0.4)
Additional information can be added in application code with custom annotations. These can be either time-based, or key-value based.
Trace.record("starting some extremely expensive computation") Trace.recordBinary("http.response.code", "500")