I’ve been using graphite and statsd lately, and over lunch quickly whipped up this script to download/upload dashboard configurations to/from a graphite server. Here’s the code, use as you wish.
#!/usr/bin/env python
#
# Author: Dustin Spicuzza
#
# Use this script to download/upload dashboards to/from a graphite server.
#
import json
import sys
import urllib
import urllib2
download_url = 'http://%s/dashboard/load/%s'
upload_url = 'http://%s/dashboard/save/%s'
def download(ip, name, fname):
uf = urllib2.urlopen('http://%s/dashboard/load/%s' % (ip, name))
data = json.loads(urllib2.unquote(uf.read()))
data_str = json.dumps(data['state'], sort_keys=True, indent=4, separators=(',',': '))
if fname == None:
print data_str
else:
with open(fname, 'w') as fp:
fp.write(data_str)
return 0
def upload(ip, name, fname):
if fname is None:
data_str = sys.stdin.read()
else:
with open(fname, 'r') as fp:
data_str = fp.read()
data = json.loads(data_str)
if data['name'] != name:
print "ERROR: dashboard name doesn't match name in state file"
return 1
post_data = urllib.urlencode([('state', json.dumps(data))])
request = urllib2.Request(upload_url % (ip, name), post_data)
request.add_header("Content-type", "application/x-www-form-urlencoded")
print urllib2.urlopen(request).read()
return 0
def usage():
print "Usage: dasher.py [upload graphite_host name filename] | [download graphite_host name [filename]]"
exit(1)
if __name__ == '__main__':
if len(sys.argv) < 4:
usage()
action = sys.argv[1]
ip = sys.argv[2]
name = sys.argv[3]
fname = None
if len(sys.argv) > 4:
fname = sys.argv[4]
if action == 'upload':
retval = upload(ip, name, fname)
elif action == 'download':
retval = download(ip, name, fname)
else:
usage()
exit(retval)