package org.rrd4j.core; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.rrd4j.ConsolFun; import org.rrd4j.DsType; public class LongRunning { private static final int RRD_STEP = 60; @Rule public TemporaryFolder testFolder = new TemporaryFolder(); private static final String TEST_FILE = "longrunning.rrd"; private List<Long> startTimes; private long now; @Before public void setup() throws Exception { now = System.currentTimeMillis(); startTimes = new ArrayList<Long>(); startTimes.add(now - (TimeUnit.HOURS).toMillis(1)); startTimes.add(now - (TimeUnit.DAYS).toMillis(1)); startTimes.add(now - (TimeUnit.DAYS).toMillis(7)); startTimes.add(now - (TimeUnit.DAYS).toMillis(30)); startTimes.add(now - (TimeUnit.DAYS).toMillis(365)); } public void run(int version) throws IOException { int min = 200; int max = 2000; Random random = new Random(); for (Long startTime : startTimes) { Long sampleTime = startTime; int sampleSize = (int) ((now - startTime) / (RRD_STEP * 1000)); RrdDb rrdDb = buildRrdDb(version, startTime, sampleSize); try { Sample sample = rrdDb.createSample(); for (int i = 1; i <= sampleSize; i++) { int randomQueryResponseTime = random.nextInt(max - min + 1) + min; // in ms sample.setTime(sampleTime); sample.setValue("data", randomQueryResponseTime); sample.update(); // Increment by RRD step sampleTime += RRD_STEP; } } finally { rrdDb.close(); } } } @Test public void testVersion1() throws IOException { run(1); } @Test public void testVersion2() throws IOException { run(2); } private RrdDb buildRrdDb(int version, long startTime, int sampleSize) throws IOException { String rrdFileName = new File(testFolder.getRoot(), TEST_FILE).getCanonicalPath(); RrdDef rrdDef = new RrdDef(rrdFileName, RRD_STEP); // This works rrdDef.setVersion(version); rrdDef.setStartTime(startTime - 1); rrdDef.addDatasource("data", DsType.GAUGE, 90, 0, Double.NaN); // 1 step, 60 seconds per step, for 5 minutes rrdDef.addArchive(ConsolFun.TOTAL, 0.5, 1, sampleSize); rrdDef.addArchive(ConsolFun.AVERAGE, 0.5, 1, sampleSize); rrdDef.addArchive(ConsolFun.MAX, 0.5, 1, sampleSize); rrdDef.addArchive(ConsolFun.MIN, 0.5, 1, sampleSize); // 5 steps, 60 seconds per step, for 30 minutes rrdDef.addArchive(ConsolFun.TOTAL, 0.5, 5, sampleSize + 1); rrdDef.addArchive(ConsolFun.AVERAGE, 0.5, 5, sampleSize + 1); rrdDef.addArchive(ConsolFun.MAX, 0.5, 5, sampleSize + 1); rrdDef.addArchive(ConsolFun.MIN, 0.5, 5, sampleSize + 1); return new RrdDb(rrdDef); } }