package org.rrd4j.data; import java.io.File; import java.io.IOException; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.rrd4j.ConsolFun; import org.rrd4j.DsType; import org.rrd4j.core.RrdBackendFactory; import org.rrd4j.core.RrdDb; import org.rrd4j.core.RrdDef; import org.rrd4j.core.Util; public class VariableTest { static final private String backend = "MEMORY"; static final private String fileName = "variabletest.rrd"; static final double[] vals = { 39.0, 94.0, 95.0, 101.0, 155.0, 262.0, 274.0, 302.0, 319.0, 402.0, 466.0, 468.0, 494.0, 549.0, 550.0, 575.0, 600.0, 615.0, 625.0, 703.0, 729.0, 824.0, 976.0, 1018.0, 1036.0, 1138.0, 1195.0, 1265.0, 1287.0, 1323.0, 1410.0, 1443.0, 1516.0, 1538.0, 1664.0, 1686.0, 1801.0, 1912.0, 1921.0, 1929.0, 1936.0, 1941.0, 1985.0, 2003.0, 2010.0, 2013.0, 2082.0, 2106.0, 2213.0, 2358.0, 2394.0, 2572.0, 2616.0, 2627.0, 2676.0, 2694.0, 2736.0, 2740.0, 2966.0, 3005.0, 3037.0, 3041.0, 3146.0, 3194.0, 3228.0, 3235.0, 3243.0, 3339.0, 3365.0, 3414.0, 3440.0, 3454.0, 3567.0, 3570.0, 3615.0, 3619.0, 3802.0, 3831.0, 3864.0, 4061.0, 4084.0, 4106.0, 4233.0, 4328.0, 4362.0, 4372.0, 4376.0, 4388.0, 4413.0, 4527.0, 4612.0, 4643.0, 4684.0, 4750.0, 4799.0, 4810.0, 4824.0, 4825.0, 4871.0, 4932.0, 5028.0, 5112.0, 5118.0, 5163.0, 5198.0, 5256.0, 5296.0, 5413.0, 5471.0, 5568.0, 5628.0, 5645.0, 5733.0, 5790.0, 5851.0, 5886.0, 5927.0, 5937.0, 6018.0, 6027.0, 6046.0, 6145.0, 6147.0, 6289.0, 6371.0, 6384.0, 6393.0, 6431.0, 6469.0, 6543.0, 6649.0, 6772.0, 6864.0, 6943.0, 7009.0, 7014.0, 7037.0, 7258.0, 7356.0, 7364.0, 7386.0, 7387.0, 7399.0, 7450.0, 7519.0, 7527.0, 7578.0, 7632.0, 7709.0, 7849.0, 7896.0, 7952.0, 7980.0, 8050.0, 8126.0, 8152.0, 8165.0, 8332.0, 8347.0, 8520.0, 8522.0, 8542.0, 8587.0, 8621.0, 8678.0, 8721.0, 8739.0, 8765.0, 8889.0, 8951.0, 8962.0, 9082.0, 9149.0, 9199.0, 9278.0, 9334.0, 9339.0, 9345.0, 9365.0, 9383.0, 9402.0, 9471.0, 9483.0, 9492.0, 9496.0, 9532.0, 9553.0, 9563.0, 9571.0, 9574.0, 100000.0, 120000.0, 150000.0, 200000.0, 500000.0, 1000000.0, 2000000.0, 4000000.0, 8000000.0, 16000000.0 }; private static final long start = Util.getTimestamp(2010, 4, 1); private static final long step = 300; private static long startTime; private static long endTime; private static final boolean dorrdtool = false; @BeforeClass public static void createRrd() throws IOException { startTime = start - start % step; endTime = startTime + 200 * step; RrdDef def = new RrdDef(RrdBackendFactory.getFactory(backend).getUri(fileName), startTime - 3 * step, step); def.addArchive(ConsolFun.AVERAGE, 0.5, 1, 215); def.addDatasource("bar", DsType.GAUGE, 3000, Double.NaN, Double.NaN); try (RrdDb db = new RrdDb(def, RrdBackendFactory.getFactory(backend))) { db.createSample((startTime - step )).setValue(0, 0.0).update(); long sampleTime = startTime; for (double val : vals) { db.createSample(sampleTime).setValue(0, val).update(); sampleTime += step; } if(dorrdtool) { String xmlfile = System.getProperty("java.io.tmpdir") + File.separator + "variabletest.xml"; String rrdfile = System.getProperty("java.io.tmpdir") + File.separator + "variabletest.rrd"; db.dumpXml(xmlfile); System.out.println("rrdtool restore " + xmlfile + " " + rrdfile); String cmd = "rrdtool graph /dev/null " + String.format("--start=%d ", startTime ) + String.format("--end=%d ", endTime) + String.format("DEF:baz=%s:bar:AVERAGE ", rrdfile) + "VDEF:min=baz,MINIMUM " + "PRINT:min:\"mininum %1.15le\" " + "VDEF:max=baz,MAXIMUM " + "PRINT:max:\"maximum %1.15le\" " + "VDEF:avg=baz,AVERAGE " + "PRINT:avg:\"average %1.15le\" " + "VDEF:stdev=baz,STDEV " + "PRINT:stdev:\"stdev %1.15le\" " + "VDEF:first=baz,FIRST " + "PRINT:first:\"first %1.15le\" " + "VDEF:last=baz,LAST " + "PRINT:last:\"last %1.15le\" " + "VDEF:total=baz,TOTAL " + "PRINT:total:\"total %1.15le\" " + "VDEF:percent=baz,95,PERCENT " + "PRINT:percent:\"95-th percent %1.15le\" " + "VDEF:percentnan=baz,95,PERCENTNAN " + "PRINT:percentnan:\"95-th percentnan %1.15le\" " + "VDEF:lslope=baz,LSLSLOPE " + "PRINT:lslope:\"lslope %1.15le\" " + "VDEF:lslint=baz,LSLINT " + "PRINT:lslint:\"lslintn %1.15le\" " + "VDEF:lslcorrel=baz,LSLCORREL " + "PRINT:lslcorrel:\"lslcorrel %1.15le\" "; System.out.println(cmd); long interval = (endTime - startTime) / 3; String cmd2 = "rrdtool graph /dev/null " + String.format("--start=%d ", startTime + interval) + String.format("--end=%d ", endTime - interval) + String.format("DEF:baz=%s:bar:AVERAGE ", rrdfile) + "VDEF:min=baz,MINIMUM " + "PRINT:min:\"mininum %1.15le\" " + "VDEF:max=baz,MAXIMUM " + "PRINT:max:\"maximum %1.15le\" " + "VDEF:avg=baz,AVERAGE " + "PRINT:avg:\"average %1.15le\" " + "VDEF:stdev=baz,STDEV " + "PRINT:stdev:\"stdev %1.15le\" " + "VDEF:first=baz,FIRST " + "PRINT:first:\"first %1.15le\" " + "VDEF:last=baz,LAST " + "PRINT:last:\"last %1.15le\" " + "VDEF:total=baz,TOTAL " + "PRINT:total:\"total %1.15le\" " + "VDEF:percent=baz,95,PERCENT " + "PRINT:percent:\"95-th percent %1.15le\" " + "VDEF:percentnan=baz,95,PERCENTNAN " + "PRINT:percentnan:\"95-th percentnan %1.15le\" " + "VDEF:lslope=baz,LSLSLOPE " + "PRINT:lslope:\"lslope %1.15le\" " + "VDEF:lslint=baz,LSLINT " + "PRINT:lslint:\"lslintn %1.15le\" " + "VDEF:lslcorrel=baz,LSLCORREL " + "PRINT:lslcorrel:\"lslcorrel %1.15le\" "; System.out.println(cmd2); String cmd3 = "rrdtool graph /dev/null " + String.format("--start=%d ", startTime - 10 * step) + String.format("--end=%d ", endTime + 2 * step) + String.format("DEF:baz=%s:bar:AVERAGE ", rrdfile) + "VDEF:min=baz,MINIMUM " + "PRINT:min:\"mininum %1.15le\" " + "VDEF:max=baz,MAXIMUM " + "PRINT:max:\"maximum %1.15le\" " + "VDEF:avg=baz,AVERAGE " + "PRINT:avg:\"average %1.15le\" " + "VDEF:stdev=baz,STDEV " + "PRINT:stdev:\"stdev %1.15le\" " + "VDEF:first=baz,FIRST " + "PRINT:first:\"first %1.15le\" " + "VDEF:last=baz,LAST " + "PRINT:last:\"last %1.15le\" " + "VDEF:total=baz,TOTAL " + "PRINT:total:\"total %1.15le\" " + "VDEF:percent=baz,95,PERCENT " + "PRINT:percent:\"95-th percent %1.15le\" " + "VDEF:percentnan=baz,95,PERCENTNAN " + "PRINT:percentnan:\"95-th percentnan %1.15le\" " + "VDEF:lslope=baz,LSLSLOPE " + "PRINT:lslope:\"lslope %1.15le\" " + "VDEF:lslint=baz,LSLINT " + "PRINT:lslint:\"lslintn %1.15le\" " + "VDEF:lslcorrel=baz,LSLCORREL " + "PRINT:lslcorrel:\"lslcorrel %1.15le\" "; System.out.println(cmd3); } }; } private DataProcessor getDp(Variable v) throws IOException { DataProcessor dp = new DataProcessor(startTime, endTime); dp.addDatasource("baz", fileName, "bar", ConsolFun.AVERAGE, backend); dp.addDatasource("value", "baz", v); dp.processData(); return dp; } // A range that does not fit steps private DataProcessor getDp2(Variable v) throws IOException { long interval = (endTime - startTime) / 3; DataProcessor dp = new DataProcessor(startTime + interval, endTime - interval); dp.addDatasource("baz", fileName, "bar", ConsolFun.AVERAGE, backend); dp.addDatasource("value", "baz", v); dp.processData(); return dp; } //A range that includes NaN private DataProcessor getDp3(Variable v) throws IOException { DataProcessor dp = new DataProcessor(startTime - 10 * step , endTime + 2 * step); dp.addDatasource("baz", fileName, "bar", ConsolFun.AVERAGE, backend); dp.addDatasource("value", "baz", v); dp.processData(); return dp; } @Test public void test95Percentile() throws Exception { DataProcessor dp = getDp(new Variable.PERCENTILE(95)); // rrdtools says 9.574000e+03 Assert.assertEquals("Wrong percentile", 9.574000e+03, dp.getVariable("value").value, 1e-6); } @Test public void test95Percentile2() throws Exception { DataProcessor dp = getDp2(new Variable.PERCENTILE(95)); // rrdtools says 6.772000000000000e+03 Assert.assertEquals("Wrong percentile", 6.772000000000000e+03, dp.getVariable("value").value, 1e-6); } @Test public void test95Percentile3() throws Exception { DataProcessor dp = getDp3(new Variable.PERCENTILE(95)); // rrdtools says 9.571000000000000e+03 Assert.assertEquals("Wrong percentile", 9.571000000000000e+03, dp.getVariable("value").value, 1e-6); } @Test public void test95PercentileNaN() throws Exception { DataProcessor dp = getDp(new Variable.PERCENTILENAN(95)); // rrdtools says 9.574000e+03 Assert.assertEquals("Wrong percentile", 9.574000e+03, dp.getVariable("value").value, 1e-6); } @Test public void test95PercentileNaN2() throws Exception { DataProcessor dp = getDp2(new Variable.PERCENTILENAN(95)); // rrdtools says 6.772000000000000e+03 Assert.assertEquals("Wrong percentile", 6.772000000000000e+03, dp.getVariable("value").value, 1e-6); } @Test public void test95PercentileNan3() throws Exception { DataProcessor dp = getDp3(new Variable.PERCENTILENAN(95)); // rrdtools says 9.574000000000000e+03 Assert.assertEquals("Wrong percentile", 9.574000000000000e+03, dp.getVariable("value").value, 1e-6); } @Test public void testFirst() throws Exception { DataProcessor dp = getDp(new Variable.FIRST()); // rrdtools says 9.400000e+01 Assert.assertEquals("Wrong first", 9.400000e+01, dp.getVariable("value").value, 1e-6); } @Test public void testFirst2() throws Exception { DataProcessor dp = getDp2(new Variable.FIRST()); // rrdtools says 3.339000000000000e+03 Assert.assertEquals("Wrong first", 3.339000000000000e+03, dp.getVariable("value").value, 1e-6); } @Test public void testFirst3() throws Exception { DataProcessor dp = getDp3(new Variable.FIRST()); // rrdtools says 0.000000000000000e+00 Assert.assertEquals("Wrong first", 0.000000000000000e+00, dp.getVariable("value").value, 1e-6); } @Test public void testLast() throws Exception { DataProcessor dp = getDp(new Variable.LAST()); // rrdtools says 1.600000e+07 Assert.assertEquals("Wrong last", 1.600000e+07, dp.getVariable("value").value, 1e-6); } @Test public void testLast2() throws Exception { DataProcessor dp = getDp2(new Variable.LAST()); // rrdtools says 7.009000000000000e+03 Assert.assertEquals("Wrong last", 7.009000000000000e+03, dp.getVariable("value").value, 1e-6); } @Test public void testLast3() throws Exception { DataProcessor dp = getDp3(new Variable.LAST()); // rrdtools says 1.600000000000000e+07 Assert.assertEquals("Wrong last", 1.600000000000000e+07, dp.getVariable("value").value, 1e-6); } @Test public void testMin() throws Exception { DataProcessor dp = getDp(new Variable.MIN()); // rrdtools says 9.400000e+01 Assert.assertEquals("Wrong minimum", 9.400000e+01, dp.getVariable("value").value, 1e-6); } @Test public void testMin2() throws Exception { DataProcessor dp = getDp2(new Variable.MIN()); // rrdtools says 3.339000000000000e+03 Assert.assertEquals("Wrong minimum", 3.339000000000000e+03, dp.getVariable("value").value, 1e-6); } @Test public void testMin3() throws Exception { DataProcessor dp = getDp3(new Variable.MIN()); // rrdtools says 0.000000000000000e+00 Assert.assertEquals("Wrong minimum", 0.000000000000000e+00, dp.getVariable("value").value, 1e-6); } @Test public void testMax() throws Exception { DataProcessor dp = getDp(new Variable.MAX()); // rrdtools says 1.600000e+07 Assert.assertEquals("Wrong maximum", 1.600000e+07, dp.getVariable("value").value, 1e-6); } @Test public void testMax2() throws Exception { DataProcessor dp = getDp2(new Variable.MAX()); // rrdtools says 7.009000000000000e+03 Assert.assertEquals("Wrong maximum", 7.009000000000000e+03, dp.getVariable("value").value, 1e-6); } @Test public void testMax3() throws Exception { DataProcessor dp = getDp3(new Variable.MAX()); // rrdtools says 1.600000000000000e+07 Assert.assertEquals("Wrong maximum", 1.600000000000000e+07, dp.getVariable("value").value, 1e-6); } @Test public void testTotal() throws Exception { DataProcessor dp = getDp(new Variable.TOTAL()); // rrdtools says 9.896709e+09 Assert.assertEquals("Wrong total", 9.896709e+09, dp.getVariable("value").value, 1e-6); } @Test public void testTotal2() throws Exception { DataProcessor dp = getDp2(new Variable.TOTAL()); // rrdtools says 1.039200000000000e+08 Assert.assertEquals("Wrong total", 1.039200000000000e+08, dp.getVariable("value").value, 1e-6); } @Test public void testTotal3() throws Exception { DataProcessor dp = getDp3(new Variable.TOTAL()); // rrdtools says 9.896720700000000e+09 Assert.assertEquals("Wrong total", 9.896720700000000e+09, dp.getVariable("value").value, 1e-6); } @Test public void testAverage() throws Exception { DataProcessor dp = getDp(new Variable.AVERAGE()); // rrdtools says 1.657740201e+05 Assert.assertEquals("Wrong average", 1.657740201e+05, dp.getVariable("value").value, 1e-6); } @Test public void testAverage2() throws Exception { DataProcessor dp = getDp2(new Variable.AVERAGE()); // rrdtools says 5.094117647058823e+03 Assert.assertEquals("Wrong average", 5.094117647058823e+03, dp.getVariable("value").value, 1e-6); } @Test public void testAverage3() throws Exception { DataProcessor dp = getDp3(new Variable.AVERAGE()); // rrdtools says 3.295591240875912e+03 Assert.assertEquals("Wrong average", 1.633122227722772e+05, dp.getVariable("value").value, 1e-6); } @Test public void testStdDev() throws Exception { DataProcessor dp = getDp(new Variable.STDDEV()); // rrdtools says 1.299157546152125e+06, but it might be wrong Assert.assertEquals("Wrong standard deviation", 1302434.1151546114, dp.getVariable("value").value, 1e-6); } @Test public void testStdDev2() throws Exception { DataProcessor dp = getDp2(new Variable.STDDEV()); // rrdtools says 1.040348817767271e+03, but it might be wrong Assert.assertEquals("Wrong standard deviation", 1048.0838597160848, dp.getVariable("value").value, 1e-6); } @Test public void testStdDev3() throws Exception { DataProcessor dp = getDp3(new Variable.STDDEV()); // rrdtools says 1.289630121109904e+06, but it might be wrong Assert.assertEquals("Wrong standard deviation", 1292834.1760384508, dp.getVariable("value").value, 1e-6); } @Test public void testLslSlope() throws Exception { DataProcessor dp = getDp(new Variable.LSLSLOPE()); // rrdtools says 4.823830423328765e+03 Assert.assertEquals("Wrong LSL slope", 4.823830423328765e+03, dp.getVariable("value").value, 1e-6); } @Test public void testLslSlope2() throws Exception { DataProcessor dp = getDp2(new Variable.LSLSLOPE()); // rrdtools says 5.289899606825209e+01 Assert.assertEquals("Wrong LSL slope", 5.289899606825209e+01, dp.getVariable("value").value, 1e-6); } @Test public void testLslSlope3() throws Exception { DataProcessor dp = getDp3(new Variable.LSLSLOPE()); // rrdtools says 4.684118512689442e+03 Assert.assertEquals("Wrong LSL slope", 4.684118512689442e+03, dp.getVariable("value").value, 1e-6); } @Test public void testLslInt() throws Exception { DataProcessor dp = getDp(new Variable.LSLINT()); // rrdtools says -3.117851918090452e+05 Assert.assertEquals("Wrong LSL y-intercept", -3.117851918090452e+05, dp.getVariable("value").value, 1e-6); } @Test public void testLslInt2() throws Exception { DataProcessor dp = getDp2(new Variable.LSLINT()); // rrdtools says 3.322001278772379e+03 Assert.assertEquals("Wrong LSL y-intercept", 3.322001278772379e+03, dp.getVariable("value").value, 1e-6); } @Test public void testLslInt3() throws Exception { DataProcessor dp = getDp3(new Variable.LSLINT()); // rrdtools says -3.121258062657012e+05 Assert.assertEquals("Wrong LSL y-intercept", -3.402305173418378e+05, dp.getVariable("value").value, 1e-6); } @Test public void testlslCorrel() throws Exception { DataProcessor dp = getDp(new Variable.LSLCORREL()); // rrdtools says 2.132982e-01 Assert.assertEquals("Wrong LSL Correlation Coefficient", 2.132982e-01, dp.getVariable("value").value, 1e-6); } @Test public void testlslCorrel2() throws Exception { DataProcessor dp = getDp2(new Variable.LSLCORREL()); // rrdtools says 9.980212206387034e-01 Assert.assertEquals("Wrong LSL Correlation Coefficient", 9.980212206387034e-01, dp.getVariable("value").value, 1e-6); } @Test public void testlslCorrel3() throws Exception { DataProcessor dp = getDp3(new Variable.LSLCORREL()); // rrdtools says 2.117961840477416e-01 Assert.assertEquals("Wrong LSL Correlation Coefficient", 2.117961840477416e-01, dp.getVariable("value").value, 1e-6); } }