0

目的は、私のウェブサイトのユーザー数に関する統計を行うことです。現在のユーザー数と過去 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  

どこが間違っていますか?

4

1 に答える 1

1

あなたはData Normalizationに違反しています。

タイプ RRA は、LAST各 CDP (統合データ ポイント) を構成する PDP (プライマリ データ ポイント) の最後の値を保持していますが、2 つのことを忘れています。

まず、RRA は 1cdp = 1pdp となるように設定されているため、実際には統合はまったく行われません (この場合、統合する単一の PDP が提示された場合、LAST、MAX、MIN、および AVG はすべて同じことを行います)。 .

第 2 に、受信データは間隔の境界で受信されていないため、境界に収まるように正規化されています。

RRDtool の内部間隔は、常に GMT (UCT) の午前 0 時に基づいています。分単位または秒単位で測定された間隔を扱っている場合、これは大した問題ではありませんが、間隔は 1 日です。Calendar オブジェクトを使用して、基本の日付/時刻を「現在」として作成し、1 日ずつ増やしています。ただし、基本の日付と時刻は間隔の境界上にないため、値は 2 つの別々の間隔に分割され、データを取得するときに表示される小数が発生します。また、タイムゾーンが異なる可能性が高いため、真夜中は GMT の真夜中ではありません。

これがどのように機能するかの技術的な詳細については、データの正規化に関する Alex van den Bogaerdt のチュートリアルを参照してください。

于 2014-07-11T22:48:08.787 に答える