I really feel like I looked everywhere and never found a decent how to on getting Ganglia set up on a pretty simple system and had to examine other people’s configs and just make guesses until I came up with something useful.
First a quick overview of the architecture and then we’ll walk through it with config examples.

This is the server where we are going to be aggregating the data, in the example
this is a development server. It not only aggregates the data from other nodes
but provides data for itself as well and as such it must run both gmetad and gmond.
Both of these servers are only reporting data for themselves and as such only need to run gmond.
A little bit of a weird naming scheme Ganglia has, basically gmetad can be thought of as the “server” in an architecture like the above, it’s purpose is to periodically query a list of hosts (“clusters”) and aggregate their data using RRDTool and make pretty graphs.
/* Example section of gmetad config for the Monitoring Server */ data_source "monitor" localhost data_source "db" 192.168.0.10 data_source "web" 192.168.0.11
This is sort of like the client in this architecture, it runs on every host you want to track. It is designed to be used for clusters and as such all the examples you see use multicast and expect there to be a bunch of hosts all sharing data. In this example, however, we are treating it like a single node that only provides the tracking data for host, itself.
This all seems straightforward until you look at the config and see “udpsend” and “udprecv” option, my first thought was that since I wasn’t talking to other servers I could just comment these directives out but that was wrong, they actually should be configured to send and receive from themselves.
/* Example section of the gmond config for all the servers */
/* Feel free to specify as many udp_send_channels as you like,
they specify who you push data out to, in this case the
only one specific is to push to itself at localhost */
udp_send_channel {
host = 127.0.0.1
port = 8649
}
/* You can specify as many udp_recv_channels as you like as well,
they specify the channel that you will listen for data on, in
this case the only one specified is for localhost */
udp_recv_channel {
port = 8649
bind = 127.0.0.1
}
/* These are the IPs allowed to query this server's current state */
tcp_accept_channel {
port = 8649
acl {
default = "deny"
access {
ip = 192.168.0.2 /* the ip of Monitoring Server */
mask = 32
action = "allow"
}
access {
ip = 127.0.0.1
mask = 32
action = "allow"
}
}
}
One small issue with this example config is that servers will report themselves at localhost, this can probably be dealt with by using the public interface for bind and host above, but that may also require setting up some additional firewall rules.