package com.yammer.metrics.core; import com.google.common.base.Optional; import com.yammer.telemetry.tracing.Span; import com.yammer.telemetry.tracing.SpanHelper; import java.util.concurrent.Callable; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class InstrumentedTimer extends Timer implements MetricNameAware { private final Clock clock; private MetricName metricName; InstrumentedTimer(ScheduledExecutorService tickThread, TimeUnit durationUnit, TimeUnit rateUnit, Clock clock) { super(tickThread, durationUnit, rateUnit, clock); this.clock = clock; } @Override public <T> T time(Callable<T> event) throws Exception { final Optional<Span> currentSpan = SpanHelper.currentSpan(); try { for (Span span : currentSpan.asSet()) { span.addAnnotation("Start Timer", String.valueOf(metricName)); } return super.time(event); } finally { for (Span span : currentSpan.asSet()) { span.addAnnotation("Stop Timer", String.valueOf(metricName)); } } } @Override public TimerContext time() { return new InstrumentedTimerContext(this, clock); } public MetricName getMetricName() { return metricName; } public void setMetricName(MetricName metricName) { this.metricName = metricName; } }