[rrd-developers] [PATCH] time offset
Zou Guangxian
trueweck at 163.com
Tue Nov 25 11:02:26 CET 2008
Hi!
create the rrdtool with the following statement, I wanna to store the data
from '00:00' of the day, and hope to store values at '00:00' everyday with
"RRA:LAST:0.5:288:37200". but after fetch the data, I found it will output
the value with timestamp '08:00' in that day.
[CODE]
#!/bin/sh
start=`date +'00:00 %m/%e/%Y'`
/usr/bin/rrdtool create $1.rrd \
--start "$start" \
--step 300 \
DS:total:GAUGE:600:0:U \
DS:new:GAUGE:600:0:U \
RRA:LAST:0.5:1:288 \
RRA:LAST:0.5:12:720 \
RRA:LAST:0.5:288:37200 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:37200
[/CODE]
this problem is caused by the lines in rrd_fetch.c:
243 cal_end = (rrd.live_head->last_up - (rrd.live_head->last_up
244 %
(rrd.rra_def[i].pdp_cnt
245 *
246 rrd.stat_head->
248 pdp_step)));
pdp_step = 300, pdp_cnt = 288, so pdp_cnt* pdp_step = 86400.
0 seconds since 1970-1-1 0:0:0 UTC, but it is also since 1970-1-1 8:0:0 CST.
For example,
2008-11-25 0: 0: 0 CST= 1227542400,
1227542400 % 86400 = 57600,
1227542400 - 57600 = 1227484800 = 2008-11-24 8: 0: 0: 0 CST.
Even set timezone to UTC+0, but rrd start from 1:00,
"RRA:LAST:0.5:288:37200 " still can't produce data at 1:00 everyday. I hope
it should generate a data every 86400 from the start time. the following
patch will add create_time field to rrd database, and time calculation will
based on create_time.
[CODE]
diff -Nur rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_create.c
rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_create.c
--- rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_create.c Sun Oct 5 00:04:04
2008
+++ rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_create.c Tue Nov 25 17:08:12 2008
@@ -152,6 +152,7 @@
rrd.rra_def = NULL;
rrd.live_head->last_up = last_up;
+ rrd.stat_head->create_time = last_up;
/* optind points to the first non-option command line arg,
* in this case, the file name. */
@@ -708,7 +709,7 @@
rrd->pdp_prep->scratch[PDP_val].u_val = 0.0;
rrd->pdp_prep->scratch[PDP_unkn_sec_cnt].u_cnt =
- rrd->live_head->last_up % rrd->stat_head->pdp_step;
+ (rrd->live_head->last_up - rrd->stat_head->create_time) %
rrd->stat_head->pdp_step;
for (i = 0; i < rrd->stat_head->ds_cnt; i++)
write(rrd_file, rrd->pdp_prep, sizeof(pdp_prep_t));
@@ -745,7 +746,7 @@
rrd->cdp_prep->scratch[CDP_val].u_val = DNAN;
/* startup missing pdp count */
rrd->cdp_prep->scratch[CDP_unkn_pdp_cnt].u_cnt =
- ((rrd->live_head->last_up -
+ ((rrd->live_head->last_up - rrd->stat_head->create_time -
rrd->pdp_prep->scratch[PDP_unkn_sec_cnt].u_cnt)
% (rrd->stat_head->pdp_step
* rrd->rra_def[i].pdp_cnt)) / rrd->stat_head->pdp_step;
diff -Nur rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_dump.c
rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_dump.c
--- rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_dump.c Sun Oct 5 00:04:04
2008
+++ rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_dump.c Tue Nov 25 17:08:20 2008
@@ -96,6 +96,14 @@
fprintf(out_file, "\t<step> %lu </step> <!-- Seconds -->\n",
rrd.stat_head->pdp_step);
#if HAVE_STRFTIME
+ localtime_r(&rrd.stat_head->create_time, &tm);
+ strftime(somestring, 200, "%Y-%m-%d %H:%M:%S %Z", &tm);
+#else
+# error "Need strftime"
+#endif
+ fprintf(out_file, "\t<createtime> %lu </createtime> <!-- %s
-->\n\n",
+ (unsigned long) rrd.stat_head->create_time, somestring);
+#if HAVE_STRFTIME
localtime_r(&rrd.live_head->last_up, &tm);
strftime(somestring, 200, "%Y-%m-%d %H:%M:%S %Z", &tm);
#else
@@ -393,7 +401,7 @@
ii = 0; /* wrap if max row cnt is reached */
}
now = (rrd.live_head->last_up
- - rrd.live_head->last_up
+ - (rrd.live_head->last_up -
rrd.stat_head->create_time)
% (rrd.rra_def[i].pdp_cnt * rrd.stat_head->pdp_step))
+ (timer * rrd.rra_def[i].pdp_cnt *
rrd.stat_head->pdp_step);
diff -Nur rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_fetch.c
rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_fetch.c
--- rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_fetch.c Sun Oct 5 00:04:04
2008
+++ rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_fetch.c Tue Nov 25 17:08:30 2008
@@ -240,7 +240,7 @@
for (i = 0; (unsigned) i < rrd.stat_head->rra_cnt; i++) {
if (cf_conv(rrd.rra_def[i].cf_nam) == cf_idx) {
- cal_end = (rrd.live_head->last_up - (rrd.live_head->last_up
+ cal_end = (rrd.live_head->last_up - ((rrd.live_head->last_up -
rrd.stat_head->create_time)
% (rrd.rra_def[i].pdp_cnt
*
rrd.stat_head->
@@ -310,8 +310,8 @@
/* set the wish parameters to their real values */
*step = rrd.stat_head->pdp_step * rrd.rra_def[chosen_rra].pdp_cnt;
- *start -= (*start % *step);
- *end += (*step - *end % *step);
+ *start -= (((*start) - rrd.stat_head->create_time) % *step);
+ *end += (*step - ((*end) - rrd.stat_head->create_time) % *step);
rows = (*end - *start) / *step + 1;
#ifdef DEBUG
@@ -341,11 +341,11 @@
/* find start and end offset */
rra_end_time = (rrd.live_head->last_up
- - (rrd.live_head->last_up % *step));
+ - ((rrd.live_head->last_up -
rrd.stat_head->create_time) % *step));
rra_start_time = (rra_end_time
- (*step * (rrd.rra_def[chosen_rra].row_cnt - 1)));
/* here's an error by one if we don't be careful */
- start_offset = (long) (*start + *step - rra_start_time) / (long) *step;
+ start_offset = (long)(((double)(*start)/(long)*step) + 1 -
((double)(rra_start_time)/(long)*step));
end_offset = (long) (rra_end_time - *end) / (long) *step;
#ifdef DEBUG
fprintf(stderr,
diff -Nur rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_format.h
rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_format.h
--- rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_format.h Sun Oct 5 00:04:04
2008
+++ rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_format.h Tue Nov 25
17:08:42 2008
@@ -117,6 +117,7 @@
char version[5]; /* version of the format */
double float_cookie; /* is it the correct double
* representation ? */
+ time_t create_time; /* when was rrd created */
/* Data Base Structure Definition **** */
unsigned long ds_cnt; /* how many different ds provide
diff -Nur rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_restore.c
rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_restore.c
--- rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_restore.c Sun Oct 5 00:04:04
2008
+++ rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_restore.c Tue Nov 25
17:08:52 2008
@@ -872,6 +872,9 @@
else if (xmlStrcmp(child->name, (const xmlChar *) "step") == 0)
status = get_int_from_node(doc, child,
(int *) &rrd->stat_head->pdp_step);
+ else if (xmlStrcmp(child->name, (const xmlChar *)
"createtime") == 0)
+ status = get_int_from_node(doc, child,
+ (int *)
&rrd->stat_head->create_time);
else if (xmlStrcmp(child->name, (const xmlChar *) "lastupdate") ==
0)
status = get_int_from_node(doc, child,
(int *) &rrd->live_head->last_up);
diff -Nur rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_update.c
rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_update.c
--- rrdtool-1.3.4/rrdtool-1.3.4/src/rrd_update.c Sun Oct 5 00:04:04
2008
+++ rrdtool-1.3.4_/rrdtool-1.3.4/src/rrd_update.c Tue Nov 25
17:08:56 2008
@@ -1131,11 +1131,11 @@
unsigned long occu_pdp_age; /* how long ago was the last pdp_step time
*/
/* when was the current pdp started */
- proc_pdp_age = rrd->live_head->last_up % rrd->stat_head->pdp_step;
+ proc_pdp_age = (rrd->live_head->last_up -
rrd->stat_head->create_time) % rrd->stat_head->pdp_step;
proc_pdp_st = rrd->live_head->last_up - proc_pdp_age;
/* when did the last pdp_st occur */
- occu_pdp_age = current_time % rrd->stat_head->pdp_step;
+ occu_pdp_age = (current_time - rrd->stat_head->create_time) %
rrd->stat_head->pdp_step;
occu_pdp_st = current_time - occu_pdp_age;
if (occu_pdp_st > proc_pdp_st) {
[/CODE]
--
zou guangxian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.oetiker.ch/pipermail/rrd-developers/attachments/20081125/b195599f/attachment-0001.html
More information about the rrd-developers
mailing list