目的是统计我网站的用户数。我想显示当前用户数和之前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
我哪里错了?
答案 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。