Skip to content

Instantly share code, notes, and snippets.

@gonzafirewall
Forked from arantius/simple-rrd-merge.py
Last active August 29, 2015 14:03
Show Gist options
  • Save gonzafirewall/391e3014ded6faaf02eb to your computer and use it in GitHub Desktop.
Save gonzafirewall/391e3014ded6faaf02eb 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):
if rrdname.endswith('xml'):
with open(rrdname, 'r+') as f:
p = f.readlines()
p = subprocess.Popen(
('rrdtool', 'dump', rrdname), stdout=subprocess.PIPE).stdout
for j, line in enumerate(p):
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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment