Search code examples
rrdtool

RRD Tool Graph data is different between weekly and monthly


When I generate a graph for weekly, the value is 4 but when I generate for monthly, the value is about 2.1

I try to fetch the data and the value is 4. data is the same when fetching with the timestamp for a week/month

Weekly_Graph

Monthly_Graph

My rrd info:

filename = "icscf_1_tpip_total.rrd"
rrd_version = "0003"
step = 900
last_update = 1610441186
header_size = 6176
ds[max_in].index = 2
ds[max_in].type = "GAUGE"
ds[max_in].minimal_heartbeat = 1000
ds[max_in].min = NaN
ds[max_in].max = NaN
ds[max_in].last_ds = "2.0"
ds[max_in].value = 1.7200000000e+02
ds[max_in].unknown_sec = 0
rra[0].cf = "AVERAGE"
rra[0].rows = 96
rra[0].cur_row = 85
rra[0].pdp_per_row = 1
rra[0].xff = 0.0000000000e+00
rra[0].cdp_prep[2].value = NaN
rra[0].cdp_prep[2].unknown_datapoints = 0
rra[1].cf = "AVERAGE"
rra[1].rows = 96
rra[1].cur_row = 34
rra[1].pdp_per_row = 1
rra[1].xff = 0.0000000000e+00
rra[1].cdp_prep[2].value = NaN
rra[1].cdp_prep[2].unknown_datapoints = 0
rra[2].cf = "AVERAGE"
rra[2].rows = 2880
rra[2].cur_row = 1828
rra[2].pdp_per_row = 1
rra[2].xff = 0.0000000000e+00
rra[2].cdp_prep[2].value = NaN
rra[2].cdp_prep[2].unknown_datapoints = 0
rra[3].cf = "MAX"
rra[3].rows = 52
rra[3].cur_row = 43
rra[3].pdp_per_row = 672
rra[3].xff = 0.0000000000e+00
rra[3].cdp_prep[2].value = 4.0000000000e+00
rra[3].cdp_prep[2].unknown_datapoints = 489

My RRD command: Weekly:

rrdtool graph /.../Maximum_incoming_call.png 
--start 1610104905 
--end 1610709705 
--title Maximum_incoming_call 
--lower-limit 0 
--alt-autoscale-max 
--slope-mode 
--units=si 
--alt-y-grid TEXTALIGN:left COMMENT:"1 G = 1.000.000.000 | 1 M = 1.000.000 | 1 k = 1.000 \n"  
DEF:test0="/..../icscf_1_tpip_total.rrd":max_in:AVERAGE 
LINE:test0#FF0000:"tpip total" 
--width 600 
--height 352

Monthly:

rrdtool graph
/.../Maximum_incoming_call.png
--start 1608117756 
--end 1610709756 
--title Maximum_incoming_call 
--lower-limit 0 
--alt-autoscale-max 
--slope-mode 
--units=si 
--alt-y-grid TEXTALIGN:left COMMENT:"1 G = 1.000.000.000 | 1 M = 1.000.000 | 1 k = 1.000 \n"
DEF:test0="/..../icscf_1_tpip_total.rrd":max_in:AVERAGE 
LINE:test0#FF0000:"tpip total" 
--width 600 
--height 352

I don't know why It's working good for weekly but monthly is display only a half like in the imagine.

My rrdtool fetch:

rrdtool fetch icscf_1_tpip_total.rrd AVERAGE --start 1610104905 --end 1610709705
                max_in 
.....
1610418600:  4.0000000000e+00
.....


rrdtool fetch icscf_1_tpip_total.rrd AVERAGE --start 1608117756 --end 1610709756
                    max_in  
....   
1610418600: 4.0000000000e+00  
....

Solution

  • This is because of implicit averaging in your graph.

    First, lets leave aside the question of why your RRA 0, 1 and 2 are all of type AVERAGE with 1cdp=1pdp. Your RRA 0 and 1 are totally superfluous. You may want to review how you create your RRD file.

    When you do a rrdtool graph then you're going to be using the 1cdp=1pdp RRA, which is in effect the raw data. However, once the data width gets larger than 1cdp per pixel, RRDTool will implicitly consolodate the data before displaying.

    If you're showing a weekly graph, then you'll end up with 1 pixel per cdp (well actually 672 cdp for 600 pixels, but its close enough), and so you'll be displaying the stored value in the RRA (in this case, 4.0). However, when you do it for a month, you'll have 4 times as many samples but the same number of pixels. Thus, your displayed pixels will in fact be the average of 4 data points (well, 4.48cdp to be precise). This means that, if the data are irregular, it will smooth out the data and you'll get lower peaks, which is what you're seeing (a value of 2.1 in your example).

    When you do a rrdtool fetch then you're pulling the data straight from the RRA without consolodation (unless you explicitly request it). So, in this case, you see the 4.0 again.

    What to do about this depends on what you want to see. Since you have a MAX RRA at the higher resolution, you have a few options -

    • Graph two lines for your monthly graph - an AVERAGE, and a MAX. You may also want to add a MIN RRA and show that line, depending on how spiky tha data are.
    • Use your AVERAGE RRA, but explicitly tell RRDTool (in the DS definition) to use MAX as the secondary consolodation method. This is not so good as it gives a misleadingly high value but it is more what you're expecting to see
    • Keep it this way, and add some text to explain the data have been averages over the graph pixel time interval
    • Make the graph 4x wider so that the number of pixels again matches the number of cdp and additional consolodation is not required