package org.stagemonitor.zipkin; import org.stagemonitor.core.CorePlugin; import org.stagemonitor.core.StagemonitorPlugin; import org.stagemonitor.tracing.B3HeaderFormat; import org.stagemonitor.tracing.TracerFactory; import org.stagemonitor.tracing.TracingPlugin; import java.util.concurrent.TimeUnit; import brave.Tracing; import brave.opentracing.BraveTracer; import brave.propagation.Propagation; import brave.sampler.Sampler; import io.opentracing.Tracer; import zipkin.reporter.AsyncReporter; import zipkin.reporter.urlconnection.URLConnectionSender; public class BraveZipkinReportingTracerFactory extends TracerFactory { @Override public Tracer getTracer(StagemonitorPlugin.InitArguments initArguments) { final Tracing braveTracer = Tracing.newBuilder() .localServiceName(initArguments.getMeasurementSession().getApplicationName()) .reporter(getZipkinReporterBuilder(initArguments).build()) .sampler(getSampler()) .build(); return BraveTracer.newBuilder(braveTracer) .textMapPropagation(B3HeaderFormat.INSTANCE, Propagation.B3_STRING) .build(); } protected AlwaysSampler getSampler() { return new AlwaysSampler(); } protected AsyncReporter.Builder getZipkinReporterBuilder(StagemonitorPlugin.InitArguments initArguments) { final ZipkinPlugin zipkinPlugin = initArguments.getPlugin(ZipkinPlugin.class); final AsyncReporter.Builder reporterBuilder = AsyncReporter .builder(getSender(zipkinPlugin)) .messageTimeout(zipkinPlugin.getZipkinFlushInterval(), TimeUnit.MILLISECONDS); final Integer zipkinMaxQueuedBytes = zipkinPlugin.getZipkinMaxQueuedBytes(); if (zipkinMaxQueuedBytes != null) { reporterBuilder.queuedMaxBytes(zipkinMaxQueuedBytes); } if (initArguments.getPlugin(CorePlugin.class).isInternalMonitoringActive()) { reporterBuilder.metrics(new StagemonitorReporterMetrics(initArguments.getMetricRegistry())); } return reporterBuilder; } protected URLConnectionSender getSender(ZipkinPlugin zipkinPlugin) { return URLConnectionSender.create(zipkinPlugin.getZipkinEndpoint()); } /** * Sampling is performed by stagemonitor to ensure consistent configuration regardless of the OT impl * * See ConfigurationOptions in {@link TracingPlugin} tagged with sampling */ private static class AlwaysSampler extends Sampler { @Override public boolean isSampled(long traceId) { return true; } } }