cacti_db.py is a script which will clone an existing data-template and graph-template for multiple (host,rrd_file,template) instances.
In the scenario it was created for, data is (externally) collected into a (directory) tree of RRD files. While there are only a handful of unique RRD file and graph types, there are a large number of instances of those templates. Good examples of this are:
- cpu load
- 1,5,15 minute averages
- 1 per machine
- disk util
- avail, used, free
- ~5 per machine
- cache stats
- (hit, miss, size) stats
- 2 .. 20 caches/”node”, depending type.
This collected data might exist in the following tree of RRD files:
/servers/hostA/cpu.rrd /servers/hostA/disk/root.rrd /servers/hostA/disk/usr.rrd /servers/hostA/disk/data/logs.rrd /node/nodeA/cache/foo.rrd /node/nodeA/cache/bar.rrd […15 more caches…]
Cacti has the following templates manually configured:
/servers//cpu /servers//disk /node/*/_cache
The script, then, knows how to relate RRD files of the regex pattern
r'''/servers/([^/]+)/cpu''' to the template(s) “/servers/*/cpu”, using the
regexp group 1 as the name of the host; edit the ‘
rrd_types‘ global to suit
Instances are named as their RRD file name (yes, skipping Cacti’s own
The script will delete instances with the same name, allowing you to re-run it pretty liberally to pick up new rrd files, changes in templates, &c.
The process of cloning is as follows; see
execute_plan_alpha(...)‘ in the script for the gory details.
- find the host in table ‘
- data template instantiation
- find the data template id (by name) in ‘
- if an instance with the name already exists: delete it.
- insert into data_local, get new (autoinc) id for the instance.
- get the list of rrd DSes from the template (from ‘
- copy each, maintaining the instance -> template id map.
- instantiate the data_template itself (‘
- copy the RRAs as well (‘
- graph instantiation
- get the graph_template_id (by name) from ‘
- insert into ‘
graph_local‘, get autoinc id.
- instantiate graph (‘
- copy ‘
graph_instance_item‘s, as this is where the graph-ds/rrd-ds mapping is stored, run the relevant ids through the map retained earlier.