summaryrefslogtreecommitdiffstats
path: root/doc/server/plugins/generators/tgenshi/ganglia.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/server/plugins/generators/tgenshi/ganglia.txt')
-rw-r--r--doc/server/plugins/generators/tgenshi/ganglia.txt174
1 files changed, 174 insertions, 0 deletions
diff --git a/doc/server/plugins/generators/tgenshi/ganglia.txt b/doc/server/plugins/generators/tgenshi/ganglia.txt
new file mode 100644
index 000000000..1ad737900
--- /dev/null
+++ b/doc/server/plugins/generators/tgenshi/ganglia.txt
@@ -0,0 +1,174 @@
+.. -*- mode: rst -*-
+
+.. _server-plugins-generators-tgenshi-ganglia:
+
+ganglia
+=======
+
+Another interesting example of **TGenshi** templating is to automatically
+generate ``gmond``/``gmetad`` configuration files. The idea is that each
+cluster is headless: it communicates with the rest of the cluster members
+on an isolated multicast IP address and port. Any of the cluster members
+is therefore isolated on that particular ip/port pair. Additionally,
+each ``gmond`` instance **also** listens on UDP. This allows for any of
+the cluster members to be polled for information on the entire cluster!
+
+The second part of the trick is in ``gmetad.conf``. Here, we dynamically
+generate a list of clusters (based on profiles names) and a list of
+members to poll (based on the clients in said profiles). As the number of
+profiles and client grows, this list will grow automatically as well. When
+a new host is added, ``gmetad`` will receive an updated configuration and
+act accordingly.
+
+There **is** one caveat though. The ``gmetad.conf`` parser is hard coded
+to read 16 arguments per ``data_source`` line. If you have more than 15
+nodes in a cluster, you will see a warning in the logs. You can either
+ignore it, or truncate the list to the first 15 members.
+
+In our environment, a profile is a one to one match with the role of
+that particular host. You can also do this based on groups, or any other
+client property.
+
+Bundler/ganglia.xml
+-------------------
+
+.. code-block:: xml
+
+ <Bundle name='ganglia' version='2.0' revision='$Revision$' origin='$HeadURL$' >
+ <Package name='ganglia-gmond' />
+ <Package name='ganglia-gmond-modules-python' />
+ <ConfigFile name='/etc/ganglia/gmond.conf' />
+ <Service name='gmond' />
+ <Action name='gmond-reload' />
+
+ <Group name='gmetad-server'>
+ <Package name='ganglia-gmetad'/>
+ <Package name='ganglia-web'/>
+ <Package name='rrdtool'/>
+ <ConfigFile name='/etc/ganglia/gmetad.conf' />
+ <Service name='gmetad' />
+ </Group>
+ </Bundle>
+
+Rules/services-ganglia.xml
+--------------------------
+
+.. code-block:: xml
+
+ <Rules priority='10' revision='$Revision$' origin='$HeadURL$' >
+ <Service name='gmond' type='chkconfig' status='on' />
+ <Group name='gmetad-server'>
+ <Service name='gmetad' type='chkconfig' status='on' />
+ </Group>
+ </Rules>
+
+TGenshi/etc/ganglia/gmetad.conf/template.newtxt
+-----------------------------------------------
+
+::
+
+ {% python
+ client_metadata = metadata.query.all()
+ profile_array = {}
+ seen = []
+ for item in client_metadata:
+ if item.profile not in seen:
+ seen.append(item.profile)
+ profile_array[item.profile]=[]
+ profile_array[item.profile].append(item.hostname)
+ seen.sort()
+ %}\
+
+ gridname "Our Grid"
+
+ {% for profile in seen %}
+ data_source "${profile}" \
+ {% for host in profile_array[profile] %}\
+ ${host} \
+ {% end %}\
+ {% end %}
+
+ rrd_rootdir "/var/lib/ganglia/rrds"
+
+TGenshi/etc/ganglia/gmond.conf/template.newtxt
+----------------------------------------------
+
+::
+
+ {% python
+ from genshi.builder import tag
+ import random
+ random.seed(metadata.profile)
+ last_octet=random.randint(2,254)
+ %}\
+ /*
+ $$Id$$
+ $$HeadURL$$
+ */
+
+ /* This configuration is as close to 2.5.x default behavior as possible
+ The values closely match ./gmond/metric.h definitions in 2.5.x */
+ globals {
+ daemonize = yes
+ setuid = yes
+ user = nobody
+ debug_level = 0
+ max_udp_msg_len = 1472
+ mute = no
+ deaf = no
+ host_dmax = 1800 /* 30 minutes */
+ cleanup_threshold = 604800 /*secs=1 week */
+ gexec = no
+ send_metadata_interval = 0
+ }
+
+ /* If a cluster attribute is specified, then all gmond hosts are wrapped inside
+ * of a <CLUSTER> tag. If you do not specify a cluster tag, then all <HOSTS> will
+ * NOT be wrapped inside of a <CLUSTER> tag. */
+ cluster {
+ name = "${metadata.profile}"
+ owner = "user@company.net"
+ latlong = "unspecified"
+ url = "unspecified"
+ }
+
+ /* The host section describes attributes of the host, like the location */
+ host {
+ location = "unspecified"
+ }
+
+ /* Feel free to specify as many udp_send_channels as you like. Gmond
+ used to only support having a single channel */
+ udp_send_channel {
+ host = ${metadata.hostname}
+ port = 8649
+ }
+ udp_send_channel {
+ mcast_join = 239.2.11.${last_octet}
+ port = 8649
+ ttl = 1
+ }
+
+ /* You can specify as many udp_recv_channels as you like as well. */
+ udp_recv_channel {
+ port = 8649
+ bind = ${metadata.hostname}
+ }
+ udp_recv_channel {
+ mcast_join = 239.2.11.${last_octet}
+ bind = 239.2.11.${last_octet}
+ port = 8649
+ }
+
+ /* You can specify as many tcp_accept_channels as you like to share
+ an xml description of the state of the cluster */
+ tcp_accept_channel {
+ port = 8649
+ }
+
+ /* Each metrics module that is referenced by gmond must be specified and
+ loaded. If the module has been statically linked with gmond, it does not
+ require a load path. However all dynamically loadable modules must include
+ a load path. */
+ modules {
+ /* [snip] */