monasca-agent/monagent/collector/checks_d/postfix.py

71 lines
2.6 KiB
Python

import os
from monagent.collector.checks import AgentCheck
class PostfixCheck(AgentCheck):
"""This check provides metrics on the number of messages in a given postfix queue
WARNING: the user that dd-agent runs as must have sudo access for the 'find' command
sudo access is not required when running dd-agent as root (not recommended)
example /etc/sudoers entry:
dd-agent ALL=(ALL) NOPASSWD:/usr/bin/find
YAML config options:
"directory" - the value of 'postconf -h queue_directory'
"queues" - the postfix mail queues you would like to get message count totals for
"""
def check(self, instance):
config = self._get_config(instance)
directory = config['directory']
queues = config['queues']
dimensions = config['dimensions']
self._get_queue_count(directory, queues, dimensions)
@staticmethod
def _get_config(instance):
directory = instance.get('directory', None)
queues = instance.get('queues', None)
dimensions = instance.get('dimensions', {})
if not queues or not directory:
raise Exception('missing required yaml config entry')
instance_config = {
'directory': directory,
'queues': queues,
'dimensions': dimensions,
}
return instance_config
def _get_queue_count(self, directory, queues, dimensions):
for queue in queues:
queue_path = os.path.join(directory, queue)
if not os.path.exists(queue_path):
raise Exception('%s does not exist' % queue_path)
count = 0
if os.geteuid() == 0:
# dd-agent is running as root (not recommended)
count = sum(len(files) for root, dirs, files in os.walk(queue_path))
else:
# can dd-agent user run sudo?
test_sudo = os.system('setsid sudo -l < /dev/null')
if test_sudo == 0:
count = os.popen('sudo find %s -type f | wc -l' % queue_path)
count = count.readlines()[0].strip()
else:
raise Exception('The dd-agent user does not have sudo access')
# emit an individually tagged metric
dimensions.update({'queue': queue, 'instance': os.path.basename(directory)})
self.gauge('postfix.queue.size', count, dimensions=dimensions)
# these can be retrieved in a single graph statement
# for example:
# sum:postfix.queue.size{instance:postfix-2,queue:incoming,host:hostname.domain.tld}