2014-07-10 2 views
0

목적은 내 웹 사이트의 사용자 수에 대한 통계를 작성하는 것입니다. 현재 사용자 수 및 이전 10 일 사용자 수를 표시하려고합니다. 나는 내가 잘못ConsolFun.LAST가 마지막 값을 반환하지 않습니다.

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 

을 기대하고 있었는지 여기

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 

입니다된다 여기에 내가했던 테스트는?

답변

1

데이터 정규화이 떨어지고 있습니다.

LAST 유형의 RRA는 각 CDP (통합 데이터 요소)를 구성하는 마지막 PDP (기본 데이터 점)의 값을 보유하고 있지만 두 가지를 잊었습니다.

먼저 RRA가 1cdp = 1pdp가되도록 설정되었으므로 실제로 통합이 이루어지지 않습니다 (이 경우 LAST, MAX, MIN 및 AVG는 모두 하나의 PDP 통합).

두 번째로 들어오는 데이터는 간격 경계에 들어오지 않으므로 경계에 맞게 정규화됩니다.

RRDtool의 내부 간격은 항상 GMT (UCT) 자정을 기준으로합니다. 분 또는 초 단위로 측정 된 간격을 처리하는 경우에는 별 문제가되지 않지만 간격은 하루 종일입니다. Calendar 객체를 사용하여 기본 날짜/시간을 'now'로 생성 한 다음 한 번에 하나씩 증가시킵니다. 그러나 기본 날짜와 시간은 간격 경계에 있지 않으므로 데이터를 가져올 때 볼 수있는 십진수를 일으키는 값이 두 개의 개별 간격으로 분할됩니다. 또한 시간대가 다를 수 있으므로 자정은 GMT의 자정이 아닙니다.

어떻게 작동하는지에 대한 자세한 기술 정보는 Alex van den Bogaerdt's tutorial on Data Normalisation을 참조하십시오.

관련 문제