package org.stagemonitor.core.metrics.metrics2;
import com.codahale.metrics.Gauge;
import org.slf4j.LoggerFactory;
import org.stagemonitor.core.Stagemonitor;
import org.stagemonitor.core.metrics.MetricNameFilter;
import org.stagemonitor.core.metrics.SortedTableLogReporter;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import static org.stagemonitor.core.metrics.metrics2.MetricName.name;
public class MetricsStoreBenchmark {
private final Metric2Registry metricRegistry;
private final Integer reportingInterval;
private final int reports;
private final int gauges;
private final int timers;
private final int meters;
public static void main(String[] args) throws Exception {
final MetricsStoreBenchmark metricsStoreBenchmark = new MetricsStoreBenchmark(1, 1008, 3000, 1000, 2000);
metricsStoreBenchmark.run();
}
public MetricsStoreBenchmark(Integer reportingInterval, int reports, int gauges, int timers, int meters) {
this.reportingInterval = reportingInterval;
this.reports = reports;
this.gauges = gauges;
this.timers = timers;
this.meters = meters;
System.setProperty("stagemonitor.elasticsearch.url", "http://192.168.99.100:9200");
System.setProperty("stagemonitor.reporting.interval.elasticsearch", reportingInterval.toString());
System.setProperty("stagemonitor.reporting.influxdb.url", "http://192.168.99.100:8086");
System.setProperty("stagemonitor.reporting.interval.influxdb", reportingInterval.toString());
System.setProperty("stagemonitor.reporting.interval.aggregation", "-1");
System.setProperty("stagemonitor.applicationName", "Metrics Store Benchmark");
System.setProperty("stagemonitor.instanceName", "instance");
metricRegistry = Stagemonitor.getMetric2Registry();
}
private void run() throws InterruptedException {
registerGauges(gauges);
Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
final Thread thread = new Thread(r);
thread.setDaemon(true);
return thread;
}
}).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
updateMeters(meters);
updateTimers(timers);
}
}, 0, 500, TimeUnit.MILLISECONDS);
final SortedTableLogReporter logReporter = SortedTableLogReporter
.forRegistry(metricRegistry)
.filter(MetricNameFilter.includePatterns(name("reporting_time").build()))
.log(LoggerFactory.getLogger(MetricsStoreBenchmark.class))
.build();
logReporter.start(10, TimeUnit.SECONDS);
Thread.sleep((reportingInterval * reports * 1000) + reportingInterval);
logReporter.report();
}
private void updateTimers(int numberOfTimers) {
for (int i = 0; i < numberOfTimers; i++) {
metricRegistry.timer(name("timer").tag("number", Integer.toString(i)).build()).update((long) (Math.random() * 1000), TimeUnit.MILLISECONDS);
}
}
private void updateMeters(int n) {
for (int i = 0; i < n; i++) {
metricRegistry.meter(name("meter").tag("number", Integer.toString(i)).build()).mark();
}
}
private void registerGauges(int n) {
for (int i = 0; i < n; i++) {
metricRegistry.register(name("gauge").tag("number", Integer.toString(i)).build(), new Gauge<Double>() {
@Override
public Double getValue() {
return Math.random();
}
});
}
}
}