我无法创建具有正确类型的文件。
我想念什么?
我的示例与https://code.google.com/p/rrd4j/wiki/Tutorial上的官方示例非常相似
RRD创建:
rrdDef.setStartTime(L - 300);
rrdDef.addDatasource("speed", DsType.GAUGE, 600, Double.NaN, Double.NaN);
rrdDef.addArchive(ConsolFun.MAX, 0.5, 1, 24);
rrdDef.addArchive(ConsolFun.MAX, 0.5, 6, 10);
我添加一些值:(每个步骤分别为1,2,3)
long x = L;
while (x <= L + 4200) {
Sample sample = rrdDb.createSample();
sample.setAndUpdate((x + 11) + ":1");
sample.setAndUpdate((x + 12) + ":2");
sample.setAndUpdate((x + 14) + ":3");
x += 300;
}
然后我获取它:
FetchRequest fetchRequest = rrdDb.createFetchRequest(ConsolFun.MAX, (L - 600), L + 4500);
FetchData fetchData = fetchRequest.fetchData();
String s = fetchData.dump();
我得到结果:(希望找到最大值)
920804100: NaN
920804400: NaN
920804700: +1.0000000000E00
920805000: +1.0166666667E00
920805300: +1.0166666667E00
...
920808600: +1.0166666667E00
920808900: +1.0166666667E00
920809200: NaN
我想在这里看到最大值。总计尝试过,我得到了相同的结果。
我必须更改什么,以便我一步获得最大的价值,或者一步就获得价值的总和。
谢谢
最佳答案
MAX不是最大值输入,而是最大合并数据点。举个例子,你对rrd的意思是
rrd现在具有3个数据点,覆盖300秒间隔的3秒。 rrd应该存储什么? 1 2 3以上都不是必须以某种方式对数据进行归一化,以表示X与X + STEP之间的比率为Y。
使事情变得复杂的是,不确定3个数据点是否以相同的300秒间隔到达。您的前两个数据点可能在一个间隔中,而4MPH可能在下一个间隔中。这是因为存储的起始数据点不完全是start + step。即如果您从14090812456开始,即使您的步骤是300,也可能类似于14090812700
用GAUGE存储精确输入值的唯一方法是在rrd存储数据点的精确步骤时间推送更新。我要在x处执行1MPH,在x + 300处执行2MPH,在x + 300处执行4MPH,其中x从第一个数据点开始。
这是一个bash示例,显示使用rrd设置进行此操作的过程,我使用的是恒定的开始时间,而x从我知道的rrd的第一个数据点开始。
L=1409080000
rrdtool create max.rrd --start=$L DS:speed:GAUGE:600:U:U RRA:MAX:0.5:1:24 RRA:MAX:0.5:6:10
x=$(($L+200))
while [ $x -lt $(($L+3000)) ]; do
rrdtool update max.rrd "$(($x)):1"
rrdtool update max.rrd "$(($x+300)):2"
rrdtool update max.rrd "$(($x+600)):3"
x=$(($x+900))
done
rrdtool fetch max.rrd MAX -r 600 -s 1409080000
speed
1409080200: 1.0000000000e+00
1409080500: 2.0000000000e+00
1409080800: 3.0000000000e+00
1409081100: 1.0000000000e+00
1409081400: 2.0000000000e+00
1409081700: 3.0000000000e+00
1409082000: 1.0000000000e+00
并不是真的有用,但是如果您将分辨率提高到1200秒,则会在更大的时间间隔内开始获得最大值
rrdtool fetch max.rrd MAX -r 1200 -s 1409080000
speed
1409081400: 3.0000000000e+00
1409083200: 3.0000000000e+00
1409085000: nan
1409086800: nan
1409088600: nan