Skip to content

Instantly share code, notes, and snippets.

@sklump
Forked from yalinhuang/simple-rrd-merge.py
Last active February 9, 2018 17:37
Show Gist options
  • Save sklump/c1d8dc7b13d78f70209cb5fa516d043d to your computer and use it in GitHub Desktop.
Save sklump/c1d8dc7b13d78f70209cb5fa516d043d 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 (m.group(1) not in rrd_data[k]) or (
'NaN' in rrd_data[k][m.group(1)]): # Fill in only when there is no existing data
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()
@sklump
Copy link
Author

sklump commented Feb 9, 2018

Fixed tiny bug: update when 'NaN' in the content of the line, not the dict keyset.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment