-
-
Save arantius/2166343 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
"""Simple script to merge multiple RRD files together. | |
Accepts any number of RRD file names as arguments. Produces an "rrdtool dump" | |
style file on stdout. The last RRD file should have a slot for every possible | |
record in the resulting merged RRD. | |
Run something like: | |
$ python simple-merge-rrd.py filea.rrd fileb.rrd filec.rrd | \ | |
rrdtool restore /dev/stdin merged.rrd | |
""" | |
import re | |
import subprocess | |
import sys | |
def main(): | |
rrd_data = {} | |
rrds = sys.argv[1:] | |
last_rrd = len(rrds) - 1 | |
for i, rrdname in enumerate(rrds): | |
p = subprocess.Popen( | |
('rrdtool', 'dump', rrdname), stdout=subprocess.PIPE) | |
for j, line in enumerate(p.stdout): | |
m = re.search(r'<cf>(.*)</cf>', line) | |
if m: | |
cf = m.group(1) | |
m = re.search(r'<pdp_per_row>(.*)</pdp_per_row>', line) | |
if m: | |
pdp = m.group(1) | |
m = re.search(r' / (\d+) --> (.*)', line) | |
if m: | |
k = cf + pdp | |
rrd_data.setdefault(k, {}) | |
if ('NaN' not in m.group(2)) or ( | |
m.group(1) not in rrd_data[k]): | |
rrd_data[k][m.group(1)] = line | |
line = rrd_data[k][m.group(1)] | |
if i == last_rrd: | |
print line.rstrip() | |
if __name__ == '__main__': | |
main() |
Well, first, the files need to actually exist. The first through second-to-last should be the sources, possibly overlapping in time, to be combined. The last should be a larger set, going back far enough to contain all of the data for the earlier files. Probably by "rrdtool resize ... GROW" on the newest file.
Hi,
Would you happen to still have a copy of the perl script (rrd_merger.pl) you referred to at http://stackoverflow.com/questions/9816139/merge-multiple-rrds-over-time ?
I would like to have a look at this script, and possibly fix it, but I'm having difficulty finding a copy.
many thanks,
Darren
Thanks a lot, works like a charm 😃
Thanks pal for your fantastic work, you saved my life today!
This script made my day! Awesome! :)
This tool does not properly work with RRDs generated by smokeping.
The reason is apparently that smokeping RRD's have "uptime" record that is NaN all the time.
to merge smokeping RRDs, we need to check if all columns are "NaN", not only one (since that test will always be true).
Thx for the script :)
Used it to merge munin history (not beautiful at all): https://gist.github.com/TuningYourCode/d1edb8b525bcc46dcafe308c030f742a
Worked great for combining nagiosgraph!
simple-rrd-merge.py PING*pl.rrd | rrdtool restore /dev/stdin pl.rrd
Thank you for this @arantius, worked perfectly.
thank you , it is working properly
hi . i use this command as below
python simple-rrd-merge.py old/pop_site_tavanir04_traffic_in_28871.rrd new/pop_site_tavanir04_traffic_in_28871.rrd | rrdtool restore /dev/stdin merged.rrd
but i got this error:
ERROR: mmaping file 'old/pop_site_tavanir04_traffic_in_28871.rrd': Invalid argument
i want to merge rrd file because i have gap between out graph
Hi! Using the tool as below:
./rrd_merge.py var/pnp4nagios/perfdata/host1/CPU_load_load1.rrd CPU_load_load1.rrd | rrdtool restore /dev/stdin merged.rrd
I got this error:
File "rrd_merge.py", line 45
print line.rstrip()
^
SyntaxError: invalid syntax
/dev/stdin:1: parser error : Extra content at the end of the document
^
ERROR: error reading/parsing XML: Extra content at the end of the document
In my case the problem was python3
As I haven't the permission to do a "PR" I forked this git.
The changes are available here:
https://gist.github.com/m3rlinux/e0ebe1fba39789f27209577cf4a08685
Indeed, this script is over 10 years old and was written for Python 2.
Yes! But it works like a charm with little changes ;)
It works perfect! Thank you!
how to work this scipt ?
Usage:simple-rrd-merge.py
ex : simple-rrd-merge.py old.rrd new.rrd merged.rrd
i use this not working .
ERROR: opening 'argo.rrd': No such file or directory