package com.signalfx.codahale.metrics;
import static org.junit.Assert.*;
import org.junit.Test;
import com.yammer.metrics.core.Counter;
import com.yammer.metrics.core.Gauge;
import com.yammer.metrics.core.MetricName;
import com.yammer.metrics.core.MetricsRegistry;
import com.yammer.metrics.core.MetricPredicate;
import com.yammer.metrics.core.Histogram;
import com.google.common.collect.ImmutableSet;
import com.signalfx.codahale.reporter.MetricMetadata;
import com.signalfx.codahale.reporter.SfUtil;
import com.signalfx.codahale.reporter.SignalFxReporter;
import com.signalfx.metrics.auth.StaticAuthToken;
import com.signalfx.metrics.connection.StaticDataPointReceiverFactory;
import com.signalfx.metrics.connection.StoredDataPointReceiver;
import com.signalfx.metrics.errorhandler.MetricError;
import com.signalfx.metrics.errorhandler.OnSendErrorHandler;
import com.signalfx.metrics.protobuf.SignalFxProtocolBuffers;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class SignalFxReporterTest {
private void testReporter(){
StoredDataPointReceiver dbank = new StoredDataPointReceiver();
assertEquals(0, dbank.addDataPoints.size());
MetricsRegistry metricRegistery = new MetricsRegistry();
SignalFxReporter reporter = new SignalFxReporter.Builder(metricRegistery, new StaticAuthToken(""), "myserver")
.setDataPointReceiverFactory(new StaticDataPointReceiverFactory(dbank))
.setDetailsToAdd(
ImmutableSet.of(
SignalFxReporter.MetricDetails.COUNT,
SignalFxReporter.MetricDetails.MIN,
SignalFxReporter.MetricDetails.MAX
)
)
.setName("testReporter")
.useLocalTime(false)
.setOnSendErrorHandlerCollection(
Collections.<OnSendErrorHandler>singleton(new OnSendErrorHandler(){
public void handleError(MetricError error){
System.out.println("" + error.getMessage());
}
})
)
.setFilter(MetricPredicate.ALL)
.setRateUnit(TimeUnit.SECONDS)
.build();
final MetricMetadata metricMetadata = reporter.getMetricMetadata();
MetricName gaugeName = new MetricName("group1", "type1", "gauge1");
metricRegistery.newGauge(gaugeName, new Gauge<Integer>() {
@Override
public Integer value() {
return 1;
}
});
MetricName boolGaugeName = new MetricName("group1", "type1", "boolGauge1");
metricRegistery.newGauge(boolGaugeName, new Gauge<Boolean>() {
@Override
public Boolean value() {
return true;
}
});
MetricName cntName1 = new MetricName("group1", "type1", "counter");
Counter cnt1 = metricRegistery.newCounter(cntName1);
metricMetadata.forMetric(cnt1)
.withMetricName("newname")
.withSourceName("newsource")
.withMetricType(SignalFxProtocolBuffers.MetricType.GAUGE)
.withDimension("key", "value");
MetricName cntName2 = new MetricName("group1", "type1", "counter2");
Counter cnt2 = metricRegistery.newCounter(cntName2);
metricMetadata.forMetric(cnt2)
.withMetricName("newname2");
cnt1.inc();
cnt1.inc();
MetricName timerName1 = new MetricName("group1", "type1", "atimer");
metricRegistery.newTimer(timerName1, TimeUnit.SECONDS, TimeUnit.SECONDS).time().stop();
reporter.report();
assertEquals(7, dbank.addDataPoints.size());
assertEquals("newname", dbank.addDataPoints.get(2).getMetric());
assertEquals("newsource", dbank.addDataPoints.get(2).getDimensions(0).getValue());
assertEquals("sf_source", dbank.addDataPoints.get(2).getDimensions(0).getKey());
assertEquals(SignalFxProtocolBuffers.MetricType.GAUGE, dbank.registeredMetrics.get(
"newname"));
assertEquals(SignalFxProtocolBuffers.MetricType.CUMULATIVE_COUNTER, dbank.registeredMetrics.get(
"atimer.count"));
assertEquals(SignalFxProtocolBuffers.MetricType.GAUGE, dbank.registeredMetrics.get(
"atimer.max"));
assertEquals(2, dbank.lastValueFor("newsource", "newname").getIntValue());
assertNotNull(dbank.lastValueFor("myserver", "atimer.count"));
dbank.addDataPoints.clear();
MetricName rawCounterName = new MetricName("group1", "type1", "raw_counter");
Counter rawCounter = metricRegistery.newCounter(rawCounterName);
MetricName counterCallbackName = new MetricName("group1", "type1", "cumulative_counter_callback");
metricMetadata.forMetric(rawCounter)
.withMetricType(SignalFxProtocolBuffers.MetricType.COUNTER);
SfUtil.cumulativeCounter(metricRegistery, counterCallbackName, metricMetadata, new Gauge<Long>() {
private long i = 0;
@Override public Long value() {
return i++;
}
});
rawCounter.inc(10);
reporter.report();
assertEquals(9, dbank.addDataPoints.size());
assertEquals(10, dbank.lastValueFor("myserver", "raw_counter").getIntValue());
assertEquals(0, dbank.lastValueFor("myserver", "cumulative_counter_callback").getIntValue());
assertEquals(2, dbank.lastValueFor("newsource", "newname").getIntValue());
assertEquals(SignalFxProtocolBuffers.MetricType.COUNTER, dbank.registeredMetrics.get("raw_counter"));
assertEquals(SignalFxProtocolBuffers.MetricType.CUMULATIVE_COUNTER,
dbank.registeredMetrics.get("cumulative_counter_callback"));
rawCounter.inc(14);
dbank.addDataPoints.clear();
metricRegistery.removeMetric(cntName1);
assertEquals(true, dbank.clearValues("newsource", "newname"));
assertEquals(false, dbank.clearValues("newsource", "newname"));
reporter.report();
assertEquals(8, dbank.addDataPoints.size());
assertEquals(0, dbank.valuesFor("newsource", "newname").size());
assertEquals(24, dbank.lastValueFor("myserver", "raw_counter").getIntValue());
assertEquals(1, dbank.lastValueFor("myserver", "cumulative_counter_callback").getIntValue());
long endTime = System.currentTimeMillis() + 1000 * 10;
reporter.start(1, TimeUnit.SECONDS);
int size = 0;
while(endTime > System.currentTimeMillis()){
if(size != dbank.addDataPoints.size()){
break;
}
}
assertTrue(endTime > System.currentTimeMillis());
reporter.stop();
}
private void testReporterWithDetails(){
StoredDataPointReceiver dbank = new StoredDataPointReceiver();
assertEquals(0, dbank.addDataPoints.size());
Set<SignalFxReporter.MetricDetails> detailsToAdd = new HashSet<SignalFxReporter.MetricDetails>();
detailsToAdd.add(SignalFxReporter.MetricDetails.STD_DEV);
detailsToAdd.add(SignalFxReporter.MetricDetails.MEAN);
MetricsRegistry metricRegistery = new MetricsRegistry();
SignalFxReporter reporter = new SignalFxReporter.Builder(metricRegistery, new StaticAuthToken(""), "myserver")
.setDataPointReceiverFactory(new StaticDataPointReceiverFactory(dbank))
.setDetailsToAdd(
ImmutableSet.of(
SignalFxReporter.MetricDetails.COUNT,
SignalFxReporter.MetricDetails.MIN,
SignalFxReporter.MetricDetails.MAX
)
)
.setName("testReporter")
.setDefaultSourceName("defaultSource")
.useLocalTime(false)
.setOnSendErrorHandlerCollection(
Collections.<OnSendErrorHandler>singleton(new OnSendErrorHandler(){
public void handleError(MetricError error){
System.out.println("" + error.getMessage());
}
})
)
.setFilter(MetricPredicate.ALL)
.setRateUnit(TimeUnit.SECONDS)
.setDetailsToAdd(detailsToAdd)
.build();
final MetricMetadata metricMetadata = reporter.getMetricMetadata();
MetricName histogramName = new MetricName("group1", "type1", "histogram");
Histogram histogram = metricRegistery.newHistogram(histogramName, true);
histogram.update(10);
histogram.update(14);
histogram.update(7);
metricMetadata.forMetric(histogram)
.withMetricName("histogram")
.withSourceName("histogram_source")
.withMetricType(SignalFxProtocolBuffers.MetricType.GAUGE)
.withDimension("key", "value");
reporter.report();
assertEquals(2, dbank.addDataPoints.size());
}
@Test
public void test() throws InterruptedException {
testReporter();
testReporterWithDetails();
}
}