ConsolFun.LAST不返回最后的值

时间:2014-07-10 13:47:34

标签: rrdtool rrd

目的是统计我网站的用户数。我想显示当前用户数和之前10天的用户数。 这是我做的一个测试:

RrdDef rrdDef = new RrdDef("test", 60*60*24);
rrdDef.setStartTime(Util.getTime() - 60*60*24*11);
rrdDef.addDatasource(Stats.USER_COUNT.name(), DsType.GAUGE, 60*60*24, 0.0, Double.NaN);
rrdDef.addArchive(ConsolFun.LAST, 0.5, 1, 10);
RrdDb rrdDb = new RrdDb(rrdDef);
rrdDb.close();

rrdDb = new RrdDb("test");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -7);
rrdDb.createSample().setAndUpdate(String.format("%d:%d", (Util.getTimestamp(cal)), 1));
cal.add(Calendar.DATE, 1);
rrdDb.createSample().setAndUpdate(String.format("%d:%d", (Util.getTimestamp(cal)), 2));
cal.add(Calendar.DATE, 1);
rrdDb.createSample().setAndUpdate(String.format("%d:%d", (Util.getTimestamp(cal)), 3));
cal.add(Calendar.DATE, 1);
rrdDb.createSample().setAndUpdate(String.format("%d:%d", (Util.getTimestamp(cal)), 4));
cal.add(Calendar.DATE, 1);
rrdDb.createSample().setAndUpdate(String.format("%d:%d", (Util.getTimestamp(cal)), 5));
cal.add(Calendar.DATE, 1);
rrdDb.createSample().setAndUpdate(String.format("%d:%d", (Util.getTimestamp(cal)), 6));
cal.add(Calendar.DATE, 1);
rrdDb.createSample().setAndUpdate(String.format("%d:%d", (Util.getTimestamp(cal)), 7));
rrdDb.close();

rrdDb = new RrdDb("test");
FetchRequest fetchRequest = rrdDb.createFetchRequest(ConsolFun.LAST, Util.getTime() - 60*60*24*7, Util.getTime());
FetchData fetchData = fetchRequest.fetchData();
System.out.println(fetchData.dump());
rrdDb.close();

这是输出

1404345600:  NaN  
1404432000:  +2.0000000000E00  
1404518400:  +2.4654861111E00  
1404604800:  +3.4654861111E00  
1404691200:  +4.4654861111E00  
1404777600:  +5.4654861111E00  
1404864000:  +6.4654861111E00  
1404950400:  NaN  
1405036800:  NaN  

这是我所期待的

1404345600:  NaN  
1404432000:  +1.0000000000E00  
1404518400:  +2.0000000000E00  
1404604800:  +3.0000000000E00  
1404691200:  +4.0000000000E00 
1404777600:  +5.0000000000E00 
1404864000:  +6.0000000000E00 
1404950400:  +7.0000000000E00 
1405036800:  NaN  

我哪里错了?

1 个答案:

答案 0 :(得分:1)

您正在与数据规范化发生冲突。

虽然LAST类型RRA保留了构成每个CDP(统一数据点)的最后一个PDP(主要数据点)的值,但您忘记了两件事。

首先,由于您的RRA设置为1cdp = 1pdp,实际上根本没有合并(在这种情况下,LAST,MAX,MIN和AVG在提供单个PDP时都会做同样的事情巩固)。

其次,您的输入数据不会进入区间边界,因此正在标准化以适应边界。

RRDtool中的内部间隔始终基于GMT(UCT)午夜;如果您处理以分钟或秒为单位测量的间隔,这并不重要,但您的间隔是一整天。您正在使用Calendar对象将基准日期/时间创建为“现在”,然后一次递增一天。但是,您的基准日期和时间不在间隔边界上,因此该值最终会在两个单独的间隔之间分割,从而导致在获取数据时看到的小数;你的时区可能也不同,所以你的午夜不是格林尼治标准时间的午夜。

有关其工作原理的详细信息,请参阅Alex van den Bogaerdt's tutorial on Data Normalisation