package com.github.kristofa.brave.scribe; import com.twitter.zipkin.gen.SpanCodec; import java.util.ArrayList; import java.util.Base64; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Level; import java.util.logging.Logger; import com.twitter.zipkin.gen.LogEntry; import com.twitter.zipkin.gen.ResultCode; import com.twitter.zipkin.gen.Span; import com.twitter.zipkin.gen.scribe.Iface; /** * ScribeReceiver served through ScribeServer. Keeps received spans in memory. * Used for testing. * * @see ScribeServer */ class ScribeReceiver implements Iface { private static final Logger LOGGER = Logger.getLogger(ScribeReceiver.class.getName()); private final BlockingQueue<Span> spans = new LinkedBlockingQueue<>(); private volatile int delayMs; public void clearReceivedSpans() { spans.clear(); } @Override public ResultCode Log(final List<LogEntry> messages) { for (final LogEntry logEntry : messages) { final byte[] decodedSpan = Base64.getDecoder().decode(logEntry.getMessage()); final Span span = SpanCodec.THRIFT.readSpan(decodedSpan); spans.add(span); } if (delayMs > 0) { try { Thread.sleep(delayMs); } catch (final InterruptedException e) { LOGGER.log(Level.SEVERE, "Interrupted.", e); } } return ResultCode.OK; } /** * Gets the received spans in the order as they were received. * * @return Received spans. */ public List<Span> getSpans() { List<Span> result = new ArrayList<>(); spans.drainTo(result); return result; } public void setDelayMs(int delayMs) { if (delayMs < 0) { throw new IllegalArgumentException("Invalid delay of " + delayMs + " ms"); } this.delayMs = delayMs; } }