31.05.2024, 05:58
(15.12.2023, 10:47)admin Wrote: This example will change all valid trend values by x2. Recommended way of testing is to create a new trend log with the same parameters as the source.
Code:infile = '/tmp/trends/t1.trend' outfile = '/tmp/trends/t7.trend' function adjust(value) value = value * 2 return value end ffi = require('ffi') function stringtodouble(chunk) local dbl = ffi.new('double[1]') ffi.copy(dbl, chunk, 8) return dbl[ 0 ] end function doubletostring(val) local dbl = ffi.new('double[1]') dbl[ 0 ] = val return ffi.string(dbl, 8) end info = require('rrd').info(infile) data = io.readfile(infile) offset = info.header_size buf = { data:sub(1, offset) } while true do chunk = data:sub(offset + 1, offset + 8) if #chunk == 8 then value = stringtodouble(chunk) -- skip NaN (empty/undefined value) if value == value then value = adjust(value) end buf[ #buf + 1 ] = doubletostring(value) else break end offset = offset + 8 end data = table.concat(buf) io.writefile(outfile, data)
For counter type the editing is trickier. The stored value is not the actual counter value but a per-second change rate. This example will log the maximum of all stored values without writing to a different trend log file. You can use this value for replacement in the previous script.
Code:infile = '/tmp/trends/t1.trend' max = 0 function check(value) max = math.max(max, value) end ffi = require('ffi') function stringtodouble(chunk) local dbl = ffi.new('double[1]') ffi.copy(dbl, chunk, 8) return dbl[ 0 ] end info = require('rrd').info(infile) data = io.readfile(infile) offset = info.header_size while true do chunk = data:sub(offset + 1, offset + 8) if #chunk == 8 then value = stringtodouble(chunk) -- skip NaN (empty/undefined value) if value == value then check(value) end else break end offset = offset + 8 end log(max)
Note that when replacing values you should not use direct comparison (==) for floating point values due to possible rounding errors.
Hi,
I've used this scripts to replace erroneus values (due to power losses...) on counter type trends, but I've seen that daily grouped values are still wrong.
Are this values calculated from hourly values? Or are stored? Is there any way to update them?