Rrdtool info
Jump to navigation
Jump to search
Landing point for RRD commands and examples
print the base info from an RRD database
- Looks like a cheap way to get last values from the database possibly to store for status dashboard without the graph generation
- This should be easily parsed in both bash and PHP for ds[NAME].last_ds
info
rrdtool info /opt/nmsApi/rrd/database.rrd filename = "/opt/nmsApi/rrd/database.rrd" rrd_version = "0003" step = 1 last_update = 1685326405 header_size = 1472 ds[temperature].index = 0 ds[temperature].type = "GAUGE" ds[temperature].minimal_heartbeat = 600 ds[temperature].min = 0.0000000000e+00 ds[temperature].max = 1.0000000000e+02 ds[temperature].last_ds = "31" ds[temperature].value = 1.4787341000e+01 ds[temperature].unknown_sec = 0 ds[humidity].index = 1 ds[humidity].type = "GAUGE" ds[humidity].minimal_heartbeat = 600 ds[humidity].min = 0.0000000000e+00 ds[humidity].max = 1.0000000000e+02 ds[humidity].last_ds = "65" ds[humidity].value = 3.1005715000e+01 ds[humidity].unknown_sec = 0 rra[0].cf = "AVERAGE" rra[0].rows = 3600 rra[0].cur_row = 3151 rra[0].pdp_per_row = 1 rra[0].xff = 5.0000000000e-01 rra[0].cdp_prep[0].value = NaN rra[0].cdp_prep[0].unknown_datapoints = 0 rra[0].cdp_prep[1].value = NaN rra[0].cdp_prep[1].unknown_datapoints = 0 rra[1].cf = "AVERAGE" rra[1].rows = 720 rra[1].cur_row = 501 rra[1].pdp_per_row = 60 rra[1].xff = 5.0000000000e-01 rra[1].cdp_prep[0].value = 7.7500000000e+02 rra[1].cdp_prep[0].unknown_datapoints = 0 rra[1].cdp_prep[1].value = 1.6250000000e+03 rra[1].cdp_prep[1].unknown_datapoints = 0 rra[2].cf = "AVERAGE" rra[2].rows = 24 rra[2].cur_row = 8 rra[2].pdp_per_row = 3600 rra[2].xff = 5.0000000000e-01 rra[2].cdp_prep[0].value = 2.4260961332e+04 rra[2].cdp_prep[0].unknown_datapoints = 0 rra[2].cdp_prep[1].value = 5.2791045244e+04 rra[2].cdp_prep[1].unknown_datapoints = 0
lastupdate
rrdtool lastupdate ../../rrd/database.rrd temperature humidity 1685328961: 31 65
last
Simply the last timestamp updated
rrdtool last ../../rrd/database.rrd 1685328961
Retrieve last set of metrics insrted
rrdtool lastupdate snmp/snmp-300.rrd Monitors Devices Time Memory 1685745404: 16 103 36 6291456
fetch
rrdtool fetch ../rrd/guyver-office.iwillfearnoevil.com/snmp/lm-sensors/temp.temp1_32.rrd AVERAGE -s "-1h" -e "now" -r 300 temp 1695225600: 3.0000000000e+01 1695225900: 3.0000000000e+01 1695226200: 3.0000000000e+01 1695226500: 3.0000000000e+01 1695226800: 3.0209333863e+01 1695227100: 3.1216119053e+01 1695227400: 3.1805992683e+01 1695227700: 3.0786713690e+01 1695228000: 3.0000000000e+01 1695228300: 3.0000000000e+01 1695228600: 3.0207707653e+01 1695228900: -nan 1695229200: -nan
Convert scientific to decimal
convert-scientific-notation-to-decimal-in-bash
printf "%.0f\n" 3.0207707653e+01 30
Convert fetch to csv
It is critical to note that this will only work when there is one DS in the rrd file. When there are multiple you will have to build an array from line one of the result and then have awk parse that any fields in to match to the data in the return.
- a logical way to do this is take the entire result into memory and begin from there
- line 1 will have every name defined for different DS
- ignore ^$ lines
- ignore nan in the colums when filtering
- Get column names parsable (remove leading whitespace AND all multispaces down to a single one for AWK to parse)
rrdtool fetch ../rrd/guyver-office.iwillfearnoevil.com/snmp/interfaces/enp2s0_64.rrd MAX -s "-10m" -e "now" -r 300 | head -1 | sed 's/^[[:space:]]*//g' | tr -s " "
InMulticastPkts InBroadcastPkts OutMulticastPkts OutBroadcastPkts HCInOctets HCInUcastPkts HCInMulticastPkts HCInBroadcastPkts HCOutOctets HCOutUcastPkts HCOutMulticastPkts HCOutBroadcastPkts HighSpeed PromiscuousMode ConnectorPresent
IFS=$'\n'; for x in $(rrdtool fetch ../rrd/guyver-office.iwillfearnoevil.com/snmp/lm-sensors/temp.temp1_32.rrd AVERAGE -s "-1h" -e "now" -r 300| grep ': '| grep -v 'nan'); do w=$(echo "$x" | awk -F ':' '{print $1}') ; y=$(echo "$x" | awk -F ':' '{print $2}') ; echo $w,$(printf "%.0f\n" $y) ; done 1695227400,32 1695227700,31 1695228000,30 1695228300,30 1695228600,30 1695228900,31 1695229200,31 1695229500,30 1695229800,31 1695230100,31 1695230400,31
IFS=$'\n'; for x in $(rrdtool fetch ../rrd/guyver-office.iwillfearnoevil.com/snmp/lm-sensors/temp.temp1_32.rrd AVERAGE -s "-1h" -e "now" -r 300| grep ': '| grep -v 'nan'); do w=$(echo "$x" | awk -F ':' '{print $1}') ; w=$(date -d @$w); y=$(echo "$x" | awk -F ':' '{print $2}') ; echo $w,$(printf "%.0f\n" $y) ; done Wed 20 Sep 2023 04:30:00 PM UTC,32 Wed 20 Sep 2023 04:35:00 PM UTC,31 Wed 20 Sep 2023 04:40:00 PM UTC,30 Wed 20 Sep 2023 04:45:00 PM UTC,30 Wed 20 Sep 2023 04:50:00 PM UTC,30 Wed 20 Sep 2023 04:55:00 PM UTC,31 Wed 20 Sep 2023 05:00:00 PM UTC,31 Wed 20 Sep 2023 05:05:00 PM UTC,30 Wed 20 Sep 2023 05:10:00 PM UTC,31 Wed 20 Sep 2023 05:15:00 PM UTC,31 Wed 20 Sep 2023 05:20:00 PM UTC,31
Convert to JSON
rrdtool xport --json --start now-1h --end now DEF:fan=fan.fan1_32.rrd:fan:AVERAGE XPORT:fan --showtime { "about": "RRDtool graph JSON output", "meta": { "start": 1727371200, "end": 1727374800, "step": 300, "legend": [ "" ] }, "data": [ [ "1727371200",2.8960000000e+03 ], [ "1727371500",2.8960000000e+03 ], [ "1727371800",2.8960000000e+03 ], [ "1727372100",2.8960000000e+03 ], [ "1727372400",2.8891653003e+03 ], [ "1727372700",2.8908181858e+03 ], [ "1727373000",2.8960000000e+03 ], [ "1727373300",2.8960000000e+03 ], [ "1727373600",2.8960000000e+03 ], [ "1727373900",2.8891648018e+03 ], [ "1727374200",2.8909310896e+03 ], [ "1727374500",2.8889064067e+03 ], [ "1727374800",null ] ] }
Convert Scientific Notation to Decimal
This is already in decimal, just not the way we are used to looking at it. In theory bc should have been able to do the conversion without the sed, but at least in my bc it just spews an error. Note that bc is not going to honor the scale=# arg when converting this value.
echo "2.8900479457e+03" | sed 's/[eE]+*/\ *10\^/' | bc Sed conversion works out to (2.8900479457 *10^03) 2890.0479457000